關(guān)于如何對Android代碼進(jìn)行混淆的教程
apk直接可以 解壓,然后很容易的就可以反編譯出.java,找了找,果然,這一切只不過是 一分鐘的事兒:
1、得到classes.dex文件;直接用你機(jī)器上的解壓軟件打開.apk 文件,解壓出 classes.dex 文件。
2、還原.jar文件;這一步需要用到一個(gè)工具 dex2jar (谷歌的代碼庫里有 http://code.google.com/p/dex2jar/)
下載完了,解壓,然后把***步的 產(chǎn)物(即那個(gè)classes.dex文件)放到 dex2jar的解壓目錄里。
cmd命令行,目錄切換到dex2jar的目錄下:
“ dex2jar.bat classes.dex”
看到命令行的 “Done” 之后, dex2jar文件夾里 就會有“classes.dex.dex2jar.jar” 文件了,這個(gè)就是傳說中的jar包了。
3、查看.jar文件;這一步就是傳統(tǒng)的反編譯了,需要工具輔助,我這里用到的工具是jd-gui(http://java.decompiler.free.fr/?q=jdgui)
下載你的系統(tǒng)對應(yīng)的版本、解壓,你會看到一個(gè).exe文件,雙擊,選擇第二步生成的.jar, 好吧,你的項(xiàng)目是不是完全還原了呢?
非常簡單的步驟就能讓代碼暴露。
那么,如何對我們的代碼混淆呢?
新建一個(gè) 2.3.3的項(xiàng)目,你會看到項(xiàng)目文件里有一個(gè)proguard.cfg 文件,google已經(jīng)幫我們做了這么多事,可惜是從2.3開始的,那我 悲催的項(xiàng)目(基于2.2的sdk) 該如何是好?
呵呵,其實(shí)不用,你只要 把 proguard.cfg 文件 拷貝到 你的 舊項(xiàng)目里就好了。
當(dāng)然這樣還不夠,因?yàn)?google是默認(rèn)不混淆項(xiàng)目的:
To enable ProGuard so that it runs as part of an Ant or Eclipse build, set the proguard.config property in the <project_root>/default.properties file. The path can be an absolute path or a path relative to the project's root.
google 告訴我們 還要 配置 default.properties.
嗯,把 proguard.config=proguard.cfg 加上,好了,再次生成 新的 .apk文件,然后用上面的方法 反編譯你的 項(xiàng)目,你會看到 aa bb cc 的包、aa bb cc 的類 和 aa bb cc 的變量名,方法名.
再看看 proguard.cfg 文件
- -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 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 *;
- }
這里是 google默認(rèn)不混淆 Activity 、Service類的子類, 正如上面的截圖中看到的 所有activity的子類名稱是被保留的。想自定義混淆細(xì)節(jié)的話就琢磨琢磨這個(gè)配置文件吧!~