|
|
本帖最后由 Philia114514 于 2025-10-12 14:27 编辑
遇到一个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验证,成功绕过
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|