PEheader中入口点地址为0时如何查找OEP?

How to find OEP when the address of entry point is zero in PE header?

我想分析OllyDbg中的一个文件,但是这个文件中的"address of entry point"是0x0000。所以它将 运行 MZ 签名作为 ASM 代码的开始部分。

大多数调试器也无法直接调试它。
我怎样才能找到修改header的原始入口点?

如果 EXE 中的 AddressOfEntryPoint 设置为 0 - 所以 EXE 并且没有此入口点。在这种情况下,为了不崩溃 EXE 必须有 TLS 回调 - 寻找 IMAGE_TLS_DIRECTORY (IMAGE_DIRECTORY_ENTRY_TLS) 并且 AddressOfCallBacks 必须不为 0。所以这是真正的入口点( s) of this EXE - 没有其他选项,否则 EXE 会崩溃。

Most debuggers are also unable to debug it directly.

如果调试器在入口点设置断点,就会发生这种情况。在这种情况下,"entrypoint" 将在 MZ 上 - 当调试器在此处设置断点(0xcc 操作码)时 - 损坏 MZ 签名。结果进程初始化异常(user32.UserClientDllInitialize -> ntdll.CsrClientConnectToServer -> RtlImageNtHeaderEx(错误,因为 MZ 被断点损坏))

但是如果调试器没有在入口点设置断点 - 调试没有问题。

所以解决办法是寻找IMAGE_DIRECTORY_ENTRY_TLS.AddressOfCallBacks或者设置断点到LdrpCallTlsInitializers


这确实是 CLR (.NET) 图像 - 在此图像中,类型入口点是正式的,在 xp 之后不再使用。系统忽略它并调用 mscoree.dll 中的 _CorExeMain 作为入口点。

但是,如果您尝试使用自动将断点设置为入口点的调试器(调试器的想法)进行调试 - MZ (IMAGE_DOS_HEADER) 已损坏。结果 RtlImageNtHeader[Ex] return EXE 0(错误)并且应用程序崩溃(在此调试器下)

0x00000000PE 文件中入口点 Address 的有效值,恶意软件使用此技巧使其调试变得困难。

Visual Studio 可以调试具有 EP == 0.

的二进制文件