????????????????????????????????????????????????????????????windows 進(jìn)程運行過程
1 創(chuàng)建進(jìn)程內(nèi)核對象
????????進(jìn)程創(chuàng)建的時候(調(diào)用NtCreateProcess時)勉抓,系統(tǒng)會創(chuàng)建一個被稱為內(nèi)核對象的對象昼窗,即進(jìn)程內(nèi)核對象懂缕,用來管理進(jìn)程的內(nèi)核對象狐榔,其中進(jìn)程內(nèi)核對象維護(hù)一個叫做句柄表的結(jié)構(gòu)简僧。進(jìn)程初始化時為空建椰,當(dāng)進(jìn)程的線程調(diào)用內(nèi)核對象函數(shù)創(chuàng)建內(nèi)核對象的時候,內(nèi)核會為這個對象分配一塊內(nèi)存區(qū)域并初始化岛马,然后內(nèi)核會在句柄表中找到一個空的入口棉姐,找到以后初始化句柄表以索引剛剛那片區(qū)域屠列。
2 創(chuàng)建進(jìn)程的虛擬地址空間????
? ? ? 進(jìn)程內(nèi)核對象被創(chuàng)建以后,系統(tǒng)會為其分配4G(32位)的進(jìn)程虛擬空間伞矩,每個進(jìn)程只能訪問自己虛擬地址空間的內(nèi)容笛洛,其中這個虛擬地址空間被分為四部分,NULL指針去乃坤,用戶區(qū)苛让,64kb禁入?yún)^(qū),內(nèi)核區(qū).
3 初始化進(jìn)程的虛擬地址空間
? ? ? ? 進(jìn)程創(chuàng)建結(jié)束以后湿诊,windows裝載器開始裝載PE文件狱杰,大致過程如下:
????????先讀入PE文件的DOS頭,PE頭和Section頭厅须。
????????然后根據(jù)PE頭里的ImageBase所定義的加載地址是否可用仿畸,如果已被其他模塊占用,則重新分配一塊空間朗和。
????????根據(jù)Section頭部的信息错沽,把文件的各個Section映射到分配的空間,并根據(jù)各個Section定義的數(shù)據(jù)來修改所映射的頁的屬性。
?????????如果文件被加載的地址不是ImageBase定義的地址眶拉,則重新修正ImageBase甥捺。
?????????根據(jù)PE文件的輸入表加載所需要的DLL到進(jìn)程空間。
????????然后替換IAT表內(nèi)的數(shù)據(jù)為實際調(diào)用函數(shù)的地址镀层。
?????????根據(jù)PE頭內(nèi)的數(shù)據(jù)生成初始化的堆和棧。
4 創(chuàng)建進(jìn)程的主線程
? ??????當(dāng)進(jìn)程的初始化完成后皿曲, 開始創(chuàng)建進(jìn)程的主線程唱逢, 一個進(jìn)程至少要有一個主
線程才能運行, 可以說進(jìn)程只是充當(dāng)一個容器的作用屋休, 而線程才是執(zhí)行用戶代碼
的載體