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

时间:2018-08-13 12:53:21

标签: c debugging assembly symbols ollydbg

编写一个简单的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
...

但是,在hello_world.exe调试器中加载x64dbg文件时, 未显示_main符号,如下面的符号列表所示 选择hello_world模块时。

enter image description here

enter image description here

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

关于如何获取符号列表中包含的_main符号的任何想法?

1 个答案:

答案 0 :(得分:3)

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

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

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

Entry-point of the PE with an automatic breakpoint, shown in the exported symbols of the binary

此外,x64dbg将在“ ntdll”上中断,使您可以通过忍者使用CTRL + F9(请注意TLS初始化回调)到达入口点。

要进入main,您可以单步执行代码,直到在.text部分中找到对地址的调用,或者仅是随后有两个调用cexit和{{ 1}}。

同样,考虑到使用ExitProcess检索到的_main的偏移量,objdumpt -t的VA为_main + BASE ADDRESS + .text RVA。 br /> 就我而言,这是__main OFFSET

The call to the <code>main</code> is followed by a call to <code>cexit</code> and <code>ExitProcess</code>