從PE格式牽涉到的理論基礎的概念疑惑 修改

2021-06-05 19:59:02 字數 2980 閱讀 6579

學習pe的時候遇到了幾個問題一直想不明白,這裡先記錄下來。

1.createfile函式的返回值是乙個核心物件的控制代碼。那麼什麼是核心物件呢?

答:從《windows核心程式設計》裡找到了解釋:

什麼是核心物件?

核心物件只是核心分配的乙個記憶體塊,並且只能由該核心訪問。該記憶體塊是一種資料結構,它的成員負責維護該物件的各種資訊。有些資料成員(如安全性描述符、使用計數等)在所有物件型別中是相同的,但大多數資料成員屬於特定的物件型別。例如,程序物件有乙個程序i d 、乙個基本優先順序和乙個退出**,而檔案物件則擁有乙個位元組位移、乙個共享模式和乙個開啟模式。

核心物件的資料結構只能被核心訪問,因此應用程式無法在記憶體中找到這些資料結構並直接改變它們的內容。microsoft 規定了這個限制條件,目的是為了確保核心物件結構保持狀態的一致。這個限制也使microsoft能夠在不破壞任何應用程式的情況下在這些結構中新增、 刪除和修改資料成員。  

當呼叫乙個用於建立核心物件的函式時,該函式就返回乙個用於標識該物件的控制代碼。為了使作業系統變得更加健壯,這些控制代碼值是與程序密切相關的。因此,如果將該控制代碼值傳遞給另乙個程序中的乙個執行緒,那麼這另乙個程序使用你的程序的控制代碼值所作的呼叫就會失敗。如果想在多個程序中共享核心物件,要通過一定的機制  如物件控制代碼的繼承性,命名物件,複製物件控制代碼。  

除了核心物件外,你的應用程式也可以使用其他型別的物件,如選單、視窗、滑鼠游標、刷子和字型等。這些物件屬於使用者物件圖形裝置介面(gdi)物件,而不是核心物件。  當初次著手為若要確定乙個物件是否屬於核心物件,最容易的方法是觀察建立該物件所用的函式。

2.映像  與   對映 的區別

首先,映像 很明顯是乙個名詞(廢話嘛......),英文是image,其實個人覺得翻譯成映像不好,不如翻譯  映象。

如果是映象的話,那麼就好理解了。可以看成是「鏡子的反射出來的東西嘛」。也就是說這兩個東西是完全一樣的。

舉個例子,上次那篇部落格裡有這句c++**,雖然自己沒學過c++

byte* pbuffer = new byte[dwfilesize];
這段**的話先暫時理解成是動態分配記憶體。比如說磁碟裡面有乙個pe檔案,那麼 映像出來的就是在記憶體中的一塊 和磁碟中一模一樣的東西。

我們數學裡面學的函式 其實就是一種特殊的對映,也就是多對一的關係 (多個x可以對應乙個y值)

而對映的話是可以多對多的。但是這個多對多的概念我們在這裡是用不到的,一般我們用一對一理解就可以了。

pe中的檔案  對映  記憶體,這個概念就比較好理解了(具體的話在下面這個文庫鏈結裡面也是有的)。

簡單的說,就是createfile函式返回的這個核心控制代碼指向的只是在磁碟中的那個檔案。

如果要對映,那麼就要使用另外乙個api   mapviewoffile 這個函式了

4.imagebase  基位址的理解

我在學習pe的時候很重視offset 偏移量這個概念,平時我們用ue或者是winhex等其他編輯器開啟的時候,在最左邊顯示的就是偏移量。

pe格式裡面的可選映像頭image_optional_header這個 資料結構裡面有imagebase這個成員

是程式預設裝入基位址。

這個imagebase就是程式預設裝入的基位址,也就是說這個是在  對映到記憶體的時候才出來的概念。

理解了上面所有這些概念,那麼下面這個困擾我很久的問題應該就可以解答了:

