Thunk技术的一个改进
2010-08-15 20:46:25 来源:WEB开发网上面的函数有几个地方需要说明:
1、 为了能适应两种不同的成员函数调用约定,这里写了两份代码。通过参数 calltype决定拷贝哪一份代码到缓冲区。
2、本来一条jmp xxxx;指令这里 分解为两条指令:
mov eax,-2;
jmp eax;
这是由汇 编语言的特点决定的。直接写jmp -2是通不过的(根据地址的不同,jmp汇编后可 能出现好几种形式。这里必须出现一个真实的地址以便汇编器决定jmp类型)。
3、如果对this指针的知识不清楚,请参考我在vc知识库的另外一篇文章 《直接调用类成员函数地址》。
设置thunk代码的完整代码如下:
DWORD FuncAddr;
GetMemberFuncAddr_VC6 (FuncAddr,&CTimer::CallBcak);
DWORD addr1,addr2;
ThunkTemplate(addr1,addr2,0);
memset(m_thunk,0,100);
memcpy(m_thunk,(void*)addr1,addr2-addr1);
ReplaceCodeBuf (m_thunk,addr2-addr1,-1,(DWORD)((void*)this)); //将-1替换为this指针.
ReplaceCodeBuf(m_thunk,addr2-addr1,-2,FuncAddr); //将-2替换为 成员函数的指针.
如果你还想和以前一样直接在数组中赋值机器码(毕 竟这样看起来很酷,我完全理解)。那也可以这样,调用ThunkTemplate生成 m_thunk后,打印出该数组的值,而后在程序中直接给m_thunk数组赋值,就象网 上大部分thunk代码那样,当然在调用前要多一个步骤就是替换掉占位数。不过无 论如何,调用这两个函数生成机器码应该比手工查找方便多了,如果你也这样认 为,那就算我这篇文章没白写。
本文配套源码
更多精彩
赞助商链接