android反编译apk文件以及如何防止代码被反编译_jddkdd2的博客-程序员秘密

技术标签: java  android  工具  dos  jar  class  Android  

防止反编译



作为Android应用开发者,不得不面对一个尴尬的局面,就是自己辛辛苦苦开发的应用可以被别人很轻易的就反编译出来。

Google似乎也发现了这个问题,从SDK2.3开始我们可以看到在android-sdk-windows\tools\下面多了一个proguard文件夹

proguard是一个java代码混淆的工具,通过proguard,别人即使反编译你的apk包,也只会看到一些让人很难看懂的代码,从而达到保护代码的作用。

在工程的"default.properties"中添加这样一句话“proguard.config=proguard.cfg”
 打包签名后的.apk就是混淆的,其实我们只要做一步就可以了就是在"default.properties"中添加这样一句话“proguard.config=proguard.cfg”就可以了。

如果想要更加复杂地混淆代码,可以详细地对该文件进行配置.




由于apk是Android虚拟机加载的,它有一定的规范,加密apk后Dalvik无法识别apk了。完全避免是不可能的,总有人能够破解你的代码。但是有几种

方式来提高被反编译取代码的难度:


1 关键代码使用jni调用本地代码,用c或者c++编写,因此相对比较难于反编译

2 混淆java代码。混淆是不改变代码逻辑的情况下,增加无用代码,或者重命名,使反编译后的源代码难于看懂。

 

    网上开源的java代码混淆工具较多,一般是用ant的方式来编译的


android 混淆文件proguard.cfg详解:

-injars  androidtest.jar【jar包所在地址】 
-outjars  out【输出地址】

-libraryjars    'D:\android-sdk-windows\platforms\android-9\android.jar' 【引用的库的jar,用于解析injars所指定的jar类】

 

-optimizationpasses 5
-dontusemixedcaseclassnames 【混淆时不会产生形形色色的类名 】
-dontskipnonpubliclibraryclasses 【指定不去忽略非公共的库类。 】
-dontpreverify 【不预校验】

-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 【优化】

-keep public class * extends android.app.Activity  【不进行混淆保持原样】
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService

-keep public abstract interface com.asqw.android.Listener{
public protected <methods>;  【所有方法不进行混淆】
}
-keep public class com.asqw.android{
public void Start(java.lang.String); 【对该方法不进行混淆】
}

-keepclasseswithmembernames class * { 【保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)】

native <methods>;
}

