科锐三阶段项目---CreateProcess流程分析
标 题: 【原创】CreateProcess流程分析。
作 者: pyq逍遥
时 间: 2010-06-03,16:26:42
链 接: http://bbs.pediy.com/showthread.php?p=819417#post819417
工具: IDA5.2, WinDbg, Ollydbg
平台: Windows XP xp3
这个项目是本人在科锐和同学一起完成的项目,各有分工,我的任务是分析CreateProcess从用户态到内核态的整体流程框架(部分函数的具体实现由其他同学的完成)。
声明:由于本人能力有限,文中必然有错漏之处,恳请读者不吝赐教.(第一次写文章
)
这里为了方便大家查阅,给出其他同学分析的
CreateProcess函数的整体流程分析:http://bbs.pediy.com/showthread.php?p=819417#post819417
NtCreateProcessEx的分析:http://bbs.pediy.com/showthread.php?t=114958
MmInitializeProcessAddressSpace的分析:http://bbs.pediy.com/showthread.php?t=114956
内核创建进程之创建节区分析:http://bbs.pediy.com/showthread.php?t=114943
线程创建流程分析:http://bbs.pediy.com/showthread.php?t=114929
异常分发:http://bbs.pediy.com/showthread.php?t=114945
进程句柄表分析:http://bbs.pediy.com/showthread.php?t=114820
ObCreateObject函数的分析:http://bbs.pediy.com/showthread.php?t=114730
ObInsertObject函数的分析:http://bbs.pediy.com/showthread.php?t=114734
以下是我的分析:
目录:
一:创建进程的大体流程。
二:3环进程的创建分析。
三:0环创建进程的分析。
四:3环创建线程的分析。
五:0环创建线程的分析。
一. 创建进程的大体流程:
创建进程的过程就是构建一个环境,这个环境包含了很多的机制 (比如自我保护, 与外界通信等等)。 构建这个环境需要两种“人”来协调完成(用户态和内核态),他们各有分工,其中用户态提供原料(提供创建的那些参数), 内核态负责来构建这个环境,由于环境是由内核态构建的,因此他持有这个环境的控制权, 而用户由于提供了原料, 因此他具有使用权。 内核态开始构建环境中的基础设施(进程对象,等等),在构建完基础设施后,内核态通知用户态基础设施构建已经完成,是否需要继续构建其他设施,于是用户态通知内核态继续构建一条通道(既创建线程),方便两边的通信,当用户态接收到线程创建完毕的信息后,便可以开始使用这个环境(投入生产),以后缺啥补啥
。
二. 3环进程的创建分析:
CreateProcesssA的分析:
在CreateProcessA函数中调用了CreateProcessInternalA,调用该函数时,增加了两个参数(一头一尾加了个零参数),在该函数里面也没看到对这两个参数的引用,而是直接传递给CreateProcessInternalW函数。
在CreateProcessInternalA中,首先检查了参数 lpCmdLine, 判断是否为0,不为0则将lpCmdLine初始化为UNICODE字符串, 为0则做了几个局部变量赋值后跳过初始化为UNICODE字符串。接着继续检查参数,先将lpStartupInfor的内容拷贝到一个局部变量, 然后判断参数lpApplicationName是否为0,不为0则参数转换为UNICODE字符串,为0则跳过转换继续判断参数lpCurrentDirectory是否为0,这个和参数lpAppLicationName的判断逻辑是一样的。接着判断STARTUPINFOA.lpReserved域是否为0(MSDN上说在调用CreateProcess前,要把lpReserved设置为NULL ,不过我试了下,不为0也没问题。),该域不为0则和其他字符串参数一样做UNICODE的转换,后面还判断STARTUPINFOA中的几个字符串的域,不为0的都作了下转换。最后调用了CreateProcesssW函数, 看上面的步骤大家应该知道了其实CreateProcessInternalA函数只是对字符串参数或者结构体中包含字符串类型的域的作了检查和转换工作,然后就调用了下层函数。(附图)

分析CreateProcesssW的大概流程:
1. 将参数 保存到局部变量中。
2. dwCreationFlags 的值至少由一个标志组合成(一些创建标志和优先级类型),首先屏蔽 CREATE_NO_WINDOW 标志,代码如下:
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
