C++反汇编与逆向分析技术揭秘(第2版)
上QQ阅读APP看书,第一时间看更新

第3章
认识启动函数,找到用户入口

3.1 程序的真正入口

VS C++开发的程序在调试时总是从main或WinMain函数开始,这就让开发者误认为它们是程序的第一条指令执行处,这个认知其实是错误的。main或WinMain函数需要有一个调用者,在它们被调用前,编译器其实已经做了很多事情,所以main或WinMain是“语法规定的用户入口”,而不是“应用程序入口”。应用程序被操作系统加载时,操作系统会分析执行文件内的数据[1],并分配相关资源,读取执行文件中的代码和数据到合适的内存单元,然后才是执行入口代码,入口代码其实并不是main或WinMain函数,通常是mainCRTStartup、wmainCRTStartup、WinMainCRTStartup或wWinMainCRTStartup,具体视编译选项而定。其中mainCRTStartup和wmainCRTStartup是控制台环境下多字节编码和Unicode编码的启动函数,而WinMainCRTStartup和wWinMainCRTStartup则是Windows环境下多字节编码和Unicode编码的启动函数。在开发过程中,C++也允许程序员自己指定入口。

本章将详细讲解在进入入口函数main和WinMain之前,VS C++都做了哪些事情。


[1]关于执行文件内的数据组织,请查阅PE格式相关资料,推荐《加密与解密(第3版)》(段钢著)。