学习环境:Windows 10 20H2 + Visual Studio 2019
参考书籍:《C++反汇编与逆向分析技术揭秘》
程序的真正入口
调试时,程序总是从main函数或WinMain函数开始执行
而这个函数并不是程序执行的第一个函数,而是程序执行过程中调用的一个函数
应用程序被系统加载时,操作系统会分配文件内的数据(解析PE结构),分配相关资源,读取执行文件中的代码和数据到内存中,然后才是执行入口代码
入口代码通常是mainCRTStartup/wmainCRTStartup、WinmainCRTStartup/wWinmainCRTStartup,当然也可以自定义入口
了解启动函数
书上用VC++6.0讲解的,这里我用VS2019来走一遍这个观察流程
试验:观察程序启动流程
测试代码:
在mian函数中用断点断下来
#include <stdio.h>
int main() {
__asm {
int 3;
}
return 0;
}
反汇编分析
拖入x32dbg,执行到main函数的断点处,查看调用堆栈:
可以看到,程序的启动过程中经历了很多,主要内容还是在Kernel32.dll中调用了我们编译的程序中的mainCRTStartup函数,这个函数经过了一些操作后,又调用了main函数:
在进入main函数之前,会分别获取三个值(环境信息,参数信息,参数个数),然后依次压栈,调用main函数
main函数有3个参数
本章小结
就是通过调试器走一遍程序启动的过程,观察main函数是如何被调用的