进程创建的步骤

进程的创建过程

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,跳转之前将参数放到栈上。

    

    

posted @ 2023-02-16 16:47  psj00  阅读(531)  评论(0编辑  收藏  举报