Win32之程序建立過程
0x01. 什麼是程序?
程序提供程式所需要的資源,如:資料、程式碼等等
程序扮演的角色僅僅是為當前程式提供資源,或者程式碼,這就是程序所提供的,當時程式執行的狀態和程序沒有關係,程序可以看做空間的概念
例子:
程序相當於一個房子,房子裡面的東西,這些東西就是程序提供的;房子裡面走來走去的人,和使用東西的人,就是執行緒
你看到的這些東西就是程序
找到最後發現到 0x7FFEF000
結束(這裡是個小Tips了)
一、核心空間分佈:
在4GB記憶體的作業系統中,高2G的給記憶體空間作業系統(也就是核心)使用,這部分記憶體空間所有程序共享。
低2G的記憶體給各個程序使用,每個程序佔有獨立的記憶體空間,相互程序其記憶體之間並不影響。
所謂的程序不是一個檔案組成,而是多個檔案組成
0x02.程序的建立過程
1)、任何程序都是別的程序建立的
系統中的程式都是通過explorer.exe
建立的,這個程式呼叫了CreateProcess()
函式
2)、程序的建立過程
1、對映EXE檔案
2、建立核心物件`EPROCESS`
3、對映系統DLL(ntdll.dll)
4、建立執行緒核心物件`ETHREAD`
5、系統啟動執行緒
對映DLL(ntdll.LdrlnitializeThunk)
執行緒開始執行
舉個例子,我們點選 A.exe 就會呼叫 CreateProcess() 函式
第一步:對映EXE檔案
通過上面的圖片知道我們程式對映的話不能放前64k,也不能在後64k,但是其實PE中就有寫到需要放到哪裡
假設從這開始,然後我們畫圖,寫入程序A
第二步:建立核心物件 EPROCESS
每個物件都有自己的 EPROCESS 程序物件,也就是結構體
(無需深究)
第三步:對映系統DLL(ntdll.dll)
也就是說,不管什麼程序建立的時候,都會有個 ntdll.dll,然後繼續把ntdll對映進去
第四步:建立執行緒核心物件 ETHREAD
每個程序中都會自動建立一個執行緒,跟程序一樣,因為一個程序就得有一個執行緒,啟動一個程序就有EPROCESS 結構體
然後程序自動建立一個執行緒物件 ETHREAD
第五步:系統啟動執行緒
每一個程序都是由一堆PE來的,比如一個EXE
帶了一堆DLL
,然而dll
不是隨便亂帶的
因為PE建立中可能只使用到了 test.dll
中的某個函式,但是 test.dll
可能又帶了 love.dll
中的東西
這時候發現程序只是一個空間的概念,真正用的人是執行緒