編譯
將java代碼轉(zhuǎn)換為Dalvik字節(jié)碼
將res資源文件、AndroidManifest.xml等配置文件編譯為二進制文件
反編譯
將DEX文件轉(zhuǎn)換為jar包或者Smali文件
將二進制資源文件還原為資源源碼文件
工具:
1. ApkTool https://ibotpeaches.github.io/Apktool
- 反編譯dex為smali文件
- 反編譯資源文件
-
支持重打包
apktool示例
2. dex2jar https://github.com/pxb1988/dex2jar

dex2jar示例
3. jd-gui http://jd.benow.ca/
源碼閱讀工具

jd-gui示例
應(yīng)用安全與反編譯
1.Android應(yīng)用反編譯的威脅
- 逆向分析:漏洞挖掘、協(xié)議分析
- 二次打包:盜版、破解
2.保護方案
- 代碼混淆:java代碼、C/C++代碼、JS/HTML代碼
- 應(yīng)用加固:DEX文件、SO文件、資源文件
3.應(yīng)用開發(fā)安全生態(tài)鏈

應(yīng)用開發(fā)安全生態(tài)鏈
- 開發(fā)階段:代碼混淆,接入安全類sdk
- 測試審計階段:提交到審計平臺
- 上架階段:進行代碼加固
- 運營階段:收集信息
DEX加固方案與原理
1. DEX加固方案演進(文件級--方法級--指令級)

dex加固方案演進
2. DEX內(nèi)存加載實現(xiàn)原理
- 框架原理:
Android加殼框架原理為:Proxy/Delegate Application,即使用自定義的代理Application類作為程序入口(修改AndroidManifest.xml),在代理Application中完成殼的解密操作,最后啟動原來的Application
- ProxyApplication:框架會提供一個ProxyApplication抽象基類,使用者需要繼承這個類,并重載其initProxyApplication()方法,在其中改變surrounding,如替換ClassLoader等
- DelegateApplication:即應(yīng)用原有的Application,應(yīng)用從getApplicationContext()等方法中取到的都是DelegateApplication
//old AndroidManifest.xml
<application
android:name=".MyApplication"
android:icon="@drawable/icon"
android:label="@string/app_name">
//new AndroidManifest.xml
<application
android:name=".MyProxyApplication"
android:icon="@drawable/icon"
android:label="@string/app_name">
public abstract class ProxyApplication extends Application{
/**
* initProxyApplication實現(xiàn)內(nèi)容
* 1.內(nèi)存加載DEX:加載原Application
* 2. ClassLoader設(shè)置
* 3. Application引用替換
**/
protected abstract void initProxyApplication();
@Override
protected void attachBaseContext(Context context){
super.attachBaseContext(context);
initProxyApplication();
}
//...
}
殼啟動流程
- 內(nèi)存加載DEX文件:通過Dalvik、ART虛擬機JNI接口內(nèi)存加載被加密隱藏的DEX文件
- 設(shè)置ClassLoader:將DEX文件內(nèi)存加載產(chǎn)生的mCookie放入ClassLoader中(MutiDex)
- 加載原Application:基于替換后的ClassLoader查找原始Application類并生成實例
- Application還原:將換API層的所有Application引用替換為原始Application

殼啟動流程


DEX加固效果(內(nèi)存加載方案)
3. 加殼方案
https://github.com/AndyGu/ProtectApp
4. 如何制定某個類在main dex中?
- multiDexKeepFile:手動加入要放到Main.dex中的類
com.umeng,analytics.Abb.class - multiDexKeepProguard:以Proguard的方式手動加入要放到main.dex中的類
-keep public class com.tencent.bugly.**{*};
| 知識點 | 面試體系 |
|---|---|
| 熟練掌握Java IO相關(guān)代碼 | Java語言進階 RandomAccessFile |
| 深入研究Android apk的啟動流程 | 精通Android FrameWork層 |
| 精通Multidex文件加載機制,精通類加載機制 | 精通Android FrameWork層,JVM,DVM ClassLoader |
| 明確dex文件的基本構(gòu)造,了解dex文件相關(guān)源碼 | 精通Android FrameWork層dex |
| APK打包的基本流程需要理解 | Gradle工具熟練 |
| 掌握C/C++語言及NDK開發(fā) | 精通C/C++語言及NDK開發(fā) |
