我不能完全理解地址跳转表是如何工作的。
例如:编译器将函数GetModuleHandle加载到地址40000,并且不知何故还有另一个函数GetModuleFileName被加载到相同的地址。
根据函数在应用程序中的访问方式,windows加载器将在地址跳转表中添加第二个函数,当第一个函数被调用时,加载器将遍历地址跳转表,并将函数的地址更改为主地址以供调用,第一个函数将进入地址跳转表。
这是地址跳转表的工作方式吗?
发布于 2013-09-21 18:45:27
分支表只是一个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; https://stackoverflow.com/questions/18931488
复制相似问题