CreateProcess

Windows 进程创建完整过程(除去细节)

当前流程是分析WinXP x86得到的,在最新版本Windows上不一定正确,但是可以做一个参考,

由于我这里符号并不全,所以导致我这里有些东西看到的可能是错误的,误导了我,然后我就做了个错误的记录,

有缘人如果看到的话,可以帮我指正一下,我会很高兴。

工作挺忙的,三天的业余时间,哎,个人水平问题吧,还是没有办法详细地分析出完整套路,算是个简要分析吧。

 

差点忘记了,我这里分析的文件是 kernel32.dll 和 ntoskrnl.exe

 

 

1:入口  CreateProcessW

当我们在应用层调用CreateProcessW的时候,参数稍作整理,会直接调用到 CreateProcessInternalW

(CreateProcessA,会调用 CreateProcessInternalA,然后整理了参数也会调用到CreateProcessInternalW)

 

 

2:CreateProcessInternalW

首先,开场是大概是2000来行的汇编指令,判断进程创建参数,以及文件安全属性等等乱七八糟没用的,

 

然后是 NtOpenFile NtCreateSection 一系列的函数,获取文件句柄和section句柄

 

中间经过一系列的文件类型判断,有效性判断,及属性判断,

 

调用 NtQuerySection 获取段属性,

 

判断是否需要Debug方式启动,并且做对应的设置,

 

加载 advapi32.dll ,然后获取 CreateProcessAsUserSecure 函数地址,但是并没有使用它,

 

很可能是根据这个函数是否存在,来判断当前操作系统版本,后面直接调用 NtQuerySystemInformation 来获取操作系统信息,参数很奇怪,0x47,可能就是特殊的情况,

(有空再看)

 

中间判断了一个位,然后调用了DBG相关的函数,(可能是判断DBG相关吧)

 

最后就是一个Nt函数,NtCreateProcessEx,进入内核了,(也可能是个Zw函数)

 

 

3:NtCreateProcessEx

上一部分,调用ntdll 的ZwCreateProcessEx/NtCreateProcessEx 之后,

进入内核,走SSDT表,第48项,进入NtCreateProcessEx,

 

判断当前执行模式,内核模式的话,就往下走,否则,改了模式往下走

调用PspCreateProcessEx,

 

1)获取父进程信息,

并且继承父进程的执行位置

 

2)给子进程创建一个EPROCESS,然后初步设置它

 

3)初始化子进程的线程列表

 

4)增加引用计数,并且继承父进程的QuotaBlock,如果父进程存在的话,否则用系统默认的

 

5)继承父进程的DeviceMap,如果有父进程,否则用系统默认的

 

6)如果父进程存在,那么再继承父进程的属性

 

7)如果参数Section句柄存在,那么就获取对象,并且保存,后面需要用,保存到进程中

这个Section,实际上是上面应用层CreateProcessInternalW函数创建的那个Section

 

8)如果Debug端口存在,那么就获取它的对象,如果不存在,则从父进程继承

上面的第一个jnz跳转到下面,下面的最后一个jmp回到上面的cmp处

 

9)初始化PrimaryToken

 

10)中间继续初始化各种乱七八糟东西,包括

初始化进程地址空间

如果当前进程EProcess不存在,就用另外一种方法,初始化进程空间

PCB

优先级组,因为后面直接就用EPROCESS了,所以我推断这里可能同时也初始化了EPROCESS剩下的部分

 

11)如果 section存在,那么attach到子进程,

在很深的位置先循环调用了N次 MiMapViewOfPhysicalSection 函数来映射物理内存地址,然后

初始化section,根据section展开文件到子进程

这里有else,但是一般来说,不会走到else里面,因为如果是有效PE,那么section肯定存在,这是应用层已经找到的,然后转化成的内核对象,

然后向自己内部再影射一个子进程模块的内存,映射了之后,就释放掉,只是判断是否成功,如果成功,什么都不干,不成功就返回到label_48

(走到else里面也是同样的操作,只不过目标section不存在,那么就只能映射自己的)

 

///中间有一块这段代码,个人能力问题,无法看出这里是做什么的,因为结构体识别可能是有一定的问题

/// 

 

12)初始化PEB

PEB

