Thunk技术的一个改进
2010-08-15 20:46:25 来源:WEB开发网更一般化,为了生成正确的机器 码,我们用两个函数。一个用于生成机器码的模板,另一个函数用于在机器码的 模板中填入需要动态计算产生的值。下面是一个例子:
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指针的值。
更多精彩
赞助商链接