转:https://bbs.pediy.com/thread-226428.htm
1. 直接定位在 linker 的 dlsym 中设断点,看:
Message("load so: [%s|%s]\n", get_string(get_reg_value("R0")),get_string(get_reg_value("R1")));
if ( get_string(get_reg_value("R0")) == "libshell.so" && get_string(get_reg_value("R1")) == "JNI_OnLoad")
此时so文件已经初步解密,并且 JNI_OnLoad 是可用的
trace 到 :
debug136:F387B994 LDR R1, =(aComTencentStub_0 - 0xF387B99E)
debug136:F387B996 LDR R2, =(dword_F3896004 - 0xF387B9A0)
debug136:F387B998 PUSH {R4,LR}
debug136:F387B99A ADD R1, PC ; "com/tencent/StubShell/TxAppEntry"
debug136:F387B99C ADD R2, PC ; dword_F3896004
debug136:F387B99E MOVS R3, #5
debug136:F387B9A0 BL sub_F387B950
debug136:F387B9A4 SUBS R4, R0, #0
debug136:F387B9A6 BNE loc_F387B9B8
debug136:F387B9A8 LDR R1, =(aSecshell - 0xF387B9B2)
debug136:F387B9AA LDR R2, =(aRegisternative - 0xF387B9B4)
debug136:F387B9AC MOVS R0, #3
debug136:F387B9AE ADD R1, PC ; "SecShell"
debug136:F387B9B0 ADD R2, PC ; "registerNatives Fail"
debug136:F387B9B2 BL android_log
debug136:F387B9B6 B loc_F387B9BA
dword_F3896004 是一个method结构体,里面第一个是 native load 方法 设置断点
2. 调用 native load 的时候, 对 libart.so OpenMemory 进行拦截, 其中的参数 r1, r2 分别的解密后 dex 的地址和大小, dump 出来即可