为什么在 x64dbg 中加载 .exe 文件时找不到“_main”符号?
Why is "_main" symbol not found when .exe file is loaded in x64dbg?
写一个简单的hello_world.c程序,用32位MinGW编译,
objdump
可以显示符号 table 使用:
objdump -t hello_world.exe
然后符号 table 有一个 _main
的条目:
...
[ 32](sec 1)(fl 0x00)(ty 20)(scl 2) (nx 1) 0x00000460 _main
...
但是,在 x64dbg
调试器中加载 hello_world.exe
文件时,
_main
符号没有显示,从下面的符号列表可以看出
当 hello_world
模块被选中时。
这很烦人,因为我想在用户启动时创建一个断点
hello_world
中的代码,并使用符号跳转到起始位置
会很方便。
知道如何获取符号列表中包含的 _main
个符号吗?
虽然 PE 支持存储调试信息,但符号 table 主要是一个 ELF 概念。
如果您查看 PE 部分(使用 ),您会看到许多未在 PE 目录中引用的额外部分。
binutils 使用这些来提取 DWARF information 并向您显示例如符号 table.
x64dbg 是一个纯粹的 Windows/PE 工具,不理解 DWARF。
然而,它会告诉你 PE 入口点的地址(虽然很少是“main
”本身的地址)并且会自动为你在那里设置一个断点。
入口点显示在正在检查的二进制文件的导出符号下方。
此外,x64dbg 将在“ntdll”上中断,允许您使用忍者 CTRL+F9 到达入口点(注意 TLS 初始化回调)。
要到达 main
,您可以单步执行代码,直到找到对 .text
部分中某个地址的调用,或者只是一个调用,然后是对 cexit
和 cexit
的两次调用ExitProcess
.
此外,给定使用 objdumpt -t
检索到的 _main
的偏移量 _main
的 VA 是 BASE ADDRESS
+ .text RVA
+ __main OFFSET
.
就我而言,这是 4010460h
写一个简单的hello_world.c程序,用32位MinGW编译,
objdump
可以显示符号 table 使用:
objdump -t hello_world.exe
然后符号 table 有一个 _main
的条目:
...
[ 32](sec 1)(fl 0x00)(ty 20)(scl 2) (nx 1) 0x00000460 _main
...
但是,在 x64dbg
调试器中加载 hello_world.exe
文件时,
_main
符号没有显示,从下面的符号列表可以看出
当 hello_world
模块被选中时。
这很烦人,因为我想在用户启动时创建一个断点
hello_world
中的代码,并使用符号跳转到起始位置
会很方便。
知道如何获取符号列表中包含的 _main
个符号吗?
虽然 PE 支持存储调试信息,但符号 table 主要是一个 ELF 概念。
如果您查看 PE 部分(使用
binutils 使用这些来提取 DWARF information 并向您显示例如符号 table.
x64dbg 是一个纯粹的 Windows/PE 工具,不理解 DWARF。
然而,它会告诉你 PE 入口点的地址(虽然很少是“main
”本身的地址)并且会自动为你在那里设置一个断点。
入口点显示在正在检查的二进制文件的导出符号下方。
此外,x64dbg 将在“ntdll”上中断,允许您使用忍者 CTRL+F9 到达入口点(注意 TLS 初始化回调)。
要到达 main
,您可以单步执行代码,直到找到对 .text
部分中某个地址的调用,或者只是一个调用,然后是对 cexit
和 cexit
的两次调用ExitProcess
.
此外,给定使用 objdumpt -t
检索到的 _main
的偏移量 _main
的 VA 是 BASE ADDRESS
+ .text RVA
+ __main OFFSET
.
就我而言,这是 4010460h