首页
论坛
课程
招聘
[原创] sktrace:基于 Frida Stalker 的 trace 工具
2020-12-26 19:52 16196

[原创] sktrace:基于 Frida Stalker 的 trace 工具

2020-12-26 19:52
16196

说一说 Stalker

我们常用 Frida hook天hook地,基于 Frida 的项目也遍地开花,是的 Frida 太好用了。其实 Frida 还有一些更为高级,强大的特性,例如 Stalker。
Stalker 是 Frida 中提供的代码跟踪引擎,可以在Native层方法级别,块级别,指令级别实现代码修改,代码跟踪。
其实 Stalker 很早就出现在 Frdia,但在 arm 上无法运行。最近 Frida 从 12.xx 版本直接跳到了 14.0,并且“Stalker ARM improvements” 几个大字在更新文档上赫然出现。欣喜的以为可以在 arm 上使用了,不幸的是试了一下却还是有问题,arm64 倒是还算正常。期待早日完美支持 arm。

实现原理:动态编译

Stalker 的目标是实现一个快速的,不被反调发现的,指令级别的代码追踪引擎,怎么能同时实现这些,答案是:动态编译。
官方的文档讲的很清楚,有兴趣的自己可以自己看看,会了解的比较透彻。
下面通俗的说意思自己的理解,有不对的地方还请大佬们指出哈。
Stalker 不像 Interceptor 一样直接在指令执行的地方做修改,Stalker 会重新开辟一块空间用于执行动态编译的代码,并且暴漏接口给用户来操纵动态编译的指令。Stalker 以基本块为基本的执行单元,从使用者的角度来说,需要了解下面几个 Stalker 中的概念:

  1. Blocks: 以基本块为单位进行动态编译
  2. Call: 对于 BL* 保存 LR,栈等信息
  3. Transformer: 基本块如何被动态编译。提供用户接口,可读取,修改,插入指令
  4. Callout: 设置一个当此位置被执行到时的 callback,可获取当前 cpu 信息
  5. Probes: 在 trace 中使用类似 Interceptor 的 hook
  6. Relocator: 重定位模块,例如:ADR Xd, label
  7. Trust Threshold: 基本块在被 transform 次数达到可信阈值后,内容未曾变化,下次将不再重新编译

每当执行到一个基本块,Stalker 都会做以下几件事:

  1. 对于方法调用,保存 lr 等必要信息
  2. 重定位位置相关指令,例如:ADR Xd, label
  3. 建立此块的索引,如果此块在达到可信阈值后,内容未曾变化,下次将不再重新编译(为了加快速度)
  4. 根据 transform 函数,编译生成一个新的基本块 GumExecBlock ,保存到 GumSlab 。void transform(GumStalkerIterator iterator, GumStalkerOutput output, gpointer user_data) 可以控制读取,改动,写入指令。
  5. transform 过程中还可通过 void gum_stalker_iterator_put_callout (GumStalkerIterator self,GumStalkerCallout callout, gpointer data, GDestroyNotify data_destroy) 来设置一个当此位置被执行到时的 callout。通过此 void callout(GumCpuContext cpu_context, gpointer user_data) 获取 cpu 信息。
  6. 执行一个基本快 GumExecBlock,开始下一个基本快

下面手动写了一个动态编译的过程,可能不太准确,大概是这个意思:
图片描述

强大的 Stalker

transform 函数配合 put_callout 使得我们可以对每一个基本块做任何想做事,对于运行过程中进行解密的代码,也可以通过修改 trustThreshold 来监视解密过程。

sktrace

sktrace 是对 Stalker 最为简单的应用,实现了一个类似 IDA 指令 trace 的功能。另外对于每个寄存器的连续变化做了个统计,会更利于分析,如果出现连续四个可打印字符,会以字符串的形式打印出来。
暂时只是简单的写了一下,贴下地址:

 

https://github.com/bmax121/sktrace

 

拿大佬们玩的 ollvm9.apk 测试了一下:

