【Android 應用開發】 Android APK 反編譯 混淆 反編譯后重編譯
來源:程序員人生 發布時間:2014-12-12 08:54:59 閱讀次數:3160次
反編譯工具 : 總結了1下 linux, windows, mac 上的版本, 1起放到 CSDN 上下載;
-- CSDN 下載地址 : http://download.csdn.net/detail/han1202012/8221787
octopus@octopus:~/decompiler$ tree -L 2
.
├── linux
│ ├── apktool
│ ├── dex2jar-0.0.9.15
│ └── jd-gui
├── mac
│ ├── apktool
│ ├── dex2jar-0.0.9.15
│ └── jd-gui-0.3.5.osx.i686.dmg
├── windows
│ ├── apkTool
│ ├── dex2jar-0.0.9.15
│ └── jd-gui.exe
└── 源碼
└── apktool-source.zip
10 directories, 4 files
1. 反編譯 至 Java 源碼
1. 工具介紹
dex2jar 簡介 : 將 .dex 或 .class 后綴文件轉換成 .jar 文件;
-- 最新版本 : 目前最新版本 0.0.9.15;
-- 官方地址 (需要翻墻) : http://code.google.com/p/dex2jar/ ;
-- 下載地址 (需要翻墻) : http://code.google.com/p/dex2jar/downloads/list;
jd-gui 簡介 : 使用該工具可以查看 .jar 中的 java 代碼;
-- 官網地址 : http://jd.benow.ca/ ;
2. 反編譯進程
(1) Ubuntu 系統反編譯
a. 獲得 .dex 后綴文件 : 修改 apk 文件后綴, 獲得 class.dex 文件;

b. 履行反編譯 : 將 classes.dex 拷貝到 dex2jar 目錄下, 履行 ./d2j-dex2jar.sh classes.dex 命令;
-- 履行結果 :
octopus@octopus:~/decompiler/linux/dex2jar-0.0.9.15$ ./d2j-dex2jar.sh classes.dex
dex2jar classes.dex -> classes-dex2jar.jar
c. jd-gui 中查看源碼 : 將 classes-dex2jar.jar 文件拖入 jd-gui 中, 查看源碼;

3. 混淆代碼
注意 : 如果不使用簽名文件進行打包的話, 直接從 eclipse 中拷貝的文件是沒法混淆的;
(1) 配置混淆文件
編輯 progard.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 * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
# 所有類中的 native 方法不混淆
-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);
}
# 保存 Activity 子類
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
# 對枚舉類型enum的全部類的下面指定方法的方法名不進行混淆
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
# 實現了 Parcelable 序列化接口的類不混淆
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
-- project.properties 配置混淆文件 :
target=android⑴9
proguard.config=proguard.cfg
(2) 打包 apk 文件 (創建新的 keystore)
a. 設置打包項目 : 右鍵點擊工程 選擇 Android Tools --> Export Signed Application Package 選項, 彈出以下對話框, 選擇要打包的程序, 設置好后點擊 Next;

b. 創建 keystore : 選擇 Create new keystore, 選擇1個文件, 然后設置 keystore 的用戶名 和 密碼;
-- Location : keystore 文件;
-- Password : 密碼;
-- Confirm : 確認密碼, 重新輸入密碼;

c. 輸入 keystore 詳細信息 :
-- Alias : 別名;
-- Password : 別名密碼;
-- Confirm : 確認密碼;
-- Validity(years) : 有效期限, 推薦 25 年;
-- First and Last Name : 開發者姓名;
下面的參數可以不填寫
-- Orgnizational Unit : 組織名稱;
-- Orgnization : 組織;
-- City or Location : 城市;
-- State or Provience : 省 或 州;
-- Country Code : 國家;

d. 選擇 apk 文件并打包 : 點擊 finish 按鈕后打包終了;

(3) 打包 apk 文件 (使用現有的 keystore 文件)
a. 選擇打包的工程 : 右鍵點擊工程, 選擇 Android Tools --> Export Signed Application Package 選項;

b. 選擇簽名文件 : 輸入簽名文件密碼;

c. 輸入別名密碼 :

d. 打包 apk : 選擇要打包的 apk 文件 :

(4) 驗證混淆效果
反編譯 : 將 apk 文件后綴改成 .zip, 以后取出 classes.dex 文件 到 dex2jar 根目錄中, 履行 ./d2j-dex2jar.sh classes.dex 命令;
octopus@octopus:~/decompiler/linux/dex2jar-0.0.9.15$ ./d2j-dex2jar.sh classes.dex
dex2jar classes.dex -> classes-dex2jar.jar
在 jd-gui 中查看 Java 代碼 :

2. Apktools 反編譯
1. Apktools 介紹
Apktools 簡介 :
-- 最新版本 : 2.0.0 ;
-- 官方網站 (需要翻墻) : https://code.google.com/p/android-apktool/ ;
-- 新版本下載地址 : https://bitbucket.org/iBotPeaches/apktool/downloads ;
-- 老版本下載地址 (需要翻墻) : https://code.google.com/p/android-apktool/downloads/list ;
需要下載的文件 :
-- apktool jar 包 : apktool1.5.2.tar.bz2
-- apktool 引導工具 (Linux) : apktool-install-linux-r05-ibot.tar.bz2
-- apktool 引導工具 (mac) : apktool-install-macosx-r05-ibot.tar.bz2
-- apktool 引導工具 (wondows) : apktool-install-windows-r05-ibot.tar.bz2
2. 反編譯
將下載的文件放到1個文件中 :

反編譯 : 將 apk 文件放入上面的目錄, 履行命令 ./apktool d WheelView.apk ;
-- 反編譯進程 :
octopus@octopus:~/decompiler/linux/apktool$ ./apktool d WheelView.apk
I: Baksmaling...
I: Loading resource table...
I: Loaded.
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: /home/octopus/apktool/framework/1.apk
I: Loaded.
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Done.
I: Copying assets and libs...
octopus@octopus:~/decompiler/linux/apktool$ ls
aapt apktool apktool.jar WheelView WheelView.apk
--
反編譯結果 : 反編譯結果都在 WheelView 目錄中, res 中是相干資源文件, smali 中是 smali 匯編文件;

3. 重新編譯
重新編譯命令格式 : ./apktool b apk源目錄 apk文件名稱;
-- 履行命令 : ./apktool b WheelView WheelView1.apk , 可以生成 WheelView1.apk 文件;
octopus@octopus:~/decompiler/linux/apktool$ ls
aapt apktool apktool.jar WheelView WheelView.apk
octopus@octopus:~/decompiler/linux/apktool$ ./apktool b WheelView WheelView1.apk
I: Checking whether sources has changed...
I: Smaling...
I: Checking whether resources has changed...
I: Building resources...
I: Building apk file...
octopus@octopus:~/decompiler/linux/apktool$ ls
aapt apktool apktool.jar WheelView WheelView1.apk WheelView.apk
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