1

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

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

例如:编译器在地址 40000 中加载函数,并且不知何故在同一地址中加载了GetModuleHandle另一个函数。GetModuleFileName

根据应用程序中函数的访问方式,windows加载器将在地址跳转表中添加第二个函数,当第一个函数被调用时,加载器将循环遍历地址跳转表并将函数的地址更改为主地址。用于调用,第一个函数将进入地址跳转表

这是地址跳转表的工作方式吗?

4

1 回答 1

1

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

在您的示例中,分支表是位于 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;      
于 2013-09-21T10:45:27.487 回答