WEB开发网
开发学院软件开发VC Thunk技术的一个改进 阅读

Thunk技术的一个改进

 2010-08-15 20:46:25 来源:WEB开发网   
核心提示:上面的函数有几个地方需要说明:1、 为了能适应两种不同的成员函数调用约定,这里写了两份代码,Thunk技术的一个改进(4),通过参数 calltype决定拷贝哪一份代码到缓冲区,2、本来一条jmp xxxx;指令这里 分解为两条指令:mov eax,-2;jmp eax;这是由汇 编语言的特点决定的,调用这两个函数生成

上面的函数有几个地方需要说明:

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代码那样,当然在调用前要多一个步骤就是替换掉占位数。不过无 论如何,调用这两个函数生成机器码应该比手工查找方便多了,如果你也这样认 为,那就算我这篇文章没白写。

本文配套源码

上一页  1 2 3 4 

Tags:Thunk 技术 一个

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接