X音版本: 370401
X音的校验参数是在 libmetasec_ml.so 中,静态导出函数只有一个 JNI_OnLoad, 其它导出函数是通过 JNIEnv->RegisterNatives 动态注册。
init_array 段如下:
首先运行 UNIDBG 最基础的代码来测试 init_array :
正常情况下,输出日志如下:
运行 dm.callJNI_OnLoad(emulator); 调用 JNI_OnLoad 后报错 :
错误的原因如下 :
根据 APK 的 JAVA 代码 :
补充以下代码 :
继续运行报错 :
修补环境, 打印出第一个参数是 268435470
继续分析以上 com/bytedance/mobsec/metasec/ml/MS 类的调用, 最终的调用函数 u2.a(i, i2, j, str, obj) 代码如下 :
结果为返回 2
修补代码如下 :
最终调用 JNI_OnLoad 的完整代码如下 :
输出日志如下:
根据 JNI_OnLoad 的日志,可以看到其调用了 RegisterNative 注册了 ms/bd/c/y2 类的 a 函数 , 对应的 libmetasec_ml.so 函数的地址为 0x26f0f8
对应的反汇编代码如下:
对 ms/bd/c/y2 类的 a 函数进行 HOOK, 和 com.bytedance.mobsec.metasec.ml.MS 的 a 是同一个函数, HOOK 代码如下:
发现有调用号为 0x1000001 的解密调用:
在 UNIDBG 中对解密函数进行调用:
成功输出了 scale 的解密结果:
但是没有 HOOK 到调用号为 0x3000001 对签名参数的调用,手动构造 0x3000001 的参数,使用 FRIDA 主动调用的代码如下:
返回结果为 NULL :
字节使用的网络底层库是 Cronet, 签名参数是在 libsscronet.so 中添加的,根据字符串 x-ttnet-origin-url 定位到目标函数地址是 0x47A31C,
调用 libmetasec_ml.so 签名函数的伪代码和汇编代码如下:
使用 FRIDA HOOK 0x47AAEC 地址, 获取到 X23 的地址是 libmetasec_ml.so 的 0x2A45F0 偏移:
对 libmetasec_ml.so 的 0x2A45F0 地址进行 HOOK ,获取到了签名参数:
UNIDBG 调用签名函数代码如下:
修补完环境后的完整代码如下:
生成的结果如下:
.init_array:0000000000374BC0 ; Segment type: Pure data
.init_array:0000000000374BC0 AREA .init_array, DATA, ALIGN=3
.init_array:0000000000374BC0 ; ORG 0x374BC0
.init_array:0000000000374BC0 DCQ sub_173268
.init_array:0000000000374BC8 DCQ sub_180D6C
.init_array:0000000000374BD0 DCQ sub_268454
.init_array:0000000000374BD8 DCQ sub_2723C8
.init_array:0000000000374BE0 DCQ sub_283BA0
.init_array:0000000000374BE8 DCQ sub_29AE6C
.init_array:0000000000374BF0 DCQ sub_29D1A4
.init_array:0000000000374BF8 DCQ sub_2A0B1C
.init_array:0000000000374C00 DCQ sub_2A3288
.init_array:0000000000374C08 DCQ sub_2A3CA8
.init_array:0000000000374C10 DCQ sub_343964
.init_array:0000000000374C10 ; .init_array ends
传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 1天前
被易之生生编辑
,原因: