首页
社区
课程
招聘
[求助]Detour Hook遇到的问题
发表于: 2015-3-26 17:33 6018

[求助]Detour Hook遇到的问题

2015-3-26 17:33
6018
最近需要hook一些API,于是想到了Detour。想把需要hook的API都集成进去,然后根据选择的API分别hook。于是代码架构大概为:NewApi.h NewApi.cpp 用来定义和实现需要修改的API,
举例:
static int(WINAPI *OldMessageBoxW)(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType) = MessageBoxW;
int WINAPI MyMessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);

ChangeAPI.h ChangeAPI.cpp 是一个单例,用来保存已经实现的API。
下面问题来了:
1、我在 NewApi.h 中定义了 MyMessageBoxW ,在NewApi.cpp中实现了MyMessageBoxW,
然后在ChangeAPI.cpp中 
DetourAttach(&(PVOID&)OldMessageBoxW, MyMessageBoxW);

函数执行后,hook成功,但是会不停的递归调用 MyMessageBoxW。

2、我把NewApi.h 和 NewApi.cpp去掉,将 MyMessageBoxW 的定义和实现放到 ChangeAPI.cpp中,就能正确hook,且只会调用一次。

跟踪相应汇编后发现,第一种情况时,MyMessageBox中会jmp至 MessageBox的起始地址,
第二种情况会jmp回MessageBox + 5字节地址。

请教下各位,有没有遇到类似或者同样的问题,到底是我用法不对,还是Detour本身存在该bug?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 1112
活跃值: (184)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
[QUOTE=;]...[/QUOTE]
int WINAPI MyMessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);                     声明的时候把WINAPI去掉,是不允许在头文件声明windows api函数
2015-3-26 22:34
0
雪    币: 1112
活跃值: (184)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不同编译器会出现不同情况,是编译器的问题,只要去掉winapi ,写一个新的同样参数的函数,不再是winapi 就可以了
2015-3-26 22:42
0
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
那怎么解释我将该函数放入
DetourAttach
调用的cpp文件中就没有问题呢。
我试了下去除winapi,还是会产生递归调用
2015-3-27 10:26
0
雪    币: 1112
活跃值: (184)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你用的是detours  pro版么?我用的detours pro ,vs2013一切都正常,只是不允许在头文件中加入_stdcall (WINAPI)
2015-3-27 23:36
0
雪    币: 2789
活跃值: (1167)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
改成这样
NewApi.h
extern int(WINAPI *OldMessageBoxW)(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);
int WINAPI MyMessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);


NewApi.cpp
int(WINAPI *OldMessageBoxW)(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType) = MessageBoxW;


一直没明白detours给的例子里的为啥要用static定义...
2015-3-29 19:56
0
雪    币: 2789
活跃值: (1167)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
你上面定义的那个static的OldMessageBoxW,在不同的cpp文件里是不同的变量...
MyMessageBoxW里面调用的实际上还是被Hook的MessageBox的地址 而不是真正API入口,造成了递归递归递归递归递归
2015-3-29 20:08
0
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
果然是这样,正解啊
2015-3-29 20:59
0
游客
登录 | 注册 方可回帖
返回
//