首页
社区
课程
招聘
[分享]MSHookFunction IDA中的sub_xxxx之说
发表于: 2015-1-21 15:52 32095

[分享]MSHookFunction IDA中的sub_xxxx之说

2015-1-21 15:52
32095
唉,说起来这就是一个坑,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这句!!!

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

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

上传的附件:
收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 357
活跃值: (3438)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
2
sub_func = base + 0x17c95

thumb + 1
2015-1-21 18:37
1
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢分享
2015-3-5 09:39
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
支持下。。。
2015-3-5 10:28
0
雪    币: 74
活跃值: (748)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学习下~
2015-4-9 14:14
0
雪    币: 5467
活跃值: (1430)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
学习下~
2015-4-9 14:31
0
雪    币: 212
活跃值: (44)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
求教下:
sub_func = (image_base + 0x17c94) | 0x0000001;
的image_base是
2016-4-25 10:36
0
雪    币: 3901
活跃值: (6145)
能力值: ( LV13,RANK:550 )
在线值:
发帖
回帖
粉丝
8
image_base是so模块加载到内存后的基址,0x17c94是文件偏移。
2016-4-25 10:44
0
雪    币: 212
活跃值: (44)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
如果是so模块加载到内存后的基址,编写完插件后安装要重启,内存内的基址不是变掉了?
2016-4-25 15:29
0
雪    币: 36
活跃值: (1061)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
mark
2019-12-3 11:35
0
雪    币: 8447
活跃值: (5041)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
11
干得漂亮
2019-12-3 12:58
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
怎么确定参数的类型呢?
2020-1-5 11:33
0
雪    币: 3279
活跃值: (3326)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
13
参数类型和参数个数,你得根据汇编或者函数原型声明来做处理
2020-1-6 10:07
0
雪    币: 92
活跃值: (209)
能力值: ( LV6,RANK:95 )
在线值:
发帖
回帖
粉丝
14
这不是坑,arm 本来就是通过最低位是否位1来表示工作模式的
2021-2-26 14:16
0
游客
登录 | 注册 方可回帖
返回
//