转自:/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 pTestFun = (TESTFUN)&(Test.m_Thunk);
char* psz = "test";
pTestFun((void*)psz);
return 0;
}