2013-09-21 48 views
1

我无法完全理解地址跳转表的工作原理。地址跳转表

基本上,编译文件时,编译器知道在内存中设置dll函数的位置,但是一旦执行应用程序,由于地址之间的冲突,某些函数地址可能会改变它们在内存中的位置。

例如:编译器在地址40000中加载函数GetModuleHandle,并以某种方式在另一个函数GetModuleFileName中加载相同的地址。

根据函数在应用程序中的访问方式,windows加载程序将在地址跳转表中添加第二个函数,并且在调用第一个函数时,加载程序将循环访问地址跳转表并更改函数的地址到主地址调用和第一功能将在地址跳转表

这是地址跳转表是如何工作的方式去?

+0

很难使你的榜样的意义,但一切你想知道的结合是在[这本杂志的文章(http://msdn.microsoft.com /en-us/magazine/cc301808.aspx)。 –

回答

1

跳转表只是转到(跳跃)指令的列表,可以指向任何地方。

在您的示例的分支表是代码块住在40000的偏移从被计算,然后将实际跳转指令是跳转到40000 +偏移。

下面是一些伪代码:

# x can be one of 0 1 2 
     y = x*8;     # create offset 4 is the size of instructions 
     goto jumptable(y);   # branch into 'table' of branch instructions 
/* start of branch table */  # 
# your 40000: 
jumptable: 
     goto errorfunc1;   # x= 0 oops 
     goto func2;    # x= 1 
     goto func7;    # x= 2 
#... rest of branch table 
errorfunc1: 
    call oops; 
func2:  
    call function2; 
func7: 
    call function7;