我上次寫的那個讀取pe資訊讀取的是磁碟裡面的檔案資訊,也就是說先在記憶體中騰出一塊地方來,這塊地方的大小跟磁碟中檔案的大小是一模一樣的,然後  在記憶體中獲得檔案的 映象,我讀取的就是這個在記憶體中的映象的資訊。

所以上篇部落格裡面的這個pbase 其實只是動態分配記憶體的指向這塊記憶體的指標,跟這個imagebase是一點關係都沒有的。

深一步的理解。

今天自己在看pe權威這本書的時候,發現上面講的東西好像錯了。

下面是《windowspe權威指南》裡面的一段話:

記憶體對映檔案是指將硬碟上的檔案不做修改地裝載到記憶體中。這樣,檔案中位元組與位元組之間就是順序排列的了。在硬碟中,檔案被分割成若干簇,這些簇不一定會按照原來順序排列在一起,當我們訪問磁碟上的檔案時,需要計算機首先將不同位置的內容讀取到記憶體。有了記憶體對映檔案,訪問就會變得更輕鬆和快捷,由於讀取磁碟的操作集中到了一起執行,讀寫效率會提高很多。被一次性讀取到記憶體的檔案位元組按線性順序,訪問相對簡單,速度也提公升了不少。所以,許多大型的編輯軟體被設計中經常會使用記憶體對映檔案訪問磁碟檔案。

pe記憶體映像是指將pe檔案按照一定的規則裝載到記憶體中,裝入後的整個檔案頭內容不會發生變化,但pe檔案的某一部分如節的內容會按照欄位中的對齊方式在記憶體中對齊,從而使得記憶體中的pe映像與裝載前的pe檔案不用。那麼,為什麼pe記憶體映像不能和一般的記憶體對映檔案一樣呢?答案很簡單:pe檔案是由作業系統裝載進記憶體的,其目的是為了執行。為了配合作業系統的執行,方便排程,提高執行效率,pe映象必須按照一定的格式對齊,所以記憶體中的pe映像和原來硬碟上的檔案是不同的,當然與記憶體對映檔案也就不一樣了。

自己將上面的話讀了好幾遍,每一句話都理解了一下。

也就是說,記憶體對映檔案就是將磁碟上的檔案整理起來,映像到記憶體中。這個時候在記憶體中是乙個連續完整的檔案。

pe記憶體映像是由windows載入器自己執行的,它的原理與記憶體對映檔案的原理有些類似,但有區別的是它的對齊方式不同。

理解到這裡,隨之而來的問題又來了。如果說有乙個檔案的大小為3g,而我的記憶體只有2g,那麼這個時候記憶體對映檔案時如何處理的呢?

這個可能就要涉及到虛擬記憶體的概念了。這裡先留下這個問題,先查查資料。

大家如果知道的話,懇請告訴我,謝謝了

PE框架從入門到放棄 報文傳送流程

pe框架傳送報文,適用於pe及vx技術 步驟 1.在action中使用傳送報文,要指定報文在router端的交易名稱 2.如果使用supe.execute context 來傳送,不需要第一步 3.配置從網銀到router的xml報文 4.根據網銀交易名匹配到router端交易名 這裡對應的是第2步...

從I O到檔案格式

談效率 include ssize t read int filedes,void buf,size t nbytes ssize t write int filedes,void buf,size t nbytes 這裡buf的大小嚴重影響效率,如果buf為1的話,比起最優大小可以差近50倍。當b...

把PE映像檔案從記憶體中DUMP到磁碟

了解了exe和dll裡面的奧秘,你將成為一名知識更加淵博的程式設計師!可以看到,作為網路安全愛好者的我們,掌握和熟練利用pe portable executable 檔案格式的知識將必定能為我們學習黑客技術和攻防知識打下良好的基礎。在網路攻防的對抗中,常常接觸到有關pe檔案格式方面的技術,比如緩衝區...