成為頂級黑客--彙編與反彙編(二)

這次要介紹PE文件結構,瞭解了PE文件架構,就是.exe文件的排版結構,我們才能解釋軟件的逆向工程。

PE文件總體結構

成為頂級黑客--彙編與反彙編(二)

PE文件的架構結構

exe文件從磁盤加載到內存,各部份的先後順序是保持不變的,但由於磁盤(一般200H)和內存(一般1000H)區塊的對齊大小不一樣,所以同一內容在磁盤和在內存中的地址是不一樣的。

UltraEdit 是一套功能強大的文本編輯器,可以編輯文本、十六進制、ASCII 碼,完全可以取代記事本(如果電腦配置足夠強大),內建英文單字檢查、C++ 及 VB 指令突顯,可同時編輯多個文件,而且即使開啟很大的文件速度也不會慢。

成為頂級黑客--彙編與反彙編(二)

測試文件

成為頂級黑客--彙編與反彙編(二)

測試文件PE的基本信息,後續會詳解

//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<
float X=3.0f;

cout<
cout<

另外要注意,PE文件中存放的地址值都是內存中的地址,這要根據這個地址找到內容在Ultraedit的地址,需要將此RVA址轉換成文件偏移。還要注意DOS頭/PE頭/塊表,映射到內存時屬同一區塊而且是第一區塊,所以此三者上的RVA和文件偏移地址是相等的。

成為頂級黑客--彙編與反彙編(二)

PE文件磁盤與內存映像結構圖

DS頭部

DOS頭的作用是兼容MS-DOS操作系統中的可執行文件,對於32位PE文件來說,DOS所起的作用就是顯示一行文字,提示用戶:我需要在32位windows上才可以運行。

成為頂級黑客--彙編與反彙編(二)

PE文件的DOS頭文件

上邊在十六進制文本編緝器中,直接轉向e_lfanew指向的000000E0可以正好找到PE頭。MZ是DOS可執行文件標誌,紅的圈出來的是e_lfanew指向PE文件頭。

成為頂級黑客--彙編與反彙編(二)

測試文件DOS頭文件分析

DOS stub

提示用戶:我需要在32位windows上才可以運行,在右邊清晰可見。裡面是UCHAR [160]個字節。40-D0正好 16X10 =160。

成為頂級黑客--彙編與反彙編(二)

struct IMAGE_DOS_STUB DosStub的位置範圍

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允許你改成自己想要執行的代碼,想寫多長寫多長;但一般直接不理會。

"
/<typename>/<iostream>


分享到:


相關文章: