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

Thunk 技术的一个改进

 2008-03-27 21:40:28 来源:WEB开发网   
核心提示:本文示例源代码或素材下载 Thunk技术,一般认为是在程序中直接构造出可执行代码的技术(在正常情况下,Thunk 技术的一个改进,这是编译器的任务),《深度探索C++对象模型》中对这个词的来源有过考证(在中文版的162页),相信不会是一件愉快的事情,其实我们回过头来想想,说thunk是knuth的倒拼字,knu

本文示例源代码或素材下载

Thunk技术,一般认为是在程序中直接构造出可执行代码的技术(在正常情况下,这是编译器的任务)。《深度探索C++对象模型》中对这个词的来源有过考证(在中文版的162页),说thunk是knuth的倒拼字。knuth就是大名鼎鼎的计算机经典名著《The Art of Computer Programming》的作者,该书被程序员们称为“编程圣经”,与牛顿的“自然哲学的数学原理”等一起,被评为“世界历史上最伟大的十种科学著作”之一(也不知是谁评的,我没查到,不过反正这本书很牛就是了)。

一般情况下,使用thunk技术都是事先查好指令的机器码,然后将数组或结构体赋值为这些机器码的二进制值,最后再跳转到数组或结构体的首地址。比如在参考文献[1]中的代码:

void foo(int a)
{ printf ("In foo, a = %d
", a); }
unsigned char code[9];
* ((DWORD *) &code[0]) = 0x042444FF; /* inc dword ptr [esp+4] */
       code[4] = 0xe9;    /* JMP */
* ((DWORD *) &code[5]) = (DWORD) &foo - (DWORD) &code[0] - 9; /* 跳转偏移量 */
void (*pf)(int/* a*/) = (void (*)(int)) &code[0];
pf (6);

这是一段典型的thunk代码,其执行结果是“In foo, a = 7”。

可以看到,它定义了一个数组code[9],然后将事先查好的各汇编指令的机器码直接赋值给数组。然后定义一个函数指针等于数组的首地址,最后通过该函数指针调用thunk代码。这里使用了函数指针完成调用,好处是代码比较清晰易读。也可以使用汇编代码jmp或call来完成,这样就不必额外定义一个函数指针。

网络上的thunk代码,基本上都是这个思路。如果你实际写一段这样的代码,一定会发现很麻烦。对着教科书查找每一个汇编指令的机器码,相信不会是一件愉快的事情。其实我们回过头来想想,这件事计算机来做不是最合适吗,编译器不就是做这个事情的吗?

1 2 3 4  下一页

Tags:Thunk 技术 一个

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