【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 | Instrumentation 源码分析 )
文章目錄
- 一、Instrumentation 源碼分析
- 二、Instrumentation 創建 Application 相關的部分源碼
dex 解密時 , 需要將 代理 Application 替換為 真實 Application ; 替換 Application 首先要理解系統如何注冊應用的 Application 的 ;
一、Instrumentation 源碼分析
Instrumentation.java 類參考源碼 : 6.0.1_r16/xref/frameworks/base/core/java/android/app/Instrumentation.java 常用方法 :
- newActivity : 創建 Activity ;
- newApplication : 創建 Application ;
- sendKeyDownUpSync : 模擬按鍵 ;
上一篇博客中講解了 LoadedApk 中調用 makeApplication 方法創建應用的 Application , 在該方法中通過調用 Instrumentation 的 newApplication 方法創建 Application ;
在 Application newApplication(ClassLoader cl, String className, Context context) 中 , 調用了其重載函數 Application newApplication(Class<?> clazz, Context context) , 前者包含 333 個參數 , 后者包含 222 個參數 ;
public Application newApplication(ClassLoader cl, String className, Context context)throws InstantiationException, IllegalAccessException, ClassNotFoundException {return newApplication(cl.loadClass(className), context);}完整源碼參考 : 6.0.1_r16/xref/frameworks/base/core/java/android/app/Instrumentation.java
在 Application newApplication(Class<?> clazz, Context context) 函數中就執行了兩行代碼 , 調用 clazz.newInstance() 反射創建 Application 對象 , 然后調用 Application 的 attach 函數 , 傳入 Context 上下文對象 ;
static public Application newApplication(Class<?> clazz, Context context)throws InstantiationException, IllegalAccessException, ClassNotFoundException {Application app = (Application)clazz.newInstance();app.attach(context);return app;}完整源碼參考 : 6.0.1_r16/xref/frameworks/base/core/java/android/app/Instrumentation.java
Application 的 void attach(Context context) 方法中 , 調用了 attachBaseContext(context) 方法 , 由此可以看出在 Application 中 , attachBaseContext 函數要比 onCreate 先執行 ;
在 Application 使用反射方法創建出來之后 , 馬上就會調用 attach 方法 , 進而先調用 attachBaseContext 方法 ;
public class Application extends ContextWrapper implements ComponentCallbacks2 {/*** @hide*//* package */ final void attach(Context context) {attachBaseContext(context);mLoadedApk = ContextImpl.getImpl(context).mPackageInfo;} }源碼參考 : xref/frameworks/base/core/java/android/app/Application.java
二、Instrumentation 創建 Application 相關的部分源碼
public class Instrumentation {/*** Perform instantiation of the process's {@link Application} object. The* default implementation provides the normal system behavior.* * @param cl The ClassLoader with which to instantiate the object.* @param className The name of the class implementing the Application* object.* @param context The context to initialize the application with* * @return The newly instantiated Application object.*/public Application newApplication(ClassLoader cl, String className, Context context)throws InstantiationException, IllegalAccessException, ClassNotFoundException {return newApplication(cl.loadClass(className), context);}/*** Perform instantiation of the process's {@link Application} object. The* default implementation provides the normal system behavior.* * @param clazz The class used to create an Application object from.* @param context The context to initialize the application with* * @return The newly instantiated Application object.*/static public Application newApplication(Class<?> clazz, Context context)throws InstantiationException, IllegalAccessException, ClassNotFoundException {Application app = (Application)clazz.newInstance();app.attach(context);return app;} }
完整源碼參考 : 6.0.1_r16/xref/frameworks/base/core/java/android/app/Instrumentation.java
總結
以上是生活随笔為你收集整理的【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 | Instrumentation 源码分析 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 安全】DEX 加密 (
- 下一篇: 【Android 安全】DEX 加密 (