【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 使用 DexClassLoader 获取组件类失败 | 失败原因分析 | 自定义类加载器没有加载组件类的权限 )
生活随笔
收集整理的這篇文章主要介紹了
【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 使用 DexClassLoader 获取组件类失败 | 失败原因分析 | 自定义类加载器没有加载组件类的权限 )
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、使用 DexClassLoader 獲取組件類失敗報錯
- 二、失敗原因分析
一、使用 DexClassLoader 獲取組件類失敗報錯
在上一篇博客 【Android 逆向】啟動 DEX 字節碼中的 Activity 組件 ( DEX 文件準備 | 拷貝資源目錄下的文件到內置存儲區 | 配置清單文件 | 啟動 DEX 文件中的組件 | 執行結果 ) 中 , 嘗試啟動 DEX 字節碼文件中的 Activity 組件 , 出現如下報錯信息 :
2021-12-12 01:02:01.431 25158-25158/? E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.example.classloader_demo, PID: 25158java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.classloader_demo/com.example.dex_demo.MainActivity2}: java.lang.ClassNotFoundException: Didn't find class "com.example.dex_demo.MainActivity2" on path: DexPathList[[zip file "/data/app/com.example.classloader_demo-sAY0kit-c9kqTzgMRXYoBA==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.classloader_demo-sAY0kit-c9kqTzgMRXYoBA==/lib/arm64, /system/lib64]]at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2881)at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3086)at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816)at android.os.Handler.dispatchMessage(Handler.java:106)at android.os.Looper.loop(Looper.java:193)at android.app.ActivityThread.main(ActivityThread.java:6718)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.dex_demo.MainActivity2" on path: DexPathList[[zip file "/data/app/com.example.classloader_demo-sAY0kit-c9kqTzgMRXYoBA==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.classloader_demo-sAY0kit-c9kqTzgMRXYoBA==/lib/arm64, /system/lib64]]at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)at java.lang.ClassLoader.loadClass(ClassLoader.java:379)at java.lang.ClassLoader.loadClass(ClassLoader.java:312)at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:69)at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45)at android.app.Instrumentation.newActivity(Instrumentation.java:1215)二、失敗原因分析
使用 DexClassLoader 加載普通的類 com.example.dex_demo.DexTest 并執行器 test() 方法 , 是可以執行成功的 ; 但是加載 Activity 組件類失敗了 ;
其中的最主要原因是 , 類加載器的雙親委派機制 , 加載 Android 組件類需要使用系統指定的類加載器 , 這些類加載器設置在 LoadedApk 實例對象中 , 并且這些類加載器只能從特定位置加載字節碼文件 ;
自己自定義的 DexClassLoader 沒有加載組件類的權限 ;
如果要加載組件類 , 有兩種方案 :
- 替換類加載器 : 使用自定義的 DexClassLoader 類加載器替換 ActivityThread 中的 LoadedApk 中的類加載器 , 將原來的 LoadedApk 中的類加載器設置為新的父節點類加載器 ;
- 插入類加載器 : 基于雙親委派機制 , 只要將我們自定義的類加載器插入到系統類加載器之上就可以 , 在 組件類加載器 和 最頂層的啟動類加載器之間插入自定義的 DexClassLoader 類加載器即可 ;
總結
以上是生活随笔為你收集整理的【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 使用 DexClassLoader 获取组件类失败 | 失败原因分析 | 自定义类加载器没有加载组件类的权限 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 逆向】加壳的 Andr
- 下一篇: 【错误记录】Android 应用运行报错