反编译及防反编译
自己辛辛苦苦写的软件发现被别的无良程序员copy,更可恨的是还发布到市场,让自己的劳动成果及产品受到莫名的伤害,很可耻,so,我们还是先学习下反编译的原理,分析下如何才能防止别人反编译自己的软件。
一、如何反编译?
一、下载apktool,反编译资源文件,可以获得项目各个dpi图片,及媒体文件,可看到AndroidManifest.xml配置文件
1、下载地址http://code.google.com/p/android-apktool/downloads/list,下载apktool1.5.2.tar.bz2,apktool-install-linux-r05-ibot.tar.bz2
2、apktool1.5.2.tar.bz2存放的是apktool.jar源码,把源码放入解压后的apktool-install-linux-r05-ibot.tar.bz2中,此时该文件夹包括apktool.jar,aapt,apktool
3、./apktool d xxx.apk,生成以下:
AndroidManifest.xml apktool.yml assets lib res smali
二、下载dex2jar,反编译java代码
1、下载地址:http://code.google.com/p/dex2jar/downloads/list
2、./dex2jar.sh classes.dex(原apk中的文件),生成classes_dex2jar.jar
三、下载jd-gui , 如何代码未保护,可以看到完完整整的java源代码
1、下载地址:http://jd.benow.ca/
2、./jd-gui 打开后导入classes_dex2jar.jar,然后保存源文件
反编译工具打包下载(解压密码:android):
http://download.csdn.net/detail/chang_xing/7140825
二、如何防止别人反编译呢 ?
一、利用android官方给出的方法,代码混淆。(主要用到两个文件project.properties和proguard-project.txt)
1、在项目下project.properties文件中做以下修改
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
2、修改后编译发布后,利用上面步骤反编译apk查看,发现项目下全面文件都被混淆了
怎么配置项目混淆度呢?用的了proguard-project.txt(在老版本中,创建项目的时候,会给出proguard.cfg,但是在的新版中创建项目则不会有任何提示。这个时候需要只要将proguard.cfg的内容加入到proguard-project.txt中,再根据自己的需要进行编辑即可)。
如下作用:
从脚本中可以看到,混淆中保留了继承自Activity、Service、Application、BroadcastReceiver、ContentProvider等基本组件以及com.android.vending.licensing.ILicensingService,
并保留了所有的Native变量名及类名,所有类中部分以设定了固定参数格式的构造函数,枚举等等。(详细信息请参考<proguard_path>/examples中的例子及注释。)
-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 *; }