2013-09-21 78 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;