C++反汇编03-认识启动函数

selph
selph
发布于 2021-04-13 / 693 阅读
0
0

C++反汇编03-认识启动函数

学习环境: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函数的断点处,查看调用堆栈:

image-20210412172821342

可以看到,程序的启动过程中经历了很多,主要内容还是在Kernel32.dll中调用了我们编译的程序中的mainCRTStartup函数,这个函数经过了一些操作后,又调用了main函数:

在进入main函数之前,会分别获取三个值(环境信息,参数信息,参数个数),然后依次压栈,调用main函数

image-20210412175508628

main函数有3个参数

本章小结

就是通过调试器走一遍程序启动的过程,观察main函数是如何被调用的


评论