利用 PEview 分析 PE 檔案結構

2022-04-29 15:09:10 字數 2138 閱讀 9155

對照 import_descriptor 結構體,給出遍歷 int 得到原始檔中呼叫函式的 函式名、庫名、函式索引

源程式:wsample01a.exe

首先了解import_descriptor結構體在**

首先是最外面一層,可選pe頭

接著進入可選pe頭

dword aoe;

...dword imagebase;

......

...//

結尾image_data_directory datadirectory;

裡面有很多成員變數,在結尾的地方,有乙個結構體陣列,名叫datadirectory,裡面包含了16個陣列,每個陣列又又兩個成員變數

xx在記憶體中的起始位址;

xx的長度;

16個陣列中第1,2個分別是匯出表和匯入表,第13個是匯入位址表(縮寫iat)

而匯入表中又包含了許多結構體,就是我們要找的image_import_descriptor結構體。

換算rva -> raw,由公式raw - pointtorawdata = rva - va(pointertorawdata為節在硬碟中起始的位址,va為節在記憶體的起始位址,這兩個變數都在節表(image_section_header中)可以找到)

1.我們先確定匯入表在哪個節裡面

首先看第乙個節的rva,lucky!節的偏移位址和大小符合匯入表偏,說明匯入表在這個節裡面

再確認一下下乙個節,沒有問題

2.運算的pointtorawdata值

則raw=22a4-2000+e00=10a4(所有位址的值都是偏移位址,可以放一起計算)

用hxd把十六進製制原檔案看一下

這裡就是第乙個image_import_descriptor表中的結構體,共5個成員變數

3.然後有的人可能糾結怎麼開頭三個元素是空的(大端儲存,成員變數1個4位元組),有沒有算錯?在我排查了乙個多小時後,我確認自己沒有算錯

參照idt,發現也是對的

name的rva是23b8,換算raw為23b8-2000+e00=11b8

我們找到了函式庫名

fistthunk變數的raw值(即iat表的首位址)=2000-2000+e00=e00,也沒錯

那麼值為0的originalthunk成員變數怎麼轉換為raw呢?豈不是為負值?

這次我在乙個不起眼的ppt裡面看到了答案:

若originalfirstthunk值為0,就使用firstthunk代替,那麼找到對應位址的值

換算raw=23ac-2000+e00=11ac

陣列裡面兩個變數:編號+函式名字

編號為0,函式名為lstrcmpw

至此所有問題已解決。

基於PEview分析PE檔案(4 4)

從圖3可以看出,pe檔案的nt頭之後就是節 section 頭,每個節頭的大小是40位元組。在 4.2 image file header 中提到,本pe檔案包含9個節,可以從圖3中找到這9個節對應的節頭。表1列出了各節頭的對應節的內容。表1 節頭對應節的內容 節名內容 節名內容 bss 未初始化的...

PE 檔案格式分析

pe 檔案格式分析 pe檔案是任何可執行模組或者 dll的檔案格式。pe檔案以 64位元組的 dos檔案頭 image dos header,開始,之後是一小段 dos程式 dos頭的概念是從 16位的 windows 可執行程式 ne格式 中來的,這個部分主要用在 os 2 可執行程式 自解壓文件...

怎麼利用tombstones墓碑檔案分析崩潰問題

1 什麼是墓碑檔案 android本機程式本質上是乙個linux程式。當linux應用程式在執行時發生嚴重錯誤,一般會導致程式崩潰。其中,linux專門提供了一類crash訊號,在程式接收到此類訊號時,預設操作是將崩潰的現場資訊記錄到核心檔案,然後終止程序。訊號型別參考 在安卓系統中這類檔案就是to...