寻找原始入口点

Unk*_*own 4 windows executable portable-executable

我希望能够通过查看 PE 标头找出出现在入口点的代码的来源。

比如这段代码就是我的程序的起始代码(401000h)

00401000 >/$ 58             POP EAX                                  ;  kernel32.76E93677
00401001  |. 2D 77360100    SUB EAX,13677
00401006  |. BB 4A184000    MOV EBX,<JMP.&kernel32.VirtualProtect>
Run Code Online (Sandbox Code Playgroud)

我想知道这段代码是从哪里来的。如何在不手动扫描我的文件的情况下找到它?(为了完成这个例子,这里有一个来自同一个文件的 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 
Run Code Online (Sandbox Code Playgroud)

如何从虚拟入口点 (401000h) 到达原始入口点 (200h)?我当然尝试自己解决。但我错过了一些东西。一开始我是这么想的:

.text[ Entrypoint (1000h) - VirtualOffset (1000d) ] = 原始入口点,因为文件对齐 = 200,原始入口点位于我的 .text 部分的最开始,我想我可以将它用于所有可执行文件。

解决了,我在计算原始入口点时犯了愚蠢的错误

.text[ 入口点 - 虚拟偏移量 ] + 文件对齐 = 原始入口点(相对于 .text 部分)

Alo*_*aus 5

要自己定位文件中的偏移量,您需要查看 _IMAGE_NT_HEADERS结构。从中您可以获取您对 ImageBase 感兴趣的成员所在的IMAGE_OPTIONAL_HEADER。您可以使用 EditBin /REBASE 更改其值,因此几乎不需要滚动您自己的工具。

有关如何通过转储确定入口点的参考。

您可以使用 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
Run Code Online (Sandbox Code Playgroud)

对于入口点,图像基值是相关的。但这仅适用于未启用 ASLR 的图像。对于它们,选择随机基地址(128 个不同的基地址中的 1 个)。指示图像是否启用 ASLR 的标志是在 DLL 特性中设置的值 0x40。

8140 DLL characteristics
Run Code Online (Sandbox Code Playgroud)

例如,对于 svchost.exe,对于较旧的程序,它通常设置为 0。

你的,阿洛伊斯·克劳斯