首页
论坛
课程
招聘
[原创]分析 Substrate 的 ARM/THUMB 函数 Hook 实现细节
2014-7-12 01:17 10166

[原创]分析 Substrate 的 ARM/THUMB 函数 Hook 实现细节

2014-7-12 01:17
10166
前面有一篇热文分析了,也凑个热闹。看 GitHub 上我排版过的:http://yonsm.net/armhook/

ARM 架构的 CPU 有 ARM 和 THUMB 执行态。
1. 先说 ARM 态(被Hook的函数)到 ARM 态(自己的替换函数)的 HOOK
非常简单,没有看过 Substrate 的时候我就想到并验证过了(8 个字节):
  LDR PC, [PC, #-4]
  replacedFunctionAddress  ; 目标绝对地址(ARM 态的,偶数)
2. ARM 态到 THUMB 态的 HOOK
和上面应该应该类似,只是 变成 replacedFunctionAddress + 1,转跳后自动切换到 THUMB 态。
  未验证(X!)
3. THUMB 到 THUMB 态的 HOOK
难理解的来了,经过实际测试发现下面的代码可以 HOOK 任意的函数(包括未导出的私有函数)(注意,hookedFunctionAddress 如果是 THUMB 的,则需要 + 1——MD,在这栽了好长一段时间,感谢曾半仙)
  _MSHookFunction(hookedFunctionAddress + 1, (void *)replacedFunctionAddress, (void **)&pOriginalFunction);
用以上 Substrate 的方法实现 THUMB 到 THUMB 的 HOOK 之后,我用 GDB 查看了一下内存,总共修改了12个字节,如下:
  (gdb) x/3xw _mh_execute_header+0x1073E0
  0x15e3e0 <_mh_execute_header+1078240>:    0x46c04778  0xe51ff004  0x0029b6b9  
反汇编代码(注意 THUMB 模式的 disas 地址要 +1 变成奇数):
  (gdb) disas _mh_execute_header+0x1073E1 _mh_execute_header+0x1073EC
  Dump of assembler code from 0x15e3e1 to 0x15e3ec:
  0x0015e3e1 <_mh_execute_header+1078241>:  bx  pc
  0x0015e3e3 <_mh_execute_header+1078243>:  nop         (mov r8, r8)
  0x0015e3e5 <_mh_execute_header+1078245>:  blx 0x562e24 ; 请忽略
  0x0015e3e9 <_mh_execute_header+1078249>:  undefined ; 请忽略
  0x0015e3eb <_mh_execute_header+1078251>:  lsls    r1, r5, #0 ; 请忽略
第一条指令(C0 46)就是 THUMB 的 BX PC,第二条指令是 78 47 是 THUMB 的 NOP。后面的指令因为实际上是 BX 成 ARM 态了,所以请忽略。
BX PC 后实际上是转跳到了 ARM 态的 0x0015e3e4 地址,继续反汇编如下:
  (gdb) disas _mh_execute_header+0x1073E4 _mh_execute_header+0x1073EC
  Dump of assembler code from 0x15e3e4 to 0x15e3ec:
  0x0015e3e4 <_mh_execute_header+1078244>:  ldr pc, [pc, #-4]   ; 0x15e3e8 <_mh_execute_header+1078248>
  0x0015e3e8 <_mh_execute_header+1078248>:  strheq  r11, [r9], -r9 ; 这个就是和 replacedFunctionAddress + 1 了
可以看到从 0x0015e3e4 这里开始和上面提到的第一种情况(从ARM到THUMB)一样了。
4. 从 THUMB 到 ARM
  你猜~~
关于转跳
  * 如果操作数类型是imm, 那就是互换状态. ARM下到thumb, thumb下调用就到ARM;
  * 如果操作数是寄存器 根据低位地址,奇数为 THUMB,偶数为 ARM。
知道了上述 HOOK 方法,再构造一个 pOriginalFunction,结合 Inject Dylib 的方法,就可以自己实现 Substrate 的完整功能了。
(上面仅 3 是对 Substate 的 Hook 分析,其它是我 YY 的,不确定 Substrate 也是这样的实现,有兴趣的话可以自己反汇编/反编译 Substrate 去看实现细节)

第五届安全开发者峰会(SDC 2021)10月23日上海召开!限时2.5折门票(含自助午餐1份)

收藏
点赞0
打赏
分享
最新回复 (10)
雪    币: 177
活跃值: 活跃值 (255)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
viphack 活跃值 4 2014-7-12 02:02
2
0
我看看我是不是沙发
雪    币: 8
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiaoabing 活跃值 2014-7-12 02:11
3
0
板凳总该有吧
雪    币: 242
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ShadoWWinL 活跃值 2014-7-12 10:23
4
0
Substrate 有源码的。
thumb的hook处理比arm处理的要多一些。
重点还是PC rel指令的处理。
雪    币: 278
活跃值: 活跃值 (99)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Dstlemoner 活跃值 2014-7-12 12:01
5
0
搓衣板。
雪    币: 100
活跃值: 活跃值 (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Arcade 活跃值 2014-7-12 12:47
6
0
mark, 看看。。
雪    币: 30
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Carina 活跃值 2014-7-24 16:23
7
0
学习了~
雪    币: 60
活跃值: 活跃值 (97)
能力值: ( LV12,RANK:220 )
在线值:
发帖
回帖
粉丝
cater 活跃值 5 2014-7-27 20:15
8
0
几年 不开贴
宇宙新青年 最近可好呢。
雪    币: 60
活跃值: 活跃值 (97)
能力值: ( LV12,RANK:220 )
在线值:
发帖
回帖
粉丝
cater 活跃值 5 2014-7-27 20:16
9
0
吴总,您请字来发帖啊~~
见到你 好开心~
雪    币: 2436
活跃值: 活跃值 (169)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
飘云 活跃值 1 2014-8-9 14:22
10
0
收藏了,,THUMB  + 1问题 我也纠结了良久。。。
雪    币: 11
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
laxYY 活跃值 2014-8-13 10:27
11
0
学习了~
游客
登录 | 注册 方可回帖
返回