我希望能够通过查看PE标头找出出现在入口点的代码的位置。
例如,这段代码是我程序的起始代码(401000h)
00401000 >/$ 58 POP EAX ; kernel32.76E93677
00401001 |. 2D 77360100 SUB EAX,13677
00401006 |. BB 4A184000 MOV EBX,<JMP.&kernel32.VirtualProtect>
我想知道这段代码的来源。如何在不手动扫描文件的情况下找到它? (为了完成示例,这里是来自同一文件的hexdump,代码现在位于200h)
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
00000200 58 2D 77 36 01 00 BB 4A 18 40 00
如何从虚拟入口点(401000h)进入原始入口点(200h)? 我当然试着自己解决它。但是我错过了一些东西。起初我想:
.text [Entrypoint(1000h) - VirtualOffset(1000d)] =原始入口点 由于文件对齐= 200,并且原始入口点位于我的.text部分的最开头,我想我可以将它用于所有可执行文件。
解决了,我在计算原始入口点时犯了愚蠢的错误
.text [入口点 - 虚拟偏移量] +文件对齐=原始入口点(相对于.text部分)
答案 0 :(得分:4)
要自己在文件中找到偏移量,您需要查看_IMAGE_NT_HEADERS结构。从这里你可以得到IMAGE_OPTIONAL_HEADER 你对ImageBase感兴趣的成员是。您可以使用EditBin / REBASE更改其值,因此几乎不需要使用自己的工具。
供参考,了解如何通过dumpbin确定入口点。
你可以使用 dumpbin / headers
dumpbin /headers \Windows\bfsvc
Dump of file \Windows\bfsvc.exe
PE signature found
File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
14C machine (x86)
4 number of sections
4A5BBFB3 time date stamp Tue Jul 14 01:13:55 2009
0 file pointer to symbol table
0 number of symbols
E0 size of optional header
102 characteristics
Executable
32 bit word machine
OPTIONAL HEADER VALUES
10B magic # (PE32)
9.00 linker version
DE00 size of code
2000 size of initialized data
0 size of uninitialized data
4149 entry point (01004149)
1000 base of code
F000 base of data
1000000 image base (01000000 to 01011FFF)
1000 section alignment
200 file alignment
对于入口点,图像基值是相关的。但这仅适用于未启用ASLR的图像。对于他们,选择随机基地址(128个不同的地址中的1个)。 指示图像是否启用ASLR的标志是值0x40,它在DLL特性中设置。
8140 DLL characteristics
例如,对于svchost.exe,它设置为较旧的程序,通常为0。
此致, Alois Kraus
答案 1 :(得分:0)
看一下这个帖子,包括一个详细解释的答案:Calculating the file offset of a entry point in a PE file
AddressOfRawEntryPoint(在EXE文件中)= AddressOfEntryPoint + .text [PointerToRawData] - .text [VirtualAddress]