首先,先来说一下为什么需要重定位表,先来观察一段程序
00401000 >/$ 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
00401002 |. 68 1D204000 push 0040201D ; |Title = "PE"
00401007 |. 68 10204000 push 00402010 ; |Text = "Hello World!"
0040100C |. 6A 00 push 0 ; |hOwner = NULL
0040100E |. E8 07000000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA
00401013 |. 6A 00 push 0 ; /ExitCode = 0
00401015 \. E8 06000000 call <jmp.&KERNEL32.ExitProcess> ; \ExitProcess
0040101A $- FF25 08204000 jmp dword ptr [<&USER32.MessageBoxA>>; user32.MessageBoxA
00401020 .- FF25 00204000 jmp dword ptr [<&KERNEL32.ExitProces>; kernel32.ExitProcess
假设上述程序的建议装载地址为0x400000,然而当操作系统装载时,该地址被占用,所以实际地址装载地址为0x500000。
好了,那么你会发现,上述的代码片段中,是不是有些地址需要被修正呢,如第二行代码,其中的40201D肯定就不是原来的值了,50201D才为正确的值,OK,那么下面我们来列出上述程序所有需要被修正的地址
相对虚拟地址 需修正的地址 修正后地址
1003 40201D 50201D
1008 402010 502010
101C 402008 502008
1022 402000 502000