所以我试图学习如何调试我没有符号文件的文件。最常见的建议是发出bp $exentry或bu @$exentry。但是,这些都不起作用。一旦我g的可执行文件中断ntdll32!LdrpDoDebuggerBreak+0x2c。调用堆栈中没有任何内容提供任何有用的信息。如果我g再次发出,可执行文件将运行到终止。
关于如何在main()不手动单步执行所有启动代码的情况下到达的任何建议?
所以我试图学习如何调试我没有符号文件的文件。最常见的建议是发出bp $exentry或bu @$exentry。但是,这些都不起作用。一旦我g的可执行文件中断ntdll32!LdrpDoDebuggerBreak+0x2c。调用堆栈中没有任何内容提供任何有用的信息。如果我g再次发出,可执行文件将运行到终止。
关于如何在main()不手动单步执行所有启动代码的情况下到达的任何建议?
确定你是否有正确的断点地址
发出lm没有符号的 exe 将显示为
0:000> lm
start end module name
00400000 0040f000 image00400000 (no symbols)
比较NtHeader->AddresssOfEntrypoint有@$exentry
0:000> r $t0 = image00400000
0:000> ?? ((ntdll!_IMAGE_NT_HEADERS *) @@( poi( @$t0 + 0x3c ) + @$t0 ))->OptionalHeader.AddressOfEntryPoint + @$t0
unsigned int64 0x401280
0:000> ? @$exentry
Evaluate expression: 4199040 = 00401280
如果它们相同设置断点,bp @$exentry或者bp 401280 仅当您的二进制文件中没有调试器检测时,都应该在该地址正确中断
如果你的二进制文件有调试器检测,那么你可能需要检查 DllInitRoutines Tls 回调和其他可爱的技巧
没有任何反调试技巧的输出示例 exe 在下面的 @$exentry 正确中断
0:000> .lastevent
Last event: bc.a70: Break instruction exception - code 80000003 (first chance)
debugger time: Sun Sep 21 01:10:42.015 2014 (UTC + 5:30)
0:000> lm M *im*
start end module name
00400000 0040f000 image00400000 (no symbols)
0:000> $ binary without symbols whose module name is normally shown as imageXXXXXX
0:000> r $t0 = image00400000 ; $ set Pseudo Register to start
0:000> r $t1 = poi(@$t0+3c) ; $ find pointer to Ntheader
0:000> r? $t2 = (ntdll!_IMAGE_NT_HEADERS *) (@$t0 + @$t1) ; set c++ pseudo Register
0:000> ?? @$t2->OptionalHeader.AddressOfEntryPoint + @$t0 ; Find AddressofEntryPoint
unsigned int64 0x401280
0:000> ? @$exentry
Evaluate expression: 4199040 = 00401280
0:000> bp @$exentry
0:000> bl
0 e 00401280 0001 (0001) 0:**** image00400000+0x1280
0:000> g
Breakpoint 0 hit
image00400000+0x1280:
00401280 55 push ebp
0:000>
这not main()将是c runtime init code通常称为的开始,因为XYZ_MainCrtStartUp()您可能需要检查二进制文件才能找到 Main() 如果您知道编译器,您通常可以找到初始化代码,这将是通用代码