编写一个简单的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
模块时。
这很烦人,因为我想在用户开始时创建一个断点
hello_world
中的代码,并使用符号跳转到起始位置
会很方便。
关于如何获取符号列表中包含的_main
符号的任何想法?
答案 0 :(得分:3)
尽管PE支持存储调试信息,但符号表主要是ELF概念。
如果您查看PE部分(使用objdump -h),则会看到PE目录中未引用的许多其他部分。
binutils使用这些来提取DWARF information并向您显示符号表。
x64dbg是纯Windows / PE工具,不了解DWARF。
但是,它将为您显示PE入口点的地址(尽管很少是“ main
”本身的地址),并会自动在其中为您放置一个断点。
入口点显示在检查中的二进制文件的导出符号下。
此外,x64dbg将在“ ntdll”上中断,使您可以通过忍者使用CTRL + F9(请注意TLS初始化回调)到达入口点。
要进入main
,您可以单步执行代码,直到在.text
部分中找到对地址的调用,或者仅是随后有两个调用cexit
和{{ 1}}。
同样,考虑到使用ExitProcess
检索到的_main
的偏移量,objdumpt -t
的VA为_main
+ BASE ADDRESS
+ .text RVA
。 br />
就我而言,这是__main OFFSET