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

Thunk技术的一个改进

 2010-08-15 20:46:25 来源:WEB开发网   
核心提示:更一般化,为了生成正确的机器 码,Thunk技术的一个改进(2),我们用两个函数,一个用于生成机器码的模板,直接替换就好,void ReplaceCodeBuf(BYTE *code,int len, DWORD old,DWORD x)//完成动态值的替换.{int i=0;for (i=0;i<len-4;+

更一般化,为了生成正确的机器 码,我们用两个函数。一个用于生成机器码的模板,另一个函数用于在机器码的 模板中填入需要动态计算产生的值。下面是一个例子:

void ThunkTemplate(DWORD& addr1,DWORD& addr2)//生成机器码
{
  int flag = 0;
  DWORD x1,x2;
  if(flag)
   {
     //注意,这个括号中的代码无法直接执行,因为其中可能含有无 意义的占位数。
    __asm
    {
thunk_begin:
          ;//这里写thunk代码的汇编语句.
           ...

thunk_end:  ;
    }
  }
   __asm
  {
    mov  x1,offset thunk_begin; //取 Thunk代 码段 的地址范围.
    mov  x2,offset thunk_end;
  }
  addr1 = x1;
  addr2 = x2;
}

上面的函数用于生 成thunk的机器码模板,之所以称为模板,是因为其中包含了无意义的占位数,必 须将这些占位数替换为有意义的值之后,才可以执行这些代码。因此,在函数中 thunk代码模板放在一个if(0)语句中,就是避免调用该函数的时候执行thunk代码 。另外,为了能方便的得到thunk代码模板的地址,这里采用一个函数传出thunk 代码的首尾地址。

至于替换占位数的功能是很简单的,直接替换就好。

void ReplaceCodeBuf(BYTE *code,int len, DWORD old,DWORD x)//完成动态值的替换.
{
  int i=0;
  for (i=0;i<len-4;++i)
  {
    if(*((DWORD *)&code [i])==old)
    {
      *((DWORD *)&code[i]) = x;
      return ;
    }
  }
}
这 样使用两个函数:DWORD addr1,addr2;
  ThunkTemplate (addr1,addr2);
  memset(m_thunk,0,100);//m_thunk是一个数组: char m_thunk[100];
  memcpy(m_thunk,(void*)addr1,addr2-addr1);//将代 码拷贝到m_thunk中。
  ReplaceCodeBuf(m_thunk,addr2-addr1,-1, (DWORD)((void*)this));//将m_thunk中的-1替换为this指针的值。

上一页  1 2 3 4  下一页

Tags:Thunk 技术 一个

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