CreateProcess进程创建的内核跟踪分析

本文详细介绍了CreateProcess函数在Windows内核中的实现过程,包括打开文件映象、创建进程对象、设置内存映象空间、创建线程、初始化地址空间等关键步骤。通过对kernel32.dll和ntoskrnl.exe的反汇编分析,揭示了从用户态到核心态的进程创建流程,涉及NtCreateProcess、RtlCreateUserProcess等多个关键函数的调用和作用。
摘要由CSDN通过智能技术生成

*[标题]: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  :

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值