PE文件輸入表獲取過程

1.

   首先給出這個PE文件的一些16進制代碼


dos頭的最後一個變量給出PE頭的地址:000000E0,由於import table 的數據目錄項相對PE頭的偏移爲80h,故輸入表的數據目錄項在文件中的偏移爲00000160

查看00000160偏移地址所對應的內容,前四個字節, 0000C7AC爲IMAGE_IMPORT_DESCRIPTOR在內存中的RVA,此時,我們需要轉換成這個地址對應的文件中的偏移,計算這個,利用RVA-△k就可以算出


C7AC這個RVA在.rdata區段裏面,計算.rdata區段的△K= B000-B000=0;所以 剛纔的那個需要0000C7AC 地址相對文件的偏移爲0000C7AC-0=0000C7AC;定位到文件偏移處


陰影部分是IID的內容,IID的大小爲20h,陰影部分存在鏈各個IID,最後一個爲0000000。。。。。說明此PE文件只有一個IID,對應一個dll,現在看IID裏面的第四個成員變量


第四個變量的地址爲0000CDD8,也是RVA,我們需要轉換成對應的文件偏移,0000CDD8同樣在.rdata裏面,△K爲零,所以文件偏移也爲0000CDD8

定位到文件偏移爲0000CDD8的地方:


查看內容,裏面記錄的是IMAGE_IMPORT_DESCRIPTOR的第四個成員變量多對應的dll的名字,kernel32.dll,到此,我們已經找到了這個輸入的dll。


2.  

  接下來,我們需要做的是獲取這個程序所調用dll裏面的所有函數,IMAGE_IMPORT_DESCRIPTOR中的第一個參數和最後一個參數,original_first_thunk 和first

_thunk分別指向了INT(輸入名稱表)IAT(輸入地址表),這兩個表裏面分別記錄了指向調用函數名的地址,和此函數在dll中的序號(序號用來快速索引dll中的函數)

給出original_first_thunk 和 first_thunk的值




0000C7D4 和0000B0 是INT 和IAT數組的首地址,下面我們跳到該地址(由於△K=0,故rva=文件偏移)


INT數組




IAT數組


數組裏面的值爲指向IMAGE_IMPORT_BY_NAME的地址,IMAGE_IMPORT_BY_NAME裏面存放的是所調用函數的名字的地址,下來我們選取一個數組裏面的

值,跳轉到相應的IMAGE_IMPORT_BY_NAME:



可以看到,上面的那個圖片中顯示了所調用的函數的名字,名字前面的兩個字節代表的是函數在dll中的序號,方便以後快速索引到。

3. 需要注意的地方

INT 和IAT數組在一開始的時候,裏面存放的地址都是一樣的,他們都是指向所調用函數的名字的字符串。而在加載到內存的時候,IAT的值會發生變換,它的值存放的是dll中函數實際被調用的地址,在加載到內存後,就只需要保存IAT就可以了,利用它來調用函數。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章