本文最后更新于 165 天前,其中的信息可能已经有所发展或是发生改变。
遇到一个app,叫wakeup课程表,注入frida后,frida会停止但是app正常运行

如何定位校验代码?我选择hook dlopen ext来监控so的加载,当执行包含检测代码的so时,app就会让frida退出
多次执行hook代码,发现app总是在加载libmsaoaidsec.so后frida退出。

将目标so拖入idapro反编译,查找jnionload
jint JNI_OnLoad(JavaVM *vm, void *reserved)
{
jint v4; // w19
int v5; // w0
__int64 v6; // x8
int *v7; // x23
const char *v8; // x0
void (__fastcall *v10)(JavaVM *, void *); // [xsp+8h] [xbp-48h] BYREF
__int64 v11[2]; // [xsp+10h] [xbp-40h] BYREF
v11[1] = *(_QWORD *)(_ReadStatusReg(ARM64_SYSREG(3, 3, 13, 0, 2)) + 40);
v11[0] = 0LL;
v4 = 65540;
if ( (*vm)->GetEnv(vm, (void **)v11, 65540LL) )
return -1;
_android_log_write(4, "NagaLinker", "v8.83");
v5 = sub_12340(v11[0]);
v6 = v11[0];
v7 = off_47FB8;
*off_47FB8 = v5;
v8 = (const char *)sub_12600(v6);
if ( strchr(v8, 77) )
{
*v7 = 23;
}
else if ( *v7 >= 24 )
{
*off_47ED8 = 1;
}
v10 = 0LL;
if ( sub_8734(qword_49248, (__int64)"JNI_OnLoad", (__int64 *)&v10) )
v10(vm, reserved);
return v4;
}复制代码这里调用了sub_12340和sub_12600来进行环境检查,进入函数发现会对安卓api和安卓版本号检查,后面的if else对检查结果进行比较。
bool __fastcall sub_8734(__int64 a1, __int64 a2, __int64 *a3)
{
__int64 v4; // x0
_ReadStatusReg(ARM64_SYSREG(3, 3, 13, 0, 2));
v4 = sub_ED8C(a1, a2);
*a3 = v4;
return v4 != 0;
} 复制代码然后调用了sub8734进行动态查找,这个很可能和frida检测相关,找到之后,v10就不是变量了变成了目标地址,拿到地址后通过jni onload来执行。(大概就是这样吧可能有点乱

)
LOAD:0000000000013B28 A0 00 00 34 CBZ W0, loc_13B3C
LOAD:0000000000013B28
LOAD:0000000000013B2C E8 07 40 F9 LDR X8, [SP,#0x50+var_48]
LOAD:0000000000013B30 E0 03 15 AA MOV X0, X21
LOAD:0000000000013B34 E1 03 14 AA MOV X1, X20
LOAD:0000000000013B38 00 01 3F D6 BLR X8
LOAD:0000000000013B38
LOAD:0000000000013B3C
LOAD:0000000000013B3C loc_13B3C 复制代码回到汇编,blr x8就是v10(vm, reserved);我们要阻止这句执行,直接将CBZ W0, loc_13B3C改成无条件跳转,就绕过了这句话。
打开010 editer,跳转到代码地址13B28,光标会自动定位原机器码A0 00 00 34,修改为05 00 00 14,对应指令B loc_13B3C实现无条件跳转

修改后保存,替换原so,打包签名,注入frida验证,成功绕过