1
python3 sktrace/sktrace.py -m attach -l libnative-lib.so -i Java_com_kanxue_ollvm_1ndk_MainActivity_UUIDCheckSum com.kanxue.ollvm_ndk_9

软件页面:
图片描述

 

trace效果:
trace效果图

 

寄存器变化统计结果:
搜索页面上的字符串,就能够直接找到:
寄存器变化统计

over


VMProtect分析与还原

最后于 2021-1-14 16:24 被bmax编辑 ,原因:
收藏
点赞8
打赏
分享
最新回复 (17)
雪    币: 272
活跃值: 活跃值 (1009)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mb_foyotena 活跃值 2020-12-26 21:45
2
0
强大
雪    币: 442
活跃值: 活跃值 (1063)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
无情剑客_bur 活跃值 2020-12-26 23:39
3
0
感谢楼主分享。最近也在研究stalker功能。ubuntu20支持的不太好。
雪    币: 198
活跃值: 活跃值 (843)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bmax 活跃值 2020-12-27 09:52
4
0
无情剑客_bur 感谢楼主分享。最近也在研究stalker功能。ubuntu20支持的不太好。
是的,arm支持也不太好,x86-64 可以试试 qdbi
雪    币: 663
活跃值: 活跃值 (494)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
哆啦噩梦 活跃值 2020-12-28 09:58
5
0
强大,啥时候支持上32
雪    币: 237
活跃值: 活跃值 (826)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
juziss 活跃值 2020-12-28 14:20
6
0
感谢分享,长见识了
雪    币: 3870
活跃值: 活跃值 (1947)
能力值: ( LV10,RANK:165 )
在线值:
发帖
回帖
粉丝
DMemory 活跃值 3 2020-12-29 11:55
7
0
已经发啦,来点个赞!
雪    币: 1758
活跃值: 活跃值 (2133)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
又见飞刀z 活跃值 2020-12-30 14:13
8
0
不错
雪    币: 39
活跃值: 活跃值 (817)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
番茄西瓜汤 活跃值 2020-12-30 16:25
9
0
感谢楼主分享,学习中
雪    币: 1814
活跃值: 活跃值 (599)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
richor 活跃值 2020-12-31 16:52
10
0
大佬,trace后如何保存为文件呢
雪    币: 198
活跃值: 活跃值 (843)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bmax 活跃值 2021-1-1 19:22
11
0
richor 大佬,trace后如何保存为文件呢
重定向或者改改代码
雪    币: 228
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_hgbbfgzh 活跃值 2021-1-8 18:57
12
0
不会用
雪    币: 969
活跃值: 活跃值 (641)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lrzhao 活跃值 2021-1-11 14:52
13
0
richor 大佬,trace后如何保存为文件呢


最后于 2021-1-11 14:55 被lrzhao编辑 ,原因:
雪    币: 442
活跃值: 活跃值 (1063)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
无情剑客_bur 活跃值 2021-1-12 09:00
14
0
bmax 是的,arm支持也不太好,x86-64 可以试试 qdbi
Stalker的trap功能可有研究?
雪    币: 198
活跃值: 活跃值 (843)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bmax 活跃值 2021-1-14 16:27
15
0
无情剑客_bur Stalker的trap功能可有研究?
没有.
雪    币: 962
活跃值: 活跃值 (5151)
能力值: ( LV7,RANK:115 )
在线值:
发帖
回帖
粉丝
Ssssone 活跃值 2 2021-2-5 23:12
16
0
支持
雪    币: 36
活跃值: 活跃值 (441)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
芃杉 活跃值 2021-9-15 17:14
17
0
mark
雪    币: 219
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
Skyart 活跃值 2021-12-30 14:44
18
0
Error: compilation failed: module.c:51: error: cast between pointer and integer of different size', 'stack': 'Error: compilation failed: module.c:51: error: cast between pointer and integer of different size\n    at <eval> (/script1.js:98)', 'fileName': '/script1.js', 'lineNumber': 98, 'columnNumber'
是因为不支持32位吗?
游客
登录 | 注册 方可回帖
返回