EXE檔案結構及讀取方法,exe結構讀取
一、EXE檔案概念
EXE File英文全名executable file ,譯作可執行檔,可移植可執行 (PE) 檔案格式的檔案,它可以載入到記憶體中,並由作業系統載入程式執行,是可在作業系統儲存空間中浮動定位的可執行程式。如記事本程式notepad.exe ,可以用來編輯文檔,如:測試.txt雙擊開啟notepad.exe記事本程式來進行編輯處理。
二、EXE檔案結構
EXE檔案分為兩個部分: EXE檔案頭和程式本體。exe檔案比較複雜,屬於一種多段的結構,是DOS最成功和複雜的設計之一。每個exe檔案包含一個檔案頭和一個可重定位程式的映像。檔案頭包含MS-DOS用於載入程式的資訊,例如程式的大小和寄存器的初始值。檔案頭還指向一個重定位表,該表包含指向程式映像中可重定位段地址的指標鏈表。MS-DOS通過把該映像直接從檔案複製到記憶體載入exe程式,然後調整定位表中說明的可重定位段地址。定位表是一個重定位指標數組,每個指向程式映像中的可重定位段地址。 預知詳細原理與結構,請點擊EXE檔案結構及原理
上表是EXE檔案頭
三、EXE檔案開啟方法
由於EXE檔案比較特殊,開啟檔案也有點特殊,需指定格式,見下面代碼:
#include<iostream>#include<string>#include<fstream>#include<ios>using namespace std;const int BUFFER_SIZE=1024;void update(ifstream& in) {if (!in) {return;}std::streamsize length;char buffer[BUFFER_SIZE];while (!in.eof()){in.read(buffer, BUFFER_SIZE);length = in.gcount();if (length > 0) {printf("%s",buffer);}}in.close();}int main(){update(ifstream("1.exe", ios_base::binary));return 0;}
其中,ios_base 是C++標準程式庫中的一個類,定義於<ios>標頭檔中。ios_base類封裝了C++標準中的流輸入輸出中不依賴於讀寫的資料的類型的基本資料,如格式化資訊、異常狀態、事件回呼函數等。
怎讀取exe檔案的原始碼?
產生的程式是不能看到原始碼的,不過可以看到那個程式的資源,用E-Code Explorer 反組譯碼調試由易語言編譯產生的易格式可執行檔,分析內部結構,查看其中的各項資料。
【功能簡介】
1。格式分析:分析易格式可執行檔的總體結構,查看對應項的資料。分別對PE骨骼(PE頭)和易格式原體分析,以樹形結構清晰的顯示,同時輔以詳細的分析表格。
2。反組譯碼分析:快速的靜態反組譯碼易格式可執行檔。提供方便的跳轉、調用目標地址的代碼預覽功能。
3。表單分析:對易格式可執行檔中包含的表單資料分析。以樹型結構清晰的顯示表單單元的從屬結構。詳細的控制項屬性顯示、準確的事件處理函數定位、與反組譯碼模式便捷的切換,讓使用者可以立即進入要調試的事件函數領空,避免在runtime的空間裡四處打轉浪費時間。這一點對於調試非線性事件驅動類型的程式是必須的。
4。符號修飾:可以調用易語言支援庫作為符號表,對反組譯碼後的代碼進行修飾,可以直接分析出函數所調用的方法,操作的屬性,使用到的常量、基礎資料型別 (Elementary Data Type)、自訂資料類型和視窗單元。極大地提高了代碼的可讀性。
5。內部資料分析:能夠分析出程式使用到的常量、API函數、服務,調用的支援庫。
6。多種載入方式:支援從檔案載入和從某一進程的記憶體中直接載入反組譯碼。直接從進程列表附加,可以避免一部分AntiDebug造成的調試困難。
7。支援多種格式:支援標準PE可執行檔,易格式原體檔案,其他類型的易格式檔案。均可正確分析。
8。易格式捕捉者:對於不明外殼的易格式可執行檔(如:加殼後的,通過其它手段封裝的),能夠方便快速的進行分析。
9。提供十六進位檔案查看功能。
10。提供多種協助工具輔助,完成從記憶體dump易格式原體、修複重定位資訊、易格式原體產生EXE檔案等功能。
11。分析結果和反組譯碼結果均可直接匯出產生報告檔案。
12。支援自訂反組譯碼,HEX查看的環境顏色,你可以選擇自己喜歡的顏色來閱讀代碼。
13。詳細的分析設定,可以自己設定最合適的調試環境。
14。提供檔案拖放功能,直接進行分析或調試。
15。支援從命令列擷取要分析的檔案。
其他更多的功能等待您在使用中發現…………
C++/C中用檔案IO函數實現exe檔案內容讀取
ifstream fin("abc.exe", ios_base::binary);
ofstream fout("aaa.exe", ios_base::binary);
char gc;
do
{
fin.read((char*)(&gc), sizeof(char));
fout.write((char*)(&gc), sizeof(char));
}while(!fin.eof());
fin.close();
fout.close();