首页
社区
课程
招聘
[旧帖] [求助]菜鸟关于inline hook的一点疑问 0.00雪花
发表于: 2011-9-22 20:31 1192

[旧帖] [求助]菜鸟关于inline hook的一点疑问 0.00雪花

2011-9-22 20:31
1192
我用用C写了简单的inline hook  
修改前5个字节,让他跳转到自己的函数DetourMyFunction,在其中调用自己另外的一个函数
Myfunc(参数1,参数2),结束后后执行原函数的前五个字节代码,最后跳转到原函数5字节之后运行

我在有些地方看到说,要测量函数头,修改的并不一定是前5字节,也可能是前n个字节。
问题1:
      这前n个字节的n是怎么确定的?

我感觉反正最后都要执行原来的代码(说的是还要执行原来函数代码,并不包括只执行自己函数然后返回的情况),至于修改几个字节应该无所谓了吧,够写一个jmp  XXXXX就行了吧(5个字节就够了)

DetourMyFunction定义为_declspec(naked)类型的,也就是自己维护堆栈,因此在其中调用了Myfunc(参数1,参数2)后 添加一句 add esp,8来平衡堆栈,但是不行,如果去掉这句就可以了

问题二:
      C调用规则不是说由调用函数者平衡堆栈,因此我才加上add esp,8这句,但是错误,去掉才对,这样的话不是和C调用规则不符吗?

_declspec(naked)  DetourMyFunction
{
Myfunc(参数1,参数2)
}

我知道自己很菜,大牛想笑就笑吧,帮我解释下就行了,先谢谢
第一次提问,但愿不要沉

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 1689
活跃值: (379)
能力值: ( LV15,RANK:440 )
在线值:
发帖
回帖
粉丝
2
问题1:n是由反汇编引擎确定的。比如目标函数头有2条令,第一条2个字节,第二条4个字节,你的跳转指令为5字节。因此你得保存原来的6字节内容并且向原始函数跳转时要跳转到base+6的地方。一般函数开头为,push ebp,mov ebp,esp两条指令,一共5字节,所以你不用管啦。对于一般情况,不能默认保存5字节的内容。

问题2:你的Myfunc 函数可能是stdcall规则的。这里你没出源码不好评判。做inlink hook的时候,对目标函数的调用约定以及自己函数的调用约定一定要清楚。遇到这样的问题,自己用调试器跟一遍啥都明白了。
2011-9-22 20:51
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
现在微软的函数头都是5字节,
mov edi, edi
push ebp
mov ebp, esp
就是方便hook用的。
2011-9-22 21:14
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
第一个问题搞明白了 谢谢

我写的代码就是模仿http://bbs.pediy.com/showthread.php?t=101825

中的,其中有疑问的就是NewZwQuerySystemInformation,中调用ResoleLogic后没有加add esp,8  请帮忙再看下
2011-9-22 21:56
0
雪    币: 1689
活跃值: (379)
能力值: ( LV15,RANK:440 )
在线值:
发帖
回帖
粉丝
5
是这样,你的那个对myFunc的调用不是用内联汇编里写的,所以编译器会自动按照C调用约定加上平衡栈的指令(add esp,xxx),所以你是不用再加的。如果在内联汇编里自己用call指令调用函数的话,平衡栈就得手动处理了。
2011-9-23 10:27
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢大牛指点 ,终于搞明白了
2011-9-23 19:15
0
游客
登录 | 注册 方可回帖
返回
//