PE文件格式學習之PE頭移位


以前剛開始學網絡安全,是從免殺開始的。記得那時候殺毒軟件還很弱。金山江民瑞星還存在。

那會什么原理也不懂,就一直瞎鼓搗。(后來轉入滲透行列了)

這段時間一直在學PE格式,突然想起來以前很古老的PE文件頭移位。

網上搜了搜,看大家雖然做了視頻,但是竟然沒人講原理。借着剛好在學PE格式的知識,就做個PE文件頭移位的筆記。(不喜勿噴,剛學PE頭文件格式,難免出錯請提點,謝謝)

當然現在這種很古老的免殺方式對於殺軟來說根本是不堪一擊了。純屬做筆記。

 

PE文件的基本結構如圖示:

IMAGE_DOS_HEADER 定義

IMAGE_DOS_HEADER STRUCT 

+00h WORD e_magic  // Magic DOS signature MZ(4Dh 5Ah)   DOS可執行文件標記 

+02h  WORD e_cblp   // Bytes on last page of file  

+04h WORD e_cp   // Pages in file

+06h WORD e_crlc   // Relocations

+08h WORD e_cparhdr   // Size of header in paragraphs

+0ah WORD e_minalloc   // Minimun extra paragraphs needs

+0ch WORD e_maxalloc  // Maximun extra paragraphs needs

+0eh WORD e_ss   // intial(relative)SS value   DOS代碼的初始化堆棧SS 

+10h WORD e_sp   // intial SP value   DOS代碼的初始化堆棧指針SP 

+12h WORD e_csum   // Checksum 

+14h WORD e_ip   //  intial IP value   DOS代碼的初始化指令入口[指針IP] 

+16h WORD e_cs   // intial(relative)CS value   DOS代碼的初始堆棧入口 CS

+18h WORD e_lfarlc   // File Address of relocation table 

+1ah WORD e_ovno  //  Overlay number 

+1ch WORD e_res[4]  // Reserved words 

+24h WORD e_oemid   //  OEM identifier(for e_oeminfo) 

+26h WORD e_oeminfo  //  OEM information;e_oemid specific  

+29h WORD e_res2[10]  //  Reserved words 

+3ch LONG  e_lfanew  // Offset to start of PE header   指向PE文件頭 

IMAGE_DOS_HEADER ENDS

 

以:nc(瑞士軍刀為例)

用C32ASM載入nc.exe 

(圖1網上轉載)

 

偏移地址從0字節開始,就是DOS頭的EXE MZ標志。也就是5A4D。有了這個標識,DOS就能識別出該程序是不是有效的執行體。(由於INTEL CPU屬於LITTLE-ENDIAN類,字符存儲時位低在前,高位在后)

 

+3ch LONG e_lfanew // Offset to start of PE header 指向PE文件頭 ,LONG占4個字節

所以,我們得到了PE文件頭偏移地址為00d8。


IMAGE_FILE_HEADER 結構
IMAGE_FILE_HEADER STRUCT
+04h    WORD          Machine;   // 運行平台
+06h      WORD          NumberOfSections; // 文件的區塊數目
+08h    DWORD         TimeDateStamp;  // 文件創建日期和時間
+0Ch      DWORD         PointerToSymbolTable; // 指向符號表(主要用於調試)
+10h     DWORD         NumberOfSymbols;  // 符號表中符號個數(同上)
+14h      WORD          SizeOfOptionalHeader;  // IMAGE_OPTIONAL_HEADER32 結構大小
+16h      WORD          Characteristics;  // 文件屬性
IMAGE_FILE_HEADER ENDS

在這里,我們只需要注意即可。

+14h WORD SizeOfOptionalHeader; // IMAGE_OPTIONAL_HEADER32 結構大小

從PE頭開始,偏移14H也就是20個字節,得到結構大小。

 

 

結構大小為E0,我們將16換成10進制。就知道該結構有多少個字節。

 

 

將數據復制,往上移動8個字節。

 

 

因為PE頭移動位置,需要重新計算PE頭大小。

 

因為PE頭已經移動過位置了,所以需要重新修改PE頭大小以及DOS頭指向PE頭位置。如上圖。

 

 

運行成功。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM