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.pswp.cn/news/254494.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254494.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254494.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

系統:Centos 7.2 內核3.10.0-327.el7.x86_64 # 內核需要高于2.6.32

系統:Centos 7.2 內核3.10.0-327.el7.x86_64 # 內核需要高于2.6.32 Drbd : 192.168.8.111:node1/dev/drdb0 /mydeta 192.168.8.112 : node2Mysql_vip: 192.168.8.200 #下章實現 # 需要的軟件包:mariadb-5.5.53-linux-i686.tar.gzdrbd84-utils…

Smoothing濾波處理halcon算子,持續更新

目錄anisotropic_diffusionbilateral_filterbinomial_filtereliminate_min_maxeliminate_spfill_interlacegauss_filterguided_filterinfo_smoothisotropic_diffusionmean_imagemean_nmean_spmedian_imagemedian_rectmedian_separate_median_weightedmidrange_imagerank_imager…

日志文件在VS中輸出為亂碼問題

原因:主要是文件文字格式問題(使用使用 Unicode 字符集):修改項目/屬性/常規/字符集/ 未設置

初學者電腦編程入門

1、首先要對編程有個比較大概的了解,編程的對象,編程的原理,編程的目的等等。2、在了解編程基本知識后,要想想自己學習編程后到底要干什么以確定學習的方向。比如說是想要開發手機app,網站開發,企業系統等。…

MVC架構模式(2)

簡介: MVC最初是在Smaltalk_80中被用來構建用戶界面的。M代表模型Model,V代表視圖View,C代表控制器Controller。 Model模型層,可以簡單理解就是數據層,用于提供數據。在項目中,(簡單理解&#x…

Scene Flow場景流halcon算子,持續更新

目錄scene_flow_calibscene_flow_uncalibscene_flow_calib 功能:計算兩個立體圖像對之間校準的場景流。 scene_flow_uncalib 功能:計算兩個立體圖像對之間未校準的場景流。

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…

FFmpeg中MPEG-4編碼程序追蹤,其他FFMPEG自帶編碼器同理

FFmpeg中與MPEG-4編碼相關的主要文件有mpegvideo.c&#xff0c;h263.c等。在mpegvideo.c中&#xff0c; AVCodec mpeg4_encoder { "mpeg4", CODEC_TYPE_VIDEO, CODEC_ID_MPEG4, sizeof(MpegEncContext), MPV_encode_init, MPV_encode_picture, …

符合skyline的3dml網絡發布服務

技術交流群&#xff1a;665060698使用java web實現&#xff1b;接口符合skyline的3dml模型形式&#xff1b;通過簡單的發布界面&#xff0c;直接發布3dml模型&#xff1b;實現te pro在客戶端讀取數據&#xff1b;實現在te pro客戶端的對應查詢功能&#xff1b;負載可以達到skyl…

Texture Inspection 紋理檢驗halcon算子,持續更新

目錄deviation_imageentropy_imagetexture_lawsdeviation_image 功能&#xff1a;計算矩形窗口內的灰度值的標準偏差。 entropy_image 功能&#xff1a;計算矩形窗口內的灰度值的平均信息量。 texture_laws 功能&#xff1a;使用一個Laws文本濾波器&#xff08;地質變形&a…

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編程方法。本書作者精心…

c語言基礎知識_結構體訪問,共同體,枚舉類型

C語言結構體變量的引用&#xff1a;對于定義的結構體類型的普通變量&#xff0c;訪問其成員用圓點運算符&#xff08;“.”&#xff09;&#xff0c;標準訪問方式如下&#xff1a;   結構體變量名.成員名   對于定義為指向結構體的指針變量&#xff0c;用箭頭運算符&#x…

Wiener Filter維納濾波器halcon算子,持續更新

目錄gen_psf_defocusgen_psf_motionsimulate_defocussimulate_motionwiener_filterwiener_filter_nigen_psf_defocus 功能&#xff1a;產生一個均勻散焦模糊的脈沖相應。 gen_psf_motion 功能&#xff1a;產生一個&#xff08;線性&#xff09;運動模糊的脈沖相應。 simula…

【轉載】數據庫操作:添加、插入、更新語句

原始日期&#xff1a; 2016-07-22 12:03 SQL常用命令使用方法&#xff1a;(1) 數據記錄篩選&#xff1a;sql"select * from 數據表 where 字段名字段值 order by 字段名 [desc]"sql"select * from 數據表 where 字段名 like %字段值% order by 字段名 [desc]&qu…

webpack學習

全局安裝安裝webapck npm i webpack -g 現在我們就可以全局的使用webpack命令了 webpack中基礎的命令&#xff1a; webpack enter.js output.js --watch 這個命令是將enter.js打包成output.js&#xff0c;然后html只需要引用該文件就可以了看如下entry.js,這是簡單的js代碼。 /…

3D 相機halcon算子,持續更新

目錄add_scene_3d_cameraadd_scene_3d_instanceadd_scene_3d_labeladd_scene_3d_lightclear_scene_3dcreate_scene_3ddisplay_scene_3dget_display_scene_3d_inforemove_scene_3d_cameraremove_scene_3d_instanceremove_scene_3d_labelremove_scene_3d_lightrender_scene_3dset…

Selenium 中文API

Selenium 中文API 轉自&#xff1a;http://blog.csdn.net/lh9529/article/details/3946567 概念 Selenium 通過命令進行驅動。Selenium 可歸納為三種“風格”&#xff1a;動作、輔助和斷言。每一個命令調用就是下表中的一行。 命令 目標 值 動作(Actions)命令一般用于操作應用…

C# 特性(Attribute)

個人定義&#xff1a;不侵入對象的情況下&#xff0c;添加對象附注信息。 官方定義&#xff1a;將預定義的系統信息或用戶定義的自定義信息與目標元素相關聯。目標元素可以是程序集、類、構造函數、委托、枚舉、事件、字段、接口、方法、可移植可執行文件模 塊、參數、屬性 (…

收集js庫的網站

https://www.javascripting.com/view/redux