首先,先来说一下为什么需要重定位表,先来观察一段程序
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。</

本文详细介绍了PE文件结构中的重定位表,解释了为什么需要重定位以及其工作原理。通过示例说明了重定位过程中地址修正的过程,并探讨了重定位表的结构、元素含义以及如何遍历和结束重定位块。最后,通过对简单DLL模块的分析,验证了重定位表的正确性。
最低0.47元/天 解锁文章
1054

被折叠的 条评论
为什么被折叠?



