【问题标题】:Why is "_main" symbol not found when .exe file is loaded in x64dbg?为什么在 x64dbg 中加载 .exe 文件时找不到“_main”符号?
【发布时间】:2019-01-20 05:11:05
【问题描述】:

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

objdump -t hello_world.exe

然后符号表有一个_main 的条目:

...
[ 32](sec  1)(fl 0x00)(ty  20)(scl   2) (nx 1) 0x00000460 _main
...

但是,当在 x64dbg 调试器中加载 hello_world.exe 文件时, _main符号未显示,从下面的符号列表中可以看出 当hello_world 模块被选中时。

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

知道如何将_main 符号包含在符号列表中吗?

【问题讨论】:

  • 我不知道 x64dbg,但您似乎列出了导入的符号(或者您可能只是在图像中显示了这些符号,但您也有其他符号?)
  • @Jester:用图像更新了问题,显示选择了“hello_module.exe”来显示符号。由于在该模块中声明了_main,并且还由objdump 列出,我希望它会显示在列表中。
  • 但是列表中的所有项目都是导入类型的。 _main 不会是类型导入。
  • @WilliamJBagshaw:谢谢,我明白你的意思了。但是,列表是完整的,所以除了“导入”之外没有其他类型,所以由于某种原因 x64dbg 不显示本地符号。

标签: c debugging assembly symbols ollydbg


【解决方案1】:

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

如果您查看 PE 部分(使用 objdump -h),您会看到 PE 目录中未引用的许多额外部分。
binutils 使用这些来提取DWARF information 并向您展示,例如,符号表。

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

此外,x64dbg 将在 'ntdll` 上中断,允许您使用 CTRL+F9 到达入口点(当心 TLS 初始化回调)。

要访问main,您可以单步执行代码,直到在.text 部分中找到对地址的调用,或者只是在调用之后两次调用cexitExitProcess

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

【讨论】:

  • 感谢您的详尽回答。我很欣赏我必须了解更多主题的许多线索,以便了解答案中的所有细节。但是,答案似乎解决了这个问题,所以我选择接受它:-D
猜你喜欢
  • 2014-10-26
  • 1970-01-01
  • 2019-08-28
  • 2021-11-12
  • 1970-01-01
  • 2013-02-18
  • 2010-10-26
  • 1970-01-01
相关资源
最近更新 更多