首页
社区
课程
招聘
[原创]分析 Substrate 的 ARM/THUMB 函数 Hook 实现细节
发表于: 2014-7-12 01:17 12592

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

2014-7-12 01:17
12592

前面有一篇热文分析了,也凑个热闹。看 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 去看实现细节)


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 3
支持
分享
最新回复 (10)
雪    币: 219
活跃值: (773)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
2
我看看我是不是沙发
2014-7-12 02:02
0
雪    币: 10
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
板凳总该有吧
2014-7-12 02:11
0
雪    币: 246
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
Substrate 有源码的。
thumb的hook处理比arm处理的要多一些。
重点还是PC rel指令的处理。
2014-7-12 10:23
0
雪    币: 292
活跃值: (153)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
搓衣板。
2014-7-12 12:01
0
雪    币: 100
活跃值: (323)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
mark, 看看。。
2014-7-12 12:47
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
学习了~
2014-7-24 16:23
0
雪    币: 109
活跃值: (478)
能力值: ( LV12,RANK:220 )
在线值:
发帖
回帖
粉丝
8
几年 不开贴
宇宙新青年 最近可好呢。
2014-7-27 20:15
0
雪    币: 109
活跃值: (478)
能力值: ( LV12,RANK:220 )
在线值:
发帖
回帖
粉丝
9
吴总,您请字来发帖啊~~
见到你 好开心~
2014-7-27 20:16
0
雪    币: 2443
活跃值: (464)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
收藏了,,THUMB  + 1问题 我也纠结了良久。。。
2014-8-9 14:22
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
学习了~
2014-8-13 10:27
0
游客
登录 | 注册 方可回帖
返回
//