Android Apk的反编译与代码混淆
一、反编译
1.获取工具:
既然是反编译,肯定要用到一些相关的工具,工具可以到这里下载,里面包含三个文件夹,用于反编译,查看反编译之后的代码;
其实这两工具都是google官方出的,也可在google
code上下载 dex2jar,apktool;
2-1.反编译获取Java源代码:
将要反编译的apk文件后缀改为zip并解压,得到classes.dex,它就是java文件编译再通过dx工具打包而成的,将classes.dex复制到apk2java目录下的dex2jar-0.0.9.9文件夹;在命令行下进入dex2jar-0.0.9.9文件夹,输入命令:dex2jar.bat
classes.dex,会生成一个jar文件classes_dex2jar.jar,用工具包中jdgui工具即可查看代码;
2-2.反编译获取程序的源代码和图片、XML配置、语言资源等文件:
打开apk2java文件夹,进入apktool1.4.1,里面有三个文件aapt.exe,apktool.bat,apktool.jar;
在命令行下定位到apktool1.4.1文件夹,输入命令:apktool.bat
d abc123.apk abc123;后两个参数分别是apk所在位置,反编译后代码存放位置;下面是我反编译QQ得到的AndroidManifest.xml文件的内容,输入命令为:apktool.bat
d c:\qq.apk c:\qq;
3.图形化反编译:
在工具包中,还有一个文件夹Androidfby,里面包含两个图形化反编译工具,其本质上就是对dex2jar和apktool两个工具进行了一层包装,使之有一个图形化的操作界面;
二、代码混淆
前面说了反编译,我们当然不希望我们的应用被别人反编译,所以就得在打包的时候进行代码混淆,这样的包也可反编译出代码,但是代码的可读性很低,从而达到保护代码的目的;
在我们新建的项目中,都有一个proguard-project.txt文件,默认里面是没有任何配置的,只有一些说明性的注释文字;我们就是能过它,来进行代码混淆的,首先需要为该文件添加需要混淆的代码说明;
-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 -keepclasseswithmembernames class * { native <methods>; } -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; }
最后,在project.properties文件中,添加对proguard-project.txt文件的引用:proguard.config=proguard-project.txt
1。当程序中有使用第三方jar包时,常常需要过滤掉反射的R文件及jar包,以及防止读取jar包是出现读取错误、防止因为警告导致打包不成功等等问题;
-keep class **.R$* { *; } 过滤R文件
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。