編譯
將java代碼轉(zhuǎn)換為Dalvik字節(jié)碼
將res資源文件、AndroidManifest.xml等配置文件編譯為二進(jìn)制文件
反編譯
將DEX文件轉(zhuǎn)換為jar包或者Smali文件
將二進(jìn)制資源文件還原為資源源碼文件
工具:
1. ApkTool https://ibotpeaches.github.io/Apktool
- 反編譯dex為smali文件
- 反編譯資源文件
-
支持重打包
2. dex2jar https://github.com/pxb1988/dex2jar
3. jd-gui http://jd.benow.ca/
源碼閱讀工具
應(yīng)用安全與反編譯
1.Android應(yīng)用反編譯的威脅
- 逆向分析:漏洞挖掘浮梢、協(xié)議分析
- 二次打包:盜版滨嘱、破解
2.保護(hù)方案
- 代碼混淆:java代碼痹兜、C/C++代碼、JS/HTML代碼
- 應(yīng)用加固:DEX文件、SO文件、資源文件
3.應(yīng)用開發(fā)安全生態(tài)鏈
- 開發(fā)階段:代碼混淆豪治,接入安全類sdk
- 測試審計階段:提交到審計平臺
- 上架階段:進(jìn)行代碼加固
- 運營階段:收集信息
DEX加固方案與原理
1. DEX加固方案演進(jìn)(文件級--方法級--指令級)
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虛擬機(jī)JNI接口內(nèi)存加載被加密隱藏的DEX文件
- 設(shè)置ClassLoader:將DEX文件內(nèi)存加載產(chǎn)生的mCookie放入ClassLoader中(MutiDex)
- 加載原Application:基于替換后的ClassLoader查找原始Application類并生成實例
- Application還原:將換API層的所有Application引用替換為原始Application
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.**{*};
知識點 | 面試體系 |
---|---|
熟練掌握J(rèn)ava IO相關(guān)代碼 | Java語言進(jìn)階 RandomAccessFile |
深入研究Android apk的啟動流程 | 精通Android FrameWork層 |
精通Multidex文件加載機(jī)制,精通類加載機(jī)制 | 精通Android FrameWork層遣蚀,JVM,DVM ClassLoader |
明確dex文件的基本構(gòu)造纱耻,了解dex文件相關(guān)源碼 | 精通Android FrameWork層dex |
APK打包的基本流程需要理解 | Gradle工具熟練 |
掌握C/C++語言及NDK開發(fā) | 精通C/C++語言及NDK開發(fā) |