为什么程序入口点变成了'sub esp, 1C'?

逆向工程 ollydbg 调试 C++
2021-06-29 02:41:58

我用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 从正确的入口点开始吗?

1个回答

不,这不是错误。这可能是因为您将可执行文件的入口点地址(Olly 中断的位置)与main()函数的地址(您希望它中断的位置)混淆了您应该在main()那里手动定位并设置断点。

在执行流程到达之前,幕后有很多事情要做main()首先获得控制权的代码隐藏在编译器提供的 C 运行时 (CRT) 库中,并在您链接可执行文件时自动链接。这段代码(恰如其分地命名为 CRT 启动)负责在 C 程序启动时设置各种东西,主要是初始化 C 运行时的所有内部(还有很多其他的东西我不会在这里提到),执行C++ 静态对象的构造函数调用,最后调用你的main(). 所以为了让事情顺利进行,链接器设置了这个启动机器内部的入口点,这正是我们观察到的。

注意:以不链接 C 运行时库为代价,可以从可执行文件中删除所有 CRT 内容。不确定这是否是您想要的。