1. 程式人生 > 實用技巧 >Win32之程序建立過程

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中的東西

這時候發現程序只是一個空間的概念,真正用的人是執行緒