Frida 过检测通用方案 |
|
前言 过检测一般可以从退出方式入手。检测到环境异常会想办法退出程序,大致分成 libc 函数方案和 svc 退出方案。 libc: exit, kill, _exit 等。 svc: syscall 相关。 libc 层面frida 可以直接 hook 相关函数然后打印堆栈就可以定位到检测点。 svc 用frida 无法直接 hook ,可以采用下面的通用过检测思路。 检索 svc 网上也有人分享过用 frida stalker 检测svc 的方式,也是办法之一,但 stalker 稳定性一直是个问题,所以这里采用了: ida python + frida 的方式。 主要就是将分析 so 调用 svc 的位置用 ida python 部分来实现。直接上 idapython 代码 [解锁帖子获取] 可以在 python/android/idaSearchSvc.py加载到 ida 执行,此时会输出该so 的 svc 所有的调用地址,如: ['0x4826c', '0x487bc', '0x48dc4', '0x496d4', '0x49880', '0x499d0', '0x4b200', '0x4bf40', '0x51578', '0x51598', '0x516fc', '0x51984', '0x519bc', '0x51a34', '0x51b24', '0x51b9c', '0x51e98'] 利用 frida 定位检测点 将上面输出的 svc_address_list全部hook 掉: let svc_address_list = ['0x4826c', '0x487bc', '0x48dc4', '0x496d4', '0x49880', '0x499d0', '0x4b200', '0x4bf40', '0x51578', '0x51598', '0x516fc', '0x51984', '0x519bc', '0x51a34', '0x51b24', '0x51b9c', '0x51e98']; FCAnd.watch_svc_address_list(mod.base, svc_address_list); 然后用 frida spawn的方式启动目标进程就会打印出所有调用 svc 的堆栈信息。为了及时hook 可以选择在目标 so 加载之后开始 hook FCAnd.whenSoLoad("libshell-super.com.wm.xxxxxx.so", (mod) => { let svc_address_list = ['0x4826c', '0x487bc', '0x48dc4', '0x496d4', '0x49880', '0x499d0', '0x4b200', '0x4bf40', '0x51578', '0x51598', '0x516fc', '0x51984', '0x519bc', '0x51a34', '0x51b24', '0x51b9c', '0x51e98']; FCAnd.watch_svc_address_list(mod.base, svc_address_list); // DMLog.i("dd", "so load base: " + mod.base); }); 得到堆栈信息如下: ...... [INFO][05/10/2024, 07:14:18 PM][PID:9502][Thread-134][9551][showNativeStacks]: Backtrace: 0x6e86545b10 libshell-super.com.xxxxxx.so!0x51b10 0x6e86545580 libshell-super.com.xxxxxx.so!0x51580 0x7187d9075c libc.so!_ZL15__pthread_startPv+0x44 0x7187d30154 libc.so!__start_thread+0x44 [INFO][05/10/2024, 07:14:18 PM][PID:9502][Thread-135][9551][showNativeStacks]: Backtrace: 0x6e86545b10 libshell-super.com.xxxxxx.so!0x51b10 0x6e86545580 libshell-super.com.xxxxxx.so!0x51580 0x7187d9075c libc.so!_ZL15__pthread_startPv+0x44 0x7187d30154 libc.so!__start_thread+0x44 [INFO][05/10/2024, 07:14:18 PM][PID:9502][Thread-136][9551][showNativeStacks]: Backtrace: 0x6e864ede0c 0x6e86545580 libshell-super.com.xxxxxx.so!0x51580 0x7187d9075c libc.so!_ZL15__pthread_startPv+0x44 0x7187d30154 libc.so!__start_thread+0x44 [INFO][05/10/2024, 07:14:18 PM][PID:9502][Thread-137][9551][showNativeStacks]: Backtrace: 0x6e86545b10 libshell-super.com.xxxxxx.so!0x51b10 0x6e86545580 libshell-super.com.xxxxxx.so!0x51580 0x7187d9075c libc.so!_ZL15__pthread_startPv+0x44 0x7187d30154 libc.so!__start_thread+0x44 [INFO][05/10/2024, 07:14:18 PM][PID:9502][Thread-138][9551][showNativeStacks]: Backtrace: 0x6e86545b10 libshell-super.com.xxxxxx.so!0x51b10 0x6e86545580 libshell-super.com.xxxxxx.so!0x51580 0x7187d9075c libc.so!_ZL15__pthread_startPv+0x44 0x7187d30154 libc.so!__start_thread+0x44 [INFO][05/10/2024, 07:14:18 PM][PID:9502][Thread-139][9551][showNativeStacks]: Backtrace: 0x6e864ede0c 0x6e86545580 libshell-super.com.xxxxxx.so!0x51580 0x7187d9075c libc.so!_ZL15__pthread_startPv+0x44 0x7187d30154 libc.so!__start_thread+0x44 [INFO][05/10/2024, 07:14:18 PM][PID:9502][Thread-140][9551][showNativeStacks]: Backtrace: 0x6e86545b10 libshell-super.com.xxxxxx.so!0x51b10 0x6e86545580 libshell-super.com.xxxxxx.so!0x51580 0x7187d9075c libc.so!_ZL15__pthread_startPv+0x44 0x7187d30154 libc.so!__start_thread+0x44 [INFO][05/10/2024, 07:14:18 PM][PID:9502][Thread-141][9551][showNativeStacks]: Backtrace: 0x6e86545b10 libshell-super.com.xxxxxx.so!0x51b10 0x6e86545580 libshell-super.com.xxxxxx.so!0x51580 0x7187d9075c libc.so!_ZL15__pthread_startPv+0x44 0x7187d30154 libc.so!__start_thread+0x44 ...... 大概翻一下,出现频率比较多的基本就是。0x51b10 -- 0x51580 接下来就是 ida 定位到相关地址,看看检测逻辑就可以判断和绕过了。 [attach]539[/attach] 比如这里检测函数是 sub_515C4,那进去看一下这个函数都检测了什么,详细就不展开了,只说一下结论,这个函数主要检测了: /proc/self/task/%s/status 的线程名 /proc/self/fd/%s 的 readlink 判断特征名 /proc/self/maps 的 frida 特征名
购买主题
已有 3 人购买
本主题需向作者支付 1 金钱 才能浏览
|
|
这个人还没有签名
|
| |
|
这个人还没有签名
|
|