实际上这里有点问题,v74在前面的时候,是必须 hSection 存在的时候,才会 ==1,也就是说必须hSection存在,才会进入外层if

但是外层if进入了之后,反过来说,就是hSection肯定存在,肯定不会走else,但是为什么它这么写

 

13)初始化APC?不知道是否真的是这样,但是清理APC的功能,这里是第一次使用

然后判断APC对列里面有没有APC,如果有的话,触发一个软中断,去运行它

 

14)做一个 AccessState ,然后使用它把子进程EPROCESS放到进程句柄表中,返回一个句柄

然后AccessState就没用了,释放掉

最后设置一下进程优先级组

 

15)接近尾声,这里获取当前进程允许的访问权限位

 

16)收尾

设置进程创建时间,然后返回进程句柄,减掉自己的引用计数,防止泄露

 

 

4:CreateProcessInternalW,回到应用层了

沿着第二部分的NtCreateProcessEx继续来看,这里已经回到应用层了,

继续往下,并且这里拿到了一个 新进程的句柄,也就是第一个参数

 

一大片代码,设置进程优先级和处理模式相关

NtSetInformationProcess

NtAllocateVirtualMemory

申请了一块内存,然后好像也没用过,

创建命令行参数,

初始化stdin stdout stderr

BasePushProcessParameters

就是直接dup出来,然后给对面进程用

给目标进程创建一个栈

给线程构建上下文

然后,主线程就可以跑了

(上下文构建中,其实有个小细节)

其实在 BaseInitializeContext 函数中,根据第五个参数,会判断走哪个启动函数

如上,进程启动,最后一个参数,写死为0,则会走最下面的 BaseProcessStartThunk 函数

而 BaseProcessStartThunk 内部还调用了。。。

再往里看,就是这样

通过对比另外两个函数,可以推断,这里应该就是走主线程 _tmainCRTStartup / wWinMainCRTStartup 位置的了

 

 

5:NtCreateThread 开始主线程部分

应用层陷入内核,走SSDT,到了驱动里面的NtCreateThread,

进来还是模式校验,

然后走

 

1)获取进程对象

 

2)创建ETHREAD

 

3)在进程句柄表中创建线程的handle

 

4)创建TEB

初始化TEB

 

5)中间使用了超级大篇幅来初始化这个ETHREAD

初始化了之后,这一块,就是准备开跑了,

进程的活动线程数++,然后插入列表,然后启动线程,

 

6)直到这里,这里是进程创建回调,注意哦,这里是在父进程里面调用的

 

7)判断作业是否在工作,所在进程是否在作业中,如果在的话,特殊处理,让他去完成,并且清理APC

 

8)压轴戏,线程创建回调

 

9)两个回调结束之后,似乎就没什么好做得了,把线程对象插入句柄表

这里的插入和前面的创建不是一个东西,那个ExCreateHandle 是创建全局句柄表,

这里是插入进程句柄表

 

10)后面就是枯燥乏味的收尾工作

写时间戳,写访问权限,解对象引用,

再清理一次APC,

然后把线程句柄返回,

 

11)补充一下吧

正常结束时,这里实际上是有个收尾的小工作的,

这里面KeReadyThread 是关键操作,它把 ETHREAD 放到了进程 KPROCESS 的 ReadyListHead 里面,

这样应该就可以swapcontext了,

其实它内部还有众多关键函数,如 KiSetSwapEvent ,看名字和内部实现,似乎就是抢抢占时间片去了。

 

我所关心的整个部分,实际上就是,

进程、线程创建回调的触发时机,实际上触发的进程上下文都在父进程中,触发时机都在PspCreateThread中,

因为实际工作中,我们能用到的部分,也就这里了

 

 

6:回到应用层

这里直接判断返回值,有问题的话,直接错误返回,

没有问题的情况下,那么继续往下做判断

 

1)通知Csrss

由于我这里符号不全,我想下面的ExitStatus 应该是 Csrss返回的吧。

一旦有问题,立刻退出

 

2)指派进程到一个作业中

 

3)后面直到最后,通篇都是整理内存,释放空间了,

基本上就没有干别的活,

最后才是函数返回。

 

这样,整体流程结束。

 

 

补充一下,镜像加载回调的位置吧,

这个,实际上,镜像加载回调被调用的时候,已经和镜像没什么关系了,

