天天看點

第五課 完善可選頭和部分節區頭

這節課完善_IMAGE_OPTIONAL_HEADER中的IMAGE_DATA_DIRECTORY成員和節表IMAGE_SECTION_HEADER部分

通過看可選頭我們可以看到可選頭的結尾是16個_IMAGE_DATA_DIRECTORY數組,這就是我們為什麼在第30個成員中填入十六16個進制的10h,也就是十進制的16的原因了,代表有16個_IMAGE_DATA_DIRECTORY數組。

它的結構體成員如下圖, 成員1表示該目錄所指向的資料的記憶體偏移即RVA。成員2表示該目錄所指向的記憶體資料的大小。DIRECTORY結構體數組中有16個這樣的結構體

第五課 完善可選頭和部分節區頭

所有的宏名就是它的功能

第五課 完善可選頭和部分節區頭

我們在頭檔案中去驗證一下

首先在helloword程式中聲明一下這個結構體

第五課 完善可選頭和部分節區頭

右鍵這行代碼,轉到它的定義處

第五課 完善可選頭和部分節區頭

我們來到它的定義處,看到這些數組的宏定義

第五課 完善可選頭和部分節區頭

還可以在lordPE檢視這些數組

點選目錄按鈕

第五課 完善可選頭和部分節區頭

然後到達目錄表,是不是很爽啊?不但驗證了結構體數組的正确性,還找到所有結構體數組成員的解釋和内容,是不是感覺這lordPE也太強大了吧?(*^▽^*)

第五課 完善可選頭和部分節區頭

好了繼續,問題來了,如果沒有lordPE該怎麼手動找啊??

其實很簡單,找到第一個節區頭的name字段後,向上數128個位元組,就是IMAGE_DATA_DIRECTORY數組啦

第五課 完善可選頭和部分節區頭

回歸正題:成員31,128個位元組,上面說過他是一個IMAGE_DATA_DIRECTORY結構的數組,通常具有16個元素。

IMAGE_DATA_DIRECTORY結構有兩個成員,各占4個位元組,那麼也就得到成員31的總大小:2 * 4 * 16 = 128byte。16個元素中每個元素代表一個目錄表,每個目錄表表示的目錄如下:

第五課 完善可選頭和部分節區頭

我們需要插入16*8=128個位元組

第五課 完善可選頭和部分節區頭
第五課 完善可選頭和部分節區頭

我們的PE檔案隻是用來熟悉PE結構,是以除了導入表外其他的表我們都不去關心,檢視導入表.rdata表在數組中的位置,由于我們還沒有寫導入表,我們還不知道他的位置,是以這裡用’X’填充其位置。

第五課 完善可選頭和部分節區頭

終于完成了可選頭的部分,下面該節區頭了,先了解一下節區頭

第五課 完善可選頭和部分節區頭

我們需要寫入_IMAGE_SECTION_HEADER 資料:,我們這裡有3個段,.text(代碼段), .rdata(隻讀資料段),data(全局變量資料段)。每段是一個IMAGE_SECTION_HEADER 結構,具有10個成員。

先來認識一下_IMAGE_SECTION_HEADER 這個結構:

第五課 完善可選頭和部分節區頭

接下來我們動手來寫.text段

我們隻用到如下這些成員,其他成員不使用,填充0即可

第五課 完善可選頭和部分節區頭

成員1,8個位元組,表識該段的名稱,我們這裡是.text,那麼此值是他的ASKII碼應該為“2E74657874000000”。

第五課 完善可選頭和部分節區頭
第五課 完善可選頭和部分節區頭
第五課 完善可選頭和部分節區頭

你以為這樣寫就對了嗎?不,這才5個位元組,後面還有3個位元組呢!!這點特别容易錯

第五課 完善可選頭和部分節區頭

  成員2,4個位元組,表示有效代碼所占的位元組數。我們這裡所有代碼數一下總共16h個,固此值為“16000000”。

第五課 完善可選頭和部分節區頭

       成員3,4個位元組,表示在.text段映射到記憶體中的起始位址,那麼這個值如何得來呢?我們知道.text是緊跟PE結構後的,然後整個PE結構映射到記憶體後占的大小為1000h(因為PE結構小于1000h個位元組,而對齊力度粒度是1000h),那麼此值便得到了,“00100000”。

第五課 完善可選頭和部分節區頭

       成員4,4個位元組,表示.text段在檔案中所占的大小。我們的實際代碼隻有16h個位元組,那麼這個值是不是16h呢?并不是,一定要注意段在檔案中的對齊粒度是200h,是以此值為“00020000”。

第五課 完善可選頭和部分節區頭

成員5,4個位元組,表示.text段在檔案中的起始位址,上面已經計算過PE檔案的總長度為400h,他實際上也就是.text的起始偏移位址,此值為“00040000”。

第五課 完善可選頭和部分節區頭

       成員6,7,8,9,總共占12個位元組,都僅用于目标檔案,我們這裡統統填為零。(仔細看結構體成員會發現是12個位元組)

第五課 完善可選頭和部分節區頭

成員10,4個位元組。包含标記以訓示節屬性,比如節是否含有可執行代碼、初始化資料、未初始資料,是否可寫、可讀等。這個值實際上是二進制位進行或運算得到的值。各二進制位表示的意義如下:

第五課 完善可選頭和部分節區頭

不懂異或組合就看下圖,每個屬性對應的16進制加起來就行

第五課 完善可選頭和部分節區頭

其實轉換很簡單,第一個屬性是第五個二進制位 置1,算出來剛好是16進制的20,對應上圖的第一個(很簡單吧?????不懂真的是沒救了哈)

第五課 完善可選頭和部分節區頭

其實用LordPE一鍵修改很友善,但是我後面才說就是為了先學懂原理嘛~~

第五課 完善可選頭和部分節區頭
第五課 完善可選頭和部分節區頭
第五課 完善可選頭和部分節區頭

在我們這裡,因為這是代碼段,是以bit 5 (IMAGE_SCN_CNT_CODE)位置1,一般代碼段都含有初始化資料,那bit 6 (IMAGE_SCN_CNT_INITIALIZED_DATA)位置1,有因為代碼段的代碼可以執行的,是以bit 29 (IMAGE_SCN_MEM_EXECUTE) 置1,那麼這3個二進制位進行或運算最終得到此成員值“20000060”。

第五課 完善可選頭和部分節區頭