對照 import_descriptor 結構體,給出遍歷 int 得到原始檔中呼叫函式的 函式名、庫名、函式索引
源程式:wsample01a.exe
首先了解import_descriptor結構體在**
首先是最外面一層,可選pe頭
接著進入可選pe頭
dword aoe;裡面有很多成員變數,在結尾的地方,有乙個結構體陣列,名叫datadirectory,裡面包含了16個陣列,每個陣列又又兩個成員變數...dword imagebase;
......
...//
結尾image_data_directory datadirectory;
xx在記憶體中的起始位址;16個陣列中第1,2個分別是匯出表和匯入表,第13個是匯入位址表(縮寫iat)xx的長度;
而匯入表中又包含了許多結構體,就是我們要找的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...