而且镜像早早已经被铺到内存中了

在InitThread之前,是初始化TEB部分,这里初始化了TEB之后,设置了一个回调函数

创建应用层线程PspUserThreadStartup

进入这个函数里面,可以看到

有这样一个判断,由于我实在没有找到那个6代表什么,可能是2|4,但是我没找到,所以无法知道它是什么,

进入函数之后,里面会进行一次镜像加载回调状态的判断,如果非隐藏状态,那么再经过一个函数,

就会到这里,联系外面的函数,可以清晰地看出,这里就是镜像加载回调的调用位置,

总地来说,由于镜像加载回调有可能是异步调用的,所以无法确切地知道它的位置,

但是它的位置实际上是在前两个回调之后的(其实已知,这些都是废话)

 

 

 

重点:

在CreateProcess 函数中,会开辟子进程的进程空间,

然后同时会map子进程的主模块到进程空间中,这时不会调用镜像加载回调和进程创建回调,

到了CreateThread 里面,整理了线程各种信息之后,

会先调用进程创建回调,

然后调用线程创建回调,

这时,当前进程上下文还是在父进程中,

最后,当线程跑起来之后,

第一个回调会被触发,就是主模块的镜像加载回调,

这时剩下的就是其他模块的镜像加载回调了,

后面就不是很重要了,前面这个流程应该是最重要的。

转载于:https://www.cnblogs.com/suanguade/p/5844296.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MVC架构模式(2)

