反編譯及防反編譯
自己辛辛苦苦寫的軟件發現被別的無良程序員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 *; }