为什么在 x64dbg 中加载 .exe 文件时找不到“_main”符号?

Equ*_*Dev 1 c debugging assembly symbols ollydbg

编写一个简单的hello_world.c程序,并使用32位MinGW进行编译, objdump可以使用以下命令显示符号表:

objdump -t hello_world.exe
Run Code Online (Sandbox Code Playgroud)

然后符号表有一个条目为_main

...
[ 32](sec  1)(fl 0x00)(ty  20)(scl   2) (nx 1) 0x00000460 _main
...
Run Code Online (Sandbox Code Playgroud)

但是,当hello_world.exex64dbg调试器中加载文件时, _main不会显示该符号,正如hello_world选择模块时从下面的符号列表中可以看到的那样。

在此输入图像描述

在此输入图像描述

这很烦人,因为我想在 中的用户代码开始处创建一个断点hello_world,并且使用符号跳转到开始位置会非常方便。

关于如何获取_main符号列表中包含的符号有什么想法吗?

Mar*_*oom 5

虽然 PE 支持存储调试信息,但符号表主要是 ELF 概念。

如果您查看 PE 部分(使用objdump -h),您将看到许多 PE 目录中未引用的额外部分。
binutils 使用它们来提取DWARF 信息并向您显示符号表等内容。

x64dbg是一个纯Windows/PE工具,不理解DWARF。
但是,它会显示 PE 入口点的地址(尽管很少是“ main”本身的地址),并会自动在此处放置一个断点。
入口点显示在所检查的二进制文件的导出符号下方。

具有自动断点的 PE 入口点,显示在二进制文件的导出符号中

此外,x64dbg 将在“ntdll”上中断,允许您使用 CTRL+F9 来到达入口点(注意 TLS 初始化回调)。

为此,main您可以逐步执行代码,直到找到对 部分中的地址的调用.text,或者只是找到一个调用,然后调用两次cexitExitProcess

_main另外,给定使用isobjdumpt -t的 VA检索到的偏移量_mainBASE ADDRESS+ .text RVA+ __main OFFSET
就我而言,这是4010460h

对 <code>main</code> 的调用之后是对 <code>cexit</code> 和 <code>ExitProcess</code> 的调用