一张图系列——从CreateProcess到main函数的过程

整体过程如下:

一张图系列——从CreateProcess到main函数的过程

需要说明两点:

1.在XP中,新进程主线程的启动,会先执行一个用户态的APC,会执行ntdll!LdrInitializeThunk进行程序执行前的一些列初始化操作。其中很重要任务就是加载从Kernel32.dll开始的系统DLL。注意的是,这个APC的插入,根据WRK中的代码看来是在PspUserThreadStartup中进行的:
    最后说一下,经常见到在LoadImageNotify回调中做(用户态)APC注入。由图可见exe&ntdll的回调通知和后面加载的dll回调通知执行的路径不一样。最开始这两个模块是在DbgkCreateThread中执行回调的,后面的是通过MmMapViewOfSection-->MiMapViewOfImageSection执行的回调。而MmMapViewOfSection在回调执行之前会通过LOCK_ADDRESS_SPACE进行进程地址空间的锁定。这个时候再进行(用户态)APC注入,在使用ZwAllocateVirtualMemory分配shellcode的内存空间时会卡死在这里。所以(用户态)APC注入的时机是在ntdll的回调中,这之后就会面临卡死的问题。