第一步:将手机的 /system/lib/libart.so 文件拷贝出来.
注:↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
5.0以下的系统是/system/lib/libdvm.so
5.0级5.0以上的是/system/lib/libart.so
adb pull /system/lib/libart.so C:\Users\Administrator\Desktop
第二步:使用IDA静态分析libart.so文件,找到进入JNI_OnLoad上函数的汇编代码
(1)
(2)
(3)
(4)JNIO_OnLoad地址值给了R12,接下来紧盯R12即可(dlsym是安卓系统函数,返回的是JNI_OnLoad的地址,各系统版本源码略有差异,具体参考安卓系统源码)
此时,记住BLX R12这个汇编代码的地址: 24A61E ,然后回到LoadNativeLibrary这个函数的起始位置,获取它的起始地址(上述的汇编代码均是这个LoadNativeLibrary函数的内容)
(5) 取得这两个地址后,计算偏移: 24A61E - 24A188 = 0x496
第三步:使用IDA动态调试启动APP,通过偏移得到进入JNI_OnLoad函数的位置
(1)
(2)
(3)
(4)设置断点
(5)当运行到断点这个位置是,F7进入便可看到JNI_OnLoad函数,能看到OnLoad函数即表示dex文件已加载完毕
(6)dex文件加载完毕后,我们可通过OpenMemory..设断读取dump出dex
(7)
(8) Shift + F2打开执行脚本界面,输入脚本
static main(void)
{
auto fp, dexAddress, end, size;
dexAddress = 0xB3AA11F0;
size = 0x4F0;
end = dexAddress + size;
fp = fopen("C:\\Users\\Administrator\\Desktop\\1.so", "wb");
for ( ; dexAddress < end; dexAddress++ )
fputc(Byte(dexAddress), fp);
}
完!