-keepclasseswithmembers class * { 【保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。】
public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class * extends android.app.Activity {【保护指定类的成员,如果此类受到保护他们会保护的更好 】
public void *(android.view.View);
}

-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {【保护指定的类文件和类的成员】
public static final android.os.Parcelable$Creator *;
}

反编译apk文件


安装ApkTool工具,该工具可以解码得到资源文件,但不能得到Java源文件。
安装环境:需要安装JRE1.6
1> 到http://code.google.com/p/android-apktool/下载apktool1.3.2.tar.bz2 和apktool-install-windows-2.2_r01-3.tar.bz2 文件。解压两个文件,然后把解压后的文件放在一起,如:c:\apktool
2> 在系统变量PATH中添加进aapt.exe,如:;c:\apktool\aapt.exe
3> 在DOS窗口下进入apktool.jar所在目录。执行DOS命令:apktool d -s c:\soft\xxx.apk c:\soft\source。
命令格式:apktool d [opts] <file.apk> [dir]  中的d代表解码,[opts]代表选项,-s选项代表不解码源文件。

Apktool工具只能反编译成smali的中间代码文件,这里需要借助另外一个开源工具Dex2Jar,该工具可以把dex文件转换成jar文件。这个工具不能直接翻译成java文件,但是可以把dex文件转换成jar文件
下载地址:http://code.google.com/p/dex2jar/。
 1> 把APK安装包中的classes.dex解压到某个目录下,如:c:\soft
 2> 在DOS窗口下进入dex2jar.bat所在目录,执行DOS命令:dex2jar.bat c:\soft\source\classes.dex c:\soft\source,命令生成classes.dex.dex2jar.jar文件。

安装jd-gui工具,该工具可以把jar文件反编译成Java源文件
下载地址:http://java.decompiler.free.fr/jd-gui/downloads/jd-gui-0.3.3.windows.zip。
运行该软件,直接打开classes.dex.dex2jar.jar文件即可看到java源代码。



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jddkdd2/article/details/7740056

智能推荐

ESP8266NodeMCU-手机端远程点灯_esp8266app下载_Jack_Cheng_2021的博客-程序员秘密

本节通过ESP8266NodeMCU连接到wifi,通过手机端app来打开和关闭灯。准备工作:1.手机端 下载【点灯blinker】软件,应用市场可以下载;2.Arduino安装了ESP8266库文件;如果没有安装库文件,参考以下步骤:打开Arduino软件,在【文件-首选项-附加开发板管理器网址】填入:https://arduino.esp8266.com/stable/package_esp8266com_index.json在【项目-加载库-管理库】,库管理器中搜索ESP8

python爬取网易云音乐_python爬取网易云音乐简单案例_weixin_39717692的博客-程序员秘密

首先找到想要下载的歌曲表单,例如:打开推荐点击推荐的歌曲表单接下来我们尝试爬取这个表单的全部歌曲名,及歌曲的MP3地址我使用fiddler4抓包工具抓取相关信息#encoding=utf8import requestsfrom bs4 import BeautifulSoupimport urllib.requestheaders = {'Referer':'http://music.163.co...

重识设计模式-命令模式(Command Pattern)_SimminonGarcia的博客-程序员秘密

本文已同步发表到我的技术微信公众号,扫一扫文章底部的二维码或在微信搜索 “程序员驿站”即可关注,不定期更新优质技术文章。同时,也欢迎加入QQ技术群(群号:650306310)一起交流学习!定义命令模式(Command Pattern):将一个请求封装为一个对象,从而让我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为...

静态变量、成员变量与局部变量的区别_日色冷的博客-程序员秘密

成员变量和局部变量的区别成员变量:①成员变量定义在类中,在整个类中都可以被访问。②成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中。③成员变量有默认初始化值。局部变量:①局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效。②局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放。③局部变量没有默认初始化值在使用变量时需要遵循的原则...

汇编之输入输出指令_汇编输出指令有哪些_6201小行星的博客-程序员秘密

汇编之输入输出指令输入输出指令in输入指令应用实例out输出指令应用举例输入输出指令在8086中,所有的I/O端口和CPU之间的通信都由IN和OUT完成。CPU只能用累加器(AL或AX)接收或发送信息。也就是说,8086中,CPU对外设的操作只能通过IN和OUT这两条专门的端口读写指令来实现。IN和OUT实际上是纯传数指令,可以传字节也可以传字。IN和OUT都是对CPU而言的IN是外设给CPU传数,OUT是CPU给外设传数。IN和OUT都不影响标识位。in输入指令外设地址有16位的也

架构演变过程_hongjake008的博客-程序员秘密

hongjake架构演变过程单体应用架构分流架构(nginx)SOA服务治理框架技术选型架构演变过程单体应用架构单体指单台服务器,是指一台服务器就能完成一个系统的搭建,并能满足需求系统。其一般表现形式为用户发出请求,经过业务系统计算之后,再向数据库查询或变更。这样的系统受制于系统的高并发设计和数据库的性能峰值。如果要再提升性能,就需要加机器解决,但加机器解决问题的同时也会造成不少的问题,后...

随便推点

《MFC&Qt混合编程》 part1 MFC对话框中嵌入Qt窗口控件_qmfcapp_梁Rio的博客-程序员秘密

《MFC&Qt混合编程》 part1 MFC对话框中嵌入Qt窗口控件1、环境配置:VS2010,Qt4.8.4_win64,Qt_VS_Addin_1.1.112、创建的MFC对话框程序3、输出为x64的debug&release程序准备工作:下载QtMigration文件http://download.csdn.net/download/power_YQ/

在Vmware workstation 10中安装 archlinux-2013.12.01-dual_siperbob的博客-程序员秘密

最近看到很多人推崇Arch,推荐的理由也很简单,相对来说Arch Linux更加适合于进阶,而不是仅仅的玩玩而已,由于有大量完备的文档,所以很多人推荐进阶Linux的开发者试试。在好奇的驱使下,就去试着在Vmware workstation 10里面安装,由于没有了setup,只能自己摸索安装过程,还好在youtube上有一个全程安装视频可以参照,即便如此,也是困难重重,比如由于分区时没有设置bo

PE框架学习_weixin_34242331的博客-程序员秘密

PE开发基础:开发平台PowerEngine:开发新功能:业务逻辑处理:1、Transaction:交易2、Chain:链、责任链3、Command:命令4、Template:模板5、Action:动作PE交易处理流程:无论一个交易的发送渠道是HTTP还是TCP,最终针对每一个渠道的Adapter会将请求的Form(HTTP)或报文(TCP)转换成与渠道无关的Context...

maxleng的专栏(正在研究Android)_victoryckl的博客-程序员秘密

一些学习android的好文章 http://blog.csdn.net/maxleng?viewmode=contents 一个程序员眼中的团队原型思考(3)---- 个体的孤独和团队的力量2010-07-25 22:03 阅读(4038)评论(69)一个程序员眼中的团队原型思考(2)---个体的孤独和团队的力量2010-07-25 21:

视觉SLAM十四讲——第十二讲:回环检测_回环检测的主要目的_chenying66的博客-程序员秘密

@ 《视觉SLAM十四讲》知识点与习题《视觉SLAM十四讲》第十二讲知识点整理+习题正在学习SLAM相关知识,将一些关键点及时记录下来。知识点整理回环检测的目的在于使得机器人可以判断是否之前运动到过当前位置,目的在于构建全局一致的地图回环检测:可以给出除了相邻帧之外的时隔更加久远的约束,它关系到估计的轨迹和地图在长时间下的正确性。且可以在跟踪算法丢失之后,利用回环检测进行重定位基于外...

在腾讯的八年,我的职业思考_枫哥和java的博客-程序员秘密

点击上方“java大数据修炼之道”,选择“置顶”公众号优秀学习资源、干货第一时间送达!精彩推荐●Java日志性能那些事●学习Java需吃透这些基本概念●BAT 大企内部面...

推荐文章

热门文章

相关标签