DEX加固與反編譯

編譯

將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中?
  1. multiDexKeepFile:手動加入要放到Main.dex中的類
    com.umeng,analytics.Abb.class
  2. 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ā)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容