以前剛開始學網絡安全,是從免殺開始的。記得那時候殺毒軟件還很弱。金山江民瑞星還存在。
那會什么原理也不懂,就一直瞎鼓搗。(后來轉入滲透行列了)
這段時間一直在學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頭位置。如上圖。
運行成功。