這次要介紹PE文件結構,瞭解了PE文件架構,就是.exe文件的排版結構,我們才能解釋軟件的逆向工程。
PE文件總體結構
exe文件從磁盤加載到內存,各部份的先後順序是保持不變的,但由於磁盤(一般200H)和內存(一般1000H)區塊的對齊大小不一樣,所以同一內容在磁盤和在內存中的地址是不一樣的。
UltraEdit 是一套功能強大的文本編輯器,可以編輯文本、十六進制、ASCII 碼,完全可以取代記事本(如果電腦配置足夠強大),內建英文單字檢查、C++ 及 VB 指令突顯,可同時編輯多個文件,而且即使開啟很大的文件速度也不會慢。
//9_1.cpp
#include<iostream>
using namespace std;
template<typename>
T abs(T x)
{ return x<0?-x:x; }
oid main()
{ int n=-5;
double d=-5.5;
cout</<typename>/<iostream>
float X=3.0f;
cout<
cout<另外要注意,PE文件中存放的地址值都是內存中的地址,這要根據這個地址找到內容在Ultraedit的地址,需要將此RVA址轉換成文件偏移。還要注意DOS頭/PE頭/塊表,映射到內存時屬同一區塊而且是第一區塊,所以此三者上的RVA和文件偏移地址是相等的。
DS頭部
DOS頭的作用是兼容MS-DOS操作系統中的可執行文件,對於32位PE文件來說,DOS所起的作用就是顯示一行文字,提示用戶:我需要在32位windows上才可以運行。
上邊在十六進制文本編緝器中,直接轉向e_lfanew指向的000000E0可以正好找到PE頭。MZ是DOS可執行文件標誌,紅的圈出來的是e_lfanew指向PE文件頭。
DOS stub
提示用戶:我需要在32位windows上才可以運行,在右邊清晰可見。裡面是UCHAR [160]個字節。40-D0正好 16X10 =160。
e_magic:一個WORD類型,值是一個常數0x4D5A,用文本編輯器查看該值位‘MZ’,可執行文件必須都是'MZ'開頭。
e_lfanew:為32位可執行文件擴展的域,用來表示DOS頭之後的NT頭相對文件起始地址的偏移。
DOS stub是當操作系統不支持PE文件時執行的部分,一般由編譯器自己生成內容是輸出“This program cannot be run in MS-DOS mode”等提示。
PE文件頭的位置由e_lfanew指出而不是在固定位置,所以DOS stub允許你改成自己想要執行的代碼,想寫多長寫多長;但一般直接不理會。
"
閱讀更多 小二歲zzzz 的文章