好友
阅读权限10
听众
最后登录1970-1-1
|
今天试试把ai用于逆向分析.
先来个最简单的任务,下载xhs最新App,过Frida检测.
鼓弄半天自己创建一个Skill出来.让ai执行.
开始了,我不敢一下子提太大的要求,直接问:写个脚本过xhs frida检测,先hook android_dlopen_ext 看看加载到哪个so会crash.
Ai忙活半天,写出了如此抽象的代码.我承认我没看见这样的Hook代码,赞叹Ai超绝的想象力.就一个单文件[font=PingFang SC, 微软雅黑, Microsoft YaHei,
[JavaScript] 纯文本查看 复制代码 'use strict';
if (!globalThis.__xhs_dlopen_hook_installed__) {
globalThis.__xhs_dlopen_hook_installed__ = true;
function safeReadCString(ptrValue) {
try {
if (ptrValue.isNull()) {
return null;
}
return ptrValue.readCString();
} catch (error) {
return `<readCString failed: ${error}>`;
}
}
function logPayload(stage, index, path, extra) {
send({
tag: 'android_dlopen_ext',
stage: stage,
index: index,
path: path,
extra: extra || {}
});
}
try {
const resolver = new ApiResolver('module');
const matches = resolver.enumerateMatches('exports:*!android_dlopen_ext');
const target = matches.length > 0 ? matches[0].address : null;
if (!target) {
send({ tag: 'android_dlopen_ext', stage: 'error', error: 'symbol not found' });
} else {
let counter = 0;
Interceptor.attach(target, {
onEnter(args) {
this.index = ++counter;
this.path = safeReadCString(args[0]);
this.flags = args[1].toInt32();
this.caller = this.returnAddress;
logPayload('enter', this.index, this.path, {
flags: this.flags,
caller: this.caller.toString()
});
},
onLeave(retval) {
logPayload('leave', this.index, this.path, {
retval: retval.toString()
});
}
});
send({ tag: 'android_dlopen_ext', stage: 'ready', address: target.toString() });
}
} catch (error) {
send({ tag: 'android_dlopen_ext', stage: 'exception', error: String(error) });
}
}
然后ai根据日志得出了结论:
日志:
message: {'type': 'send', 'payload': {'tag': 'android_dlopen_ext', 'stage': 'leave', 'index': 30, 'path': 'libjnirtk.so', 'extra': {'retval': '0x0'}}} data: None
message: {'type': 'send', 'payload': {'tag': 'android_dlopen_ext', 'stage': 'enter', 'index': 31, 'path': '/data/app/~~U0lCTYVkl5g0SsvMZoQbnA==/com.xingin.xhs-Jl3emi3eZEMALq8ZUcvRVw==/lib/arm64/libredbase.so', 'extra': {'flags': 2, 'caller': '0x79136acef0'}}} data: None
message: {'type': 'send', 'payload': {'tag': 'android_dlopen_ext', 'stage': 'leave', 'index': 31, 'path': '/data/app/~~U0lCTYVkl5g0SsvMZoQbnA==/com.xingin.xhs-Jl3emi3eZEMALq8ZUcvRVw==/lib/arm64/libredbase.so', 'extra': {'retval': '0x96744dceb1c50189'}}} data: None
message: {'type': 'send', 'payload': {'tag': 'android_dlopen_ext', 'stage': 'enter', 'index': 32, 'path': '/data/app/~~U0lCTYVkl5g0SsvMZoQbnA==/com.xingin.xhs-Jl3emi3eZEMALq8ZUcvRVw==/lib/arm64/libmsaoaidsec.so', 'extra': {'flags': 2, 'caller': '0x79136acef0'}}} data: None
Process terminated
Thank you for using Frida!
## 结论
- Frida 附加的首个主进程在 `android_dlopen_ext` 命中 `libmsaoaidsec.so` 时终止。
- 直接证据见 `logs/frida_console.log`:
- 第 76 行前一个成功返回的是 `libredbase.so`
- 第 77 行进入 `libmsaoaidsec.so`
- 第 78 行立刻出现 `Process terminated`
- 系统随后又拉起新的主进程,见 `logs/device.log`:
- 第 2889 行:启动首个被 Frida 命中的主进程 `5497`
- 第 4468 行:再次启动新的主进程 `5720`
- 第 4799 行:未被 Frida 挂住的新进程里,`libmsaoaidsec.so` 可以正常加载
## 推断
- 更像是“Frida 环境下,在 `libmsaoaidsec.so` 加载/初始化阶段触发了检测并导致进程退出”,而不是该 so 在普通环境里天然崩溃。
- `logs/device.log` 多次出现 `Bad JNI version passed to GetEnv: 1879114240`,这是当前最可疑的直接异常特征。
- `logs/device_crash.log` 里的 `soterd` / `fidoca_mitee` / `mlipayd_mitee` / `mtd_mitee` 崩溃噪音较大,和xhs主进程是否直接自杀不是一一对应关系,暂不作为主结论。
## 下一步
- 继续只盯 `libmsaoaidsec.so`:
- Hook `JNI_OnLoad`
- Hook `RegisterNatives`
- Hook `JavaVM->GetEnv` / `JNIEnv` 相关入口
- 同时补一组 `libc`/`libart` 常见检测点:
- `open/openat/access/fopen`
- `pthread_create`
- `dlopen/android_dlopen_ext` 二次确认
- `ptrace` / `prctl` / `syscall`
|
免费评分
-
查看全部评分
|