首页
论坛
课程
招聘
[分享]MSHookFunction IDA中的sub_xxxx之说
2015-1-21 15:52 24411

[分享]MSHookFunction IDA中的sub_xxxx之说

2015-1-21 15:52
24411
唉,说起来这就是一个坑,Cydia Substrate在其文档中也没找到详细说明,最后也只能来看看代码曾半仙最早给的那份substrate-master源码,然后一切就了然于胸了,这个坑很大,很大!!!
    现在我们先来看下MSHookFunction怎么Hook IDA中的sub_xxxx函数,然后再来谈谈为啥是这样的。
    
    就以这段代码为例吧,下断点红色选中部分,中的sub_17C94就是我想要Hook的函数,首先确认了下参数个数为2个。

    以下给出代码片段截图:
    
    
    到这里我想很多人有点不理解,为啥需要 | 0x00000001,别急,下面我就借花献佛,慢慢道来也。

    既然源头是出现在MSHookFunction上,那们我们就去阅读下这块的代码:
    
    
    从这2 段代码中可以很明显的看到在SubstrateHookFunction中,看到这么一句
     if ((reinterpret_cast<uintptr_t>(symbol) & 0x1) == 0)
    也就是说,MSHookFunction在判断Hook函数的时候,是通过在传到进来函数地址的奇偶数来判断是ARM指令的函数,还是Thumb指令的函数。
    这个坑好大,我勒个去啊!!!
    别急,接下来看这句
    reinterpret_cast<void *>(reinterpret_cast<uintptr_t>(symbol) & ~0x1)
    判断完后,为了能正确Hook地址,又改回原来的地址了,这下变清楚了吧。
    再者,从MSFindSymbol函数中也能清楚的看到value |= 0x00000001这句!!!

    好了,这次借花献佛结束了,希望用自己的一点微薄之力,能帮助大家!

第五届安全开发者峰会(SDC 2021)议题征集正式开启!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (13)
雪    币: 395
活跃值: 活跃值 (371)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
KooJiSung 活跃值 2015-1-21 18:37
2
1
sub_func = base + 0x17c95

thumb + 1
雪    币: 0
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rootmm 活跃值 2015-3-5 09:39
3
0
感谢分享
雪    币: 36
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
guxing罗 活跃值 2015-3-5 10:28
4
0
支持下。。。
雪    币: 85
活跃值: 活跃值 (63)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wodexinren 活跃值 2015-4-9 14:14
5
0
学习下~
雪    币: 2396
活跃值: 活跃值 (197)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
浙江螃蟹 活跃值 2015-4-9 14:31
6
0
学习下~
雪    币: 209
活跃值: 活跃值 (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
parkerpan 活跃值 2016-4-25 10:36
7
0
求教下:
sub_func = (image_base + 0x17c94) | 0x0000001;
的image_base是
雪    币: 2821
活跃值: 活跃值 (1452)
能力值: ( LV13,RANK:500 )
在线值:
发帖
回帖
粉丝
我是小三 活跃值 10 2016-4-25 10:44
8
0
image_base是so模块加载到内存后的基址,0x17c94是文件偏移。
雪    币: 209
活跃值: 活跃值 (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
parkerpan 活跃值 2016-4-25 15:29
9
0
如果是so模块加载到内存后的基址,编写完插件后安装要重启,内存内的基址不是变掉了?
雪    币: 36
活跃值: 活跃值 (213)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
芃杉 活跃值 2019-12-3 11:35
10
0
mark
雪    币: 4711
活跃值: 活跃值 (586)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
alphc 活跃值 2019-12-3 12:58
11
0
干得漂亮
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
aperer 活跃值 2020-1-5 11:33
12
0
怎么确定参数的类型呢?
雪    币: 783
活跃值: 活跃值 (329)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
小调调 活跃值 2020-1-6 10:07
13
0
参数类型和参数个数,你得根据汇编或者函数原型声明来做处理
雪    币: 83
活跃值: 活跃值 (33)
能力值: ( LV6,RANK:95 )
在线值:
发帖
回帖
粉丝
谢逅 活跃值 2 2021-2-26 14:16
14
0
这不是坑,arm 本来就是通过最低位是否位1来表示工作模式的
游客
登录 | 注册 方可回帖
返回