如何使用detours hook类成员函数

kunpengwang 2010-07-20 09:41:17
我现在要在一个进程中创建另一个进程,然后hook这个新创建的进程调用的类成员函数,不知道这样可行与否,请哪位用过detours的大牛帮忙指点一下,非常感谢啦!我的邮箱是815592850@qq.com。
...全文
300 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
kunpengwang 2010-07-28
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <windows.h>
#include "detours.h"
#pragma comment(lib,"detoured.lib")
#pragma comment(lib,"detours.lib")

class CMember
{
public:
void Target(void);
};

void CMember::Target(void)
{
printf(" CMember::Target! (this:%p)\n", this);
}

//////////////////////////////////////////////////////////////// Detour Class.
//
class CDetour /* add ": public CMember" to enable access to member variables... */
{
public:
void Mine_Target(void);
static void (CDetour::* Real_Target)(void);

// Class shouldn't have any member variables or virtual functions.
};

void CDetour::Mine_Target(void)
{
printf(" CDetour::Mine_Target! (this:%p)\n", this);
(this->*Real_Target)();
}
void (CDetour::* CDetour::Real_Target)(void) = (void (CDetour::*)(void))&CMember::Target;

int main(int argc, char **argv)
{
(void)argc;
(void)argv;

//////////////////////////////////////////////////////////////////////////
//
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)CDetour::Real_Target,
(PVOID)(&(PVOID&)CDetour::Mine_Target));
LONG l = DetourTransactionCommit();
printf("DetourTransactionCommit = %d\n", l);
printf("%p\n",((PVOID&)(CMember::Target)));

//////////////////////////////////////////////////////////////////////////
//
CMember target;

printf("Calling CMember (w/o Detour):\n");
(((CDetour*)&target)->*CDetour::Real_Target)();

printf("Calling CMember (will be detoured):\n");
target.Target();//在本程序中调用类成员函数能够HOOK成功。

//创建新的进程,希望能HOOK到该进程中调用的类成员函数Target(),但不能成功。
STARTUPINFO ss;
memset(&ss,0,sizeof(STARTUPINFO));
ss.cb = sizeof(STARTUPINFO);
ss.dwFlags = STARTF_USESHOWWINDOW;
ss.wShowWindow = SW_SHOW;
PROCESS_INFORMATION pp; //必备参数设置结束
TCHAR commandline[100]=L"test.exe";//在该程序中调用了类成员函数Target(),但不能HOOK成功。
int r = CreateProcess(NULL,commandline,NULL,NULL,FALSE,0,NULL,NULL,&ss,&pp);
printf("%d\n",GetLastError());

return 0;
}
kunpengwang 2010-07-28
  • 打赏
  • 举报
回复
不好意思,第一次发贴,马上把例子整理一下发上来。
[Quote=引用 1 楼 wgw2011 的回复:]

帮顶!最好发个例子,大家更清楚!
[/Quote]
kunpengwang 2010-07-28
  • 打赏
  • 举报
回复
不好意思,第一次发贴,马上把例子整理一下发上来。
[Quote=引用 1 楼 wgw2011 的回复:]

帮顶!最好发个例子,大家更清楚!
[/Quote]
wgw2011 2010-07-22
  • 打赏
  • 举报
回复
帮顶!最好发个例子,大家更清楚!

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