我使用MinGW编译了以下C ++代码,并在OllyDbg 2.01中将其打开。程序停止在以下行:

CPU Disasm
Address   Hex dump          Command                                  Comments
00401570  /$  83EC 1C       SUB ESP,1C
00401573  |.  C70424 010000 MOV DWORD PTR SS:[LOCAL.6],1
0040157A  |.  FF15 68814000 CALL DWORD PTR DS:[<&msvcrt.__set_app_ty
00401580  \.  E8 FBFBFFFF   CALL 00401180


Names in Project1, item 20
  Address = 00401570
  Section = .text
  Type = Export
  Ordinal =
  Name = <ModuleEntryPoint>
  Comments =


但是,这不是我想要的。我更喜欢OllyDbg在以下几行停止:

CPU Disasm
Address   Hex dump          Command                                  Comments
004016B0  /$  55            PUSH EBP                                 ; Project1.004016B0(guessed void)
004016B1  |.  89E5          MOV EBP,ESP
004016B3  |.  83E4 F0       AND ESP,FFFFFFF0                         ; DQWORD (16.-byte) stack alignment
004016B6  |.  83EC 10       SUB ESP,10
004016B9  |.  E8 A2050000   CALL 00401C60
004016BE  |.  C70424 645040 MOV DWORD PTR SS:[LOCAL.4],OFFSET 004050 ; /format => "Hello World!"
004016C5  |.  E8 9E1F0000   CALL <JMP.&msvcrt.printf>                ; \MSVCRT.printf
004016CA  |.  B8 00000000   MOV EAX,0
004016CF  |.  C9            LEAVE
004016D0  \.  C3            RETN


这是一个错误吗? MinGW为什么将SUB ESP, 1C设置为入口点?我可以将Ollydbg设置为从正确的入口点开始吗?

评论

“以下C ++代码”:哪一个?

#1 楼

不,这不是错误。这可能是因为您将可执行文件的入口地址(Olly中断所在的地方)与main()函数的地址(您希望其中断的地方)混淆了。您应该找到main()并在其中手动设置一个断点。

执行流到达main()之前,后台发生了很多事情。首先获得控制的代码隐藏在编译器提供的C运行时(CRT)库中,并在链接可执行文件时自动链接。该代码(恰当地称为CRT启动)负责在C程序启动时进行各种设置,主要是初始化C运行时的所有内部组件(还有很多其他东西我在这里不会提及),执行C ++静态对象的构造函数调用,最后调用main()。因此,为了使事情顺利进行,链接器将入口点设置到此启动机器内部,这正是我们所观察到的。没有链接C运行时库的开销。不确定这是否是您想要的。