简介: MVC最初是在Smaltalk_80中被用来构建用户界面的。M代表模型Model,V代表视图View,C代表控制器Controller。 Model模型层,可以简单理解就是数据层,用于提供数据。在项目中,(简单理解&#x…

ios学习之旅---指针也不难

1、认识指针#include <stdio.h> //基本数据类型作为函数參数传递是值传递 //void moveFront(int x ,int y) //{ // x x 2; //} void test() {// 确定当前坐标int x 20;int y 150;printf("%p\n",&x);printf("%lu\n",&x);*((int *)(0…

符合skyline的3dml网络发布服务

技术交流群&#xff1a;665060698使用java web实现&#xff1b;接口符合skyline的3dml模型形式&#xff1b;通过简单的发布界面&#xff0c;直接发布3dml模型&#xff1b;实现te pro在客户端读取数据&#xff1b;实现在te pro客户端的对应查询功能&#xff1b;负载可以达到skyl…

51NOD 1125(交换机器最小代价) (贪心) 思想 !思想!

题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId1125 1125 交换机器的最小代价基准时间限制&#xff1a;1 秒 空间限制&#xff1a;131072 KB 分值: 80 难度&#xff1a;5级算法题收藏关注有N台机器重量各不相等&#xff0c;现在要求把这些机器按照…

《Python从小白到大牛》简介

《Python从小白到大牛》已经上市&#xff01; 本书是一部系统论述Python编程语言、OOP编程思想以及函数式编程思想的立体化教程&#xff08;含纸质图书、电子书、教学课件、源代码与视频教程&#xff09;。为便于读者高效学习&#xff0c;快速掌握Python编程方法。本书作者精心…

webpack学习

全局安装安装webapck npm i webpack -g 现在我们就可以全局的使用webpack命令了 webpack中基础的命令&#xff1a; webpack enter.js output.js --watch 这个命令是将enter.js打包成output.js&#xff0c;然后html只需要引用该文件就可以了看如下entry.js,这是简单的js代码。 /…

从ORA-27300,ORA-27301到ORA-00064

近期因为session数量添加&#xff0c;须要调整session&#xff0c;也就是要调整process參数。看是比較简单的一个问题&#xff0c;却遭遇了ORA-27300&#xff0c;ORA-27301。因为这个涉及到了有关内核參数kernel.sem的改动。以下是其详细描写叙述。1、故障现象OS版本号&#xf…

Halcon|读取3D相机点云数据

Halcon|读取3D相机点云数据 最近发现很多小伙伴在使用Halcon处理3D工业相机扫描结果的时候遇到了“如何读取”的问题。一般的3D工业相机储存数据的格式有txt格式、tif格式、csv格式、ply格式、ptx格式、bin格式、obj格式等。 txt格式 读取txt文件生成3D模型一般需要分析txt文件…

药片粘连物体的分割

药片粘连物体的分割要求&#xff1a;图片&#xff1a;处理程序&#xff1a;处理结果&#xff1a;要求&#xff1a; 将药片分割&#xff0c;统计药片数量。不能使用模板匹配。 图片&#xff1a; 先看一下要处理的原图&#xff1a; 处理程序&#xff1a; read_image (Image…

BZOJ 1026 [SCOI2009]windy数

1026: [SCOI2009]windy数 Description windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道&#xff0c;在A和B之间&#xff0c;包括A和B&#xff0c;总共有多少个windy数&#xff1f; Input 包含两个整数&#xff0c;A B。 Outp…

不连续区域的拟合

如下图&#xff0c;需要把图中4个半圆分别连接起来 我试过closing 和 dilation&#xff0c;下图中后三个还可以连接起来&#xff0c; 但是第一个因为不连续地方较长&#xff0c;如果增大closing的值&#xff0c;会导致其它点 出现过度畸形。 有没有能连接相邻选区的方法&#…

SPSS输出的结果都要写到文章中吗

SPSS输出的结果都要写到文章中吗 经常有人问到&#xff0c;SPSS输出的结果都要写到文章中吗&#xff1f;文章中应该写什么呢&#xff1f;比如&#xff0c;均值、中位数、众数、标准差、百分位数、最小值、最大值等等&#xff0c;都要出现在文章中吗&#xff1f;洋洋洒洒那么多&…

php Closure 类型

2019独角兽企业重金招聘Python工程师标准>>> <?php /*** Closure 理解* 匿名函数&#xff08;Anonymous functions&#xff09;&#xff0c;* 也叫闭包函数&#xff08;closures&#xff09;* Closure 是匿名函数的php中的称呼*/// 创建一个Closure$func funct…

ftk学习记(label篇)

【 声明&#xff1a;版权全部&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】还是接着上面的一篇博文。之前以前答应过大家&#xff0c;让大家看一下最简单的ftk程序是怎么执行的。所以&#xff0c;这里我们上传一下图片。由于…

扇形特征点提取

处理要求 分别找出扇形左上角&#xff0c;左下角&#xff0c;右上角&#xff0c;右下角&#xff0c;最高点&#xff0c;下面弓形最高点 原图 halcon 处理程序 read_image (Image14208259e49d7b1cf7c544, 544.bmp) rgb1_to_gray (Image14208259e49d7b1cf7c544, GrayImage) t…

Android Studio maven-metadata.xml 卡着不动原因和解决方法

头一天好好的&#xff0c;第二天就卡着了。 一直在这个地方不动&#xff0c;如果停止就会报 Error:Could not run build action using Gradle distribution ‘https://services.gradle.org/distributions/gradle-4.1-all.zip‘. 所以直接就去看了下链接&#xff1a;https://dl.…

halcon 圆环类缺陷检测的一种方法(极坐标变换法)

目录简介极坐标变换定义原理Halcon中的极坐标变换1、polar_trans_image_ext算子用法与参数剖析2、polar_trans_region_inv算子用法与参数剖析圆环类缺陷检测思路与步骤Halcon实例实例简介程序解读思路剖析应用实例1项目介绍处理程序处理效果应用实例2项目介绍处理程序处理效果简…

Halcon图像滤波方法与原理概述

目录简介Halcon算子与算法原理基础滤波a、均值滤波b、中值滤波c、高斯滤波d、导向滤波简介 图像滤波&#xff0c;即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制&#xff0c;是图像预处理中不可缺少的操作&#xff0c;其处理效果的好坏将直接影响到后续图像处理和…

Halcon深度学习环境搭建(win下)全网最全教程

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a;https://blog.csdn.net/cashmood/article/details/105042928 文章目录halcon深度学习介绍系统与环境搭建1、对电脑系统与硬件…

第二周进度及工作量统计

项目&#xff1a;词频统计修改 项目类型&#xff1a;个人项目 项目完成情况&#xff1a;已完成 项目改进&#xff1a;第二次改进 项目日期&#xff1a;2016.9.14----2.16.9.14 CCSEIT分析需求&#xff0c;设计15:2015:30010编码实现15:3016:20050文档程序说明&#xff0c;随笔2…