Frida Stalker是一个代码跟踪工具,似乎很好用。
Android逆向-Frida Stalker
原理
Anatomy of a code tracer | by Ole André Vadla Ravnås | Medium
核心原理就是dynamic recompilation
。
这个想法很简单。当线程即将执行其下一条指令时,您可以创建这些指令的副本,并将该副本与所需的日志记录代码交织在一起。因此,您可以保持原始指令不变,以保持反调试校验和逻辑满意,并改为执行副本。例如,在每条指令之前,您需要向日志处理程序放置一个 CALL,并为其提供有关即将执行的指令的详细信息。
API
Stalker | Frida • A world-class dynamic instrumentation toolkit
感觉写的太详细了,像个论文。说实话我希望能找到个单纯教我如何用API的Doc。
启动Stalker:Stalker.follow
1 | Stalker.follow([threadId, options]) |
其对应的GUM C API则是:
1 | gum_stalker_follow_me() |
获取线程ID
Process.enumerateThreadsSync
函数可以遍历进程,获取线程ID和寄存器状态。在
Interceptor.attach
函数中调用this.threadId
也可以直接得到线程ID。Interceptor.attach(my_func, { onEnter: (args) { Stalker.follow(this.threadId, { // ... }); // ... }, onLeave (retval) { Stalker.unfollow(this.threadId); } })
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
## Doc
这是C API:[frida/frida-gum: Cross-platform instrumentation and introspection library written in C (github.com)](https://github.com/frida/frida-gum/tree/main)
主要还是直接使用Js API:[Stalker | Frida • A world-class dynamic instrumentation toolkit](https://frida.re/docs/stalker/)
## 入门视频
[Frida Stalker - Tracing binary instructions - YouTube](https://www.youtube.com/watch?v=BgICyi2H2CU)
用Stalker做了一个简单的trace,对Linux/Windows平台上的一个迫真解密程序进行了破解。
`crack_password.c`
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char good_password[7] = { (char)0xce, (char)0xcd, (char)0xcc,
(char)0xcb, (char)0xca, (char)0xc9, (char)0x00};
char* decrypt_password() {
int i;
for(i=0; i<6; i++){
good_password[i] = good_password[i] ^ 0xff;
}
return good_password;
}
int main(int argc, char* argv[]) {
if(argc != 2) {
return -2;
}
if(strlen(argv[1]) != 6) {
return -3;
}
if(0==strcmp(argv[1], decrypt_password())){
puts("Correct!");
} else {
puts("Incorrect!");
return -4;
}
return 1;
}
以及js脚本:
1 | var mod = Process.getModuleByName("crack_password.exe"); |
执行指令:
1 | frida -l .\stalker_crack_password.js -f d:\Android\Stalker\crack_password.exe 123457 |
frida-stalker-example
1 | import sys |
Sktrace
基于Stalker实现的,类似IDA trace的工具,用于统计寄存器变化和字符串生成等。
[原创] sktrace:基于 Frida Stalker 的 trace 工具-Android安全-看雪-安全社区|安全招聘|kanxue.com
关于其中使用的测试样例ollvm9.apk
:
[原创]浅尝ollvm轻度混淆后的加密算法分析-Android安全-看雪-安全社区|安全招聘|kanxue.com
代码简单阅读
整个工具的核心点其实就这个:
1 | void transform(GumStalkerIterator *iterator, |
中的
1 | log("%p\t%s\t%s", (gpointer)insn->address, insn->mnemonic, insn->op_str); |
其他都是用模板生成的代码,基本没用上。
这个函数的传入的第三个形参user_data
是从Js端传入的,指定了两个指针,前后分别表示一个模块的起始地址和终止地址。
1 | userData.writePointer(base) |
最后放入transform
模块中。
1 | Stalker.follow(tid, { |
参考
[原创] sktrace:基于 Frida Stalker 的 trace 工具-Android安全-看雪-安全社区|安全招聘|kanxue.com
Stalker | Frida • A world-class dynamic instrumentation toolkit
Anatomy of a code tracer | by Ole André Vadla Ravnås | Medium
Advanced Frida - Frida HandBook (learnfrida.info)
(2) Frida Stalker - Tracing binary instructions - YouTube
Stalker | Frida • A world-class dynamic instrumentation toolkit
- 本文作者: Taardis
- 本文链接: https://taardisaa.github.io/2023/09/28/Android逆向-Frida-Stalker/
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!