*[标题]:CreateProcess进程创建的内核跟踪分析
*[作者]:gz1X [gz1x(at)tom(dot)com]
*[来自]:中国黑客联盟 [CHU]
*[正文]:
[实现流程]
——————————————————————
1.打开需要执行的文件(.exe);
2.创建执行体进程对象; //<-------重点
3.创建初始线程; //<-------重点
4.通知WIN32子系统设置新进程和线程;
5.启动执行体开始执行;
6.完成地址空间的初始化,开始执行程序。
[阶段一]
——————————————————————
当我们调用CreateProcess函数时,需要指定一个文件映象,一般是.exe文件。
CreateProcess第一件事就是打开这个文件,为它创建一个文件映射对象。但是并没有真正映射到内存中。
这里需要注意的是,能创建文件映射对象并不代表文件是有效的win32文件,dll文件也能被成功打开。
显然,如果是dll,CreateProcess将失败。
现在我们来验证,反汇编kernel32.dll,可以看到:
.text:7C802367 CreateProcessA proc near ; CODE XREF: LoadModule+126p
//..此处省略
.text:7C80238C push 0
.text:7C80238E call CreateProcessInternalA
.text:7C802393 pop ebp
.text:7C802394 retn 28h
.text:7C802394 CreateProcessA endp
再接着看CreateProcessInternalA函数,跟进去可以看到这里:
.text:7C81DEC2 call CreateProcessInternalW
在往里跟,进CreateProcessInternalW的领空,走过:
.text:7C8197A8 call ds:NtQueryInformationJobObject
到这里:
.text:7C8197D9 cmp [eax], bl
.text:7C8197DB jz loc_7C818CE6
接下来就是关键代码了,挑重点的函数调用列举出来:
.text:7C818D2C call ds:NtAllocateVirtualMemory //设置内存映象空间;
.text:7C818E6B call ds:RtlDosPathNameToNtPathName_U //将DOS文件名转换成NT文件名;
.text:7C818F3A call esi ; NtOpenFile //打开.exe文件;
.text:7C818F71 call ds:NtCreateSection //建立文件映射对象;
.text:7C819098 call ds:NtQuerySection //取得文件映射对象的相关信息;
.text:7C8190E4 call LdrQueryImageFileExecutionOptions
检查是否是一个POSIX文件,是则运行POSIX.EXE;
.text:7C819238 call ds:NtCreateProcessEx
调用系统函数创建进程执行体。
大致上从函数名再结合上面给出的解释,很容易能猜到各个函数实现的功能,由于各个函数都是未公开的,详细函数声明您可以到:
http://undocumented.ntinternals.net/
[阶段二] -0
——————————————————————
为了方便说明,我们先通过Windbg把当前进程的EPROCESS块结构了解清楚:
0:000> dt _eprocess
ntdll!_EPROCESS
+0x000 Pcb : _KPROCESS //<------内核进程块
+0x06c ProcessLock : _EX_PUSH_LOCK
+0x070 CreateTime : _LARGE_INTEGER
+0x078 ExitTime : _LARGE_INTEGER
+0x080 RundownProtect : _EX_RUNDOWN_REF
+0x084 UniqueProcessId : Ptr32 Void //<-------进程标识符
+0x088 ActiveProcessLinks : _LIST_ENTRY
+0x090 QuotaUsage : [3] Uint4B
+0x09c QuotaPeak : [3] Uint4B
+0x0a8 CommitCharge : Uint4B
+0x0ac PeakVirtualSize : Uint4B
+0x0b0 VirtualSize : Uint4B
+0x0b4 SessionProcessLinks : _LIST_ENTRY
+0x0bc DebugPort : Ptr32 Void
+0x0c0 ExceptionPort : Ptr32 Void
+0x0c4 ObjectTable : Ptr32 _HANDLE_TABLE
+0x0c8 Token : _EX_FAST_REF //<-------访问令牌
+0x0cc WorkingSetLock : _FAST_MUTEX
+0x0ec WorkingSetPage : Uint4B
+0x0f0 AddressCreationLock : _FAST_MUTEX
+0x110 HyperSpaceLock : Uint4B
+0x114 ForkInProgress : Ptr32 _ETHREAD
+0x118 HardwareTrigger : Uint4B
+0x11c VadRoot : Ptr32 Void //<-------虚拟地址空间
+0x120 VadHint : Ptr32 Void
+0x124 CloneRoot : Ptr32 Void
+0x128 NumberOfPrivatePages : Uint4B
+0x12c NumberOfLockedPages : Uint4B
+0x130 Win32Process : Ptr32 Void //<-------win32子系统进程块
+0x134 Job : Ptr32 _EJOB
+0x138 SectionObject : Ptr32 Void
+0x13c SectionBaseAddress : Ptr32 Void
+0x140 QuotaBlock : Ptr32 _EPROCESS_QUOTA_BLOCK
+0x144 WorkingSetWatch : Ptr32 _PAGEFAULT_HISTORY
+0x148 Win32WindowStation : Ptr32 Void
+0x14c InheritedFromUniqueProcessId : Ptr32 Void
+0x150 LdtInformation : Ptr32 Void
+0x154 VadFreeHint : Ptr32 Void
+0x158 VdmObjects : Ptr32 Void
+0x15c DeviceMap : Ptr32 Void
+0x160 PhysicalVadList :
CreateProcess进程创建的内核跟踪分析
最新推荐文章于 2023-09-13 13:45:04 发布
本文详细介绍了CreateProcess函数在Windows内核中的实现过程,包括打开文件映象、创建进程对象、设置内存映象空间、创建线程、初始化地址空间等关键步骤。通过对kernel32.dll和ntoskrnl.exe的反汇编分析,揭示了从用户态到核心态的进程创建流程,涉及NtCreateProcess、RtlCreateUserProcess等多个关键函数的调用和作用。
摘要由CSDN通过智能技术生成