我无法完全理解地址跳转表是如何工作的。
基本上,在编译文件时,编译器知道在内存中设置dll函数的位置,但是一旦执行了应用程序,由于地址之间的冲突,某些函数地址可能会改变它们在内存中的位置。
例如:编译器在地址40000中加载函数GetModuleHandle
,不知何故还有另一个函数GetModuleFileName
加载到同一地址。
根据应用程序中如何访问函数,Windows加载器将在地址跳转表中添加第二个函数,当第一个函数被调用时,加载器将遍历地址跳转表并将函数的地址更改为调用的主要地址和第一个函数将进入地址跳转表
这是地址跳转表的工作方式吗?
答案 0 :(得分: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;