ATL Thunk机制的一个例子

来源:互联网 发布:ug编程和模具设计 编辑:程序博客网 时间:2024/05/19 01:29

转自:http://blog.csdn.net/tttyd/article/details/4562233

//涂远东 2009 09 17 深圳//声明函数类型。typedef void (*TESTFUN)(void*);//定义修改代码的结构。#pragma pack(push,1)struct Thunk{DWORD   m_mov;          // 修改参数指令DWORD   m_this;         //修改后的参数BYTE    m_jmp;// jmp TESTFUN,跳转指令。DWORD   m_relproc;// relative jmp,相对跳转的位置。//初始化跳转代码。void Init(TESTFUN pFun, void* pThis){//设置参数指令m_mov = 0x042444C7;  //C7 44 24 0C//设置修改后的参数m_this = PtrToUlong(pThis);//设置跳转指针。m_jmp = 0xe9;//设置跳转的相对地址。m_relproc = (int)pFun - ((int)this+sizeof(Thunk));//把CPU里的缓冲数据写到主内存。FlushInstructionCache(GetCurrentProcess(),this, sizeof(Thunk));}};#pragma pack(pop)//测试动态修改内存里的指令数据。class CTest{public://保存动态修改代码的内存。Thunk m_Thunk;//真实运行的函数。static void TestFun(void* p){CTest* pTest = (CTest*)p;pTest->Print();}void Print(){printf("这里仅仅是一个测试/n TestFun函数的参数被修改了/n");}};int main(int argc, char* argv[]){//如下调用这个类://测试运行。CTest Test;Test.m_Thunk.Init(Test.TestFun,&Test);TESTFUN pTestFun = (TESTFUN)&(Test.m_Thunk);char* psz = "test";pTestFun((void*)psz); return 0;}