进程创建的步骤
进程的创建过程
1、映射EXE文件。
2、创建内核对象EPROCESS。
3、映射系统DLL(ntdll.dll)。
4、创建线程对象ETHREAD
5、系统启动线程,通过APC进入
进入LdrInitializeThunk
LdrpInitialize
_LdrpInitialize
LdrpInitializeProcess
LdrLoadDll 加载DLL
Debugbreak() 如果是调试器启动,那么会触发int 3断点,断到调试器中。
ZwContinue 进入内核中
6、返回到内核后,内核使用线程入口点,将eip设置为ntdll!RtlUserThreadStart函数中(可能在第五步的时候即将返回到用户入口点,此时检测到apc,回到用户空间加载dll,之后返回内核,继续返回用户态的线程入口点,第一个线程就是PE文件入口点),还会跳转到_RtlUserThreadStart等函数
传入两个参数,一个参数为EXE的入口函数OEP地址,再去调用main函数。
另一个参数为进程的PEB地址。
如果再次启动其它线程时,传入的参数包括函数的入口地址,以及函数的参数,如CreateThread启动线程时,需要传入入口函数以及参数地址。
RtlUserThreadStart函数代码如下:
跳转到ntdll!_RtlUserThreadStart,跳转之前将参数放到栈上。