2017-10-04 346 views
-3

我閱讀有關Windows掛鉤和Win32可執行程序的內部結構(https://en.wikipedia.org/wiki/Hooking#Windows),看到這個代碼塊:IMAGE_DOS_HEADER掛鉤

PIMAGE_DOS_HEADER pImgDosHeaders = (PIMAGE_DOS_HEADER)module; 
PIMAGE_NT_HEADERS pImgNTHeaders = (PIMAGE_NT_HEADERS)((LPBYTE)pImgDosHeaders + pImgDosHeaders->e_lfanew); 
PIMAGE_IMPORT_DESCRIPTOR pImgImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)((LPBYTE)pImgDosHeaders + pImgNTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress); 

for (IMAGE_IMPORT_DESCRIPTOR *iid = pImgImportDesc; iid->Name != NULL; iid++) 

我的C是有點生疏,我可能需要刷(指針總是讓我困惑),但我認爲這種方式的工作原理是創建一個名爲iidIMAGE_IMPORT_DESCRIPTOR指針。 iid指向IMAGE_IMPORT_DESCRIPTOR,並設置爲等於名爲pImgImportDesc的對象。所以它看着pImgImportDescName屬性,如果它沒有設置它會去下一個?所以基本上,它正在尋找最後一個?

還有任何關於書籍或視頻的建議,以查看更多關於這種真正低級別事情的信息嗎?讀代碼讓我感到困惑。

+0

它會去下一個,如果它是** **集。所以它遍佈所有這些。 – rkapl

+1

代碼解析PE頭。沒有任何地方掛鉤,也沒有任何伸展的低水平。詢問基本的C語法不是Stack Overflow的意思。 – IInspectable

+0

感謝您的輸入,但這不是低級別?我的意思是不處理PE頭很低的水平,除非你將它與程序集進行比較(我真的在問,我對此並不熟悉)。對不起,我在任何類型的編程背景下的大部分背景都是高級的java/web開發,我只是想要解決這樣的問題。我在這裏看到很多問題處理某些事情的基本解釋/語法。 – JimmySmithJR

回答

5
PIMAGE_DOS_HEADER pImgDosHeaders = (PIMAGE_DOS_HEADER)module; 
  • 一個過程被在操作系統的選擇的特定內存地址加載。該進程的HMODULE實例句柄與其加載地址相同。所以這是在加載地址的開始處得到一個指向進程的IMAGE_DOS_HEADER結構體的指針。

PIMAGE_NT_HEADERS pImgNTHeaders = (PIMAGE_NT_HEADERS)((LPBYTE)pImgDosHeaders + pImgDosHeaders->e_lfanew); 
  • e_lfanew場偏移到進程的IMAGE_NT_HEADERS結構。這是將pImgDosHeaders指定爲BYTE*指針,將其值增加e_lfanew字節,然後將結果輸入到IMAGE_NT_HEADERS*

PIMAGE_IMPORT_DESCRIPTOR pImgImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)((LPBYTE)pImgDosHeaders + pImgNTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress); 
  • 同樣的事情上面。 DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress是進程的Imports表的第一個IMAGE_IMPORT_DESCRIPTOR結構的偏移量。 pImgDosHeaders正在增加許多字節,然後輸入到IMAGE_IMPORT_DESCRIPTOR*

for (IMAGE_IMPORT_DESCRIPTOR *iid = pImgImportDesc; iid->Name != NULL; iid++) 
  • 這是通過在整個進口表循環。 iid指向表中的第一個描述符,並且循環繼續遍歷表,直到找到一個沒有指定Name的描述符,表示表的末尾。

閱讀此MSDN文章瞭解詳情:

Peering Inside the PE: A Tour of the Win32 Portable Executable File Format