首页
社区
课程
招聘
在函数中获得本函数的地址
发表于: 2010-12-28 17:43 4470

在函数中获得本函数的地址

2010-12-28 17:43
4470
我打算写一个能监视所有函数调用的工具,现在有个问题难以解决,请各位指教:
具体表述如下:
某个地址有如下函数调用
call 0x545000
现在我在函数0x545000的函数头上写入一个
jmp MyFun
然后在MyFun中想要获得0x545000这个地址
我可以在MyFun中取得本次调用的返回地址,
假如调用函数0x545000是使用的是
形如call 0x545000的方法,则在MyFun中可以通过返回地址得到
0x545000这个地址
但是如果是以FF开头的CALL来调用0x545000
则情况非常复杂,可能是
call eax这种 也可能是call dwrod ptr[]
还可能是call [esp+0x04]等等
这样的话要在MyFun中取得0x545000这个地址几乎不可能。
请教下各位有没有其它的办法来处理.

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
呵呵,你都知道用call指令调用的话通过获取返回值就知道调用地址了,那这个问题就不难了呀!

你HOOK函数的时候干嘛非得用JMP呢?不能用CALL么?你用CALL MyFun,这样在MyFun的返回值就是CALL指令后的地址,减去CALL指令长度5,就是被HOOK的函数地址了。
2010-12-28 21:46
0
雪    币: 167
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
但是如果是以FF开头的CALL来调用0x545000
则情况非常复杂,可能是
call eax这种 也可能是call dwrod ptr[]
还可能是call [esp+0x04]等等
CALL指令有好几种形式的  有E8开头的是五个字节的 这个我可以搞定
还有以FF开关的call eax两个字节的  
call dwrod ptr[] 是六个字节的
call [esp+0x04]是三个字节的
问题就是在这里
2010-12-28 21:52
0
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=akinwzh;908771]但是如果是以FF开头的CALL来调用0x545000
则情况非常复杂,可能是
call eax这种 也可能是call dwrod ptr[]
还可能是call [esp+0x04]等等
CALL指令有好几种形式的  有E8开头的是五个字节的 这个我可以搞定
还有以FF开关的call ea...[/QUOTE]

你是要获取被HOOK的函数的地址吧?我假设是啊,呵呵
这个跟调用方式没关系啊,你把被HOOK的函数头改为CALL MyFun这样CALL的下一个地址被压入堆栈,而CALL的下一个地址刚好是被HOOK的函数的地址+5(因为CALL指令为5个字节),你在MyFun获取的返回地址位于被HOOK函数里,这样可以计算HOOK函数的地址,跟调用方式没关系。
2010-12-28 21:56
0
雪    币: 167
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
哦 明白你的意思了 言之有理啊  我马上试验 先谢过了 回头给你分
2010-12-28 22:09
0
雪    币: 167
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
搞定,收工,谢谢ITSailor大侠相助.
2010-12-28 23:26
0
雪    币: 338
活跃值: (103)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
7
学习了
2010-12-30 17:01
0
游客
登录 | 注册 方可回帖
返回
//