最新消息

[公告2014/05/30] 如有需要將部落格中,任何一篇文章的程式碼使用在商業用途,請與我聯繫。

[公告2015/04/26] Line版的 iInfo程式與投資應用 群組已上線想加入的朋友們,請先查看 "入群須知" 再與我聯繫 Line : aminwhite5168,加入請告知身分與回答 "入群須知" 的問題。

[公告2018/04/22] 台北 Python + Excel VBA 金融資訊爬蟲課程,課程如網頁內容 金融資訊爬蟲班:台北班 Python 金融資訊爬蟲、EXCEL VBA 金融資訊爬蟲

[公告2019/01/08] 請注意:我再次重申,部落格文章的程式碼,是要提供各位參考與學習,一旦網頁改版請自行修改,別要求東要求西要我主動修改,你們用我寫東西賺錢了、交差了,請問有分我一杯羹嗎?既然賺錢沒分我,請問有什麼理由要求我修改,如果沒能力改,就花錢來找我上課。

[公告2019/12/01] 若各位有 Excel VBA 案子開發需求,歡迎與我聯繫,可接案處理。

[公告2020/05/22] 頁面載入速度慢,起因為部分JS來源(alexgorbatchev.com)失效導致頁面載入變慢,目前已做調整,請多見諒。

2016年2月10日 星期三

PE文件格式介紹(1)

為了要了解API Hook,不得不將以前碰過的PE格式拿出來再翻一遍,順便也加上一些註解說明,以便未來在看的時候可以很快的入手。
PE(Portable Executable,縮寫 PE),全名可移植的可執行文件,舉凡EXE、DLL、SYS等檔案都包含在內,想了解更多有關PE問間隔式的簡介,請參考Wiki介紹,以下筆者盡量以圖簡單介紹,畢竟只是要簡單了解而已,不用深入地去探究它,不然要說完全部內容可能都天黑了。
網路上有一些查看PE文件格式的工具,如 PEviewCFF Exolorer等,各位朋友們可以抓下來使用。
廢話不多說,就拿前面介紹 用Windows API取得系統SMBIOS table的資訊 文章中的EXE來說明。
以下圖片是以PEview 開啟 SMBIOS.exe的圖片。

筆者將圖片中幾個主要的範圍與地方,分別以不同顏色區分開。

藍色的部分為IMAGE_DOS_HEADER
typedef struct _IMAGE_DOS_HEADER
{
     WORD e_magic;
     WORD e_cblp;
     WORD e_cp;
     WORD e_crlc;
     WORD e_cparhdr;
     WORD e_minalloc;
     WORD e_maxalloc;
     WORD e_ss;
     WORD e_sp;
     WORD e_csum;
     WORD e_ip;
     WORD e_cs;
     WORD e_lfarlc;
     WORD e_ovno;
     WORD e_res[4];
     WORD e_oemid;
     WORD e_oeminfo;
     WORD e_res2[10];
     LONG e_lfanew;
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

用以下的表格,再比對上面的結構與圖來看會比較清楚每個欄位的數值,這樣會比較容易清楚了解。

綠色的部分為MS-DOS Stub Program,一般不適合探討的重點範圍,筆者為了區隔開所以將他以綠色畫起來。

粉紅的部分為IMAGE_NT_HEADERS
typedef struct _IMAGE_NT_HEADERS
{
     ULONG Signature;
     IMAGE_FILE_HEADER FileHeader;
     IMAGE_OPTIONAL_HEADER OptionalHeader;
} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;

ULONG Signature;

IMAGE_FILE_HEADER FileHeader;
typedef struct _IMAGE_FILE_HEADER
{
     WORD Machine;
     WORD NumberOfSections;
     ULONG TimeDateStamp;
     ULONG PointerToSymbolTable;
     ULONG NumberOfSymbols;
     WORD SizeOfOptionalHeader;
     WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;


欄位注意
  1. Machine = 0x014C,表示該檔案為x86的檔案,可參考微軟官方網頁 IMAGE_FILE_HEADER structure
  2. TimeDateStamp = 0x56860660 (單位:秒),換算成10進制為1451624032秒。
  3. 換算成人們看得懂的時間
    1451624032/(365*24*60*60) = 46年餘968032秒,從1970年開始計算到現在 1970 + 46 = 2016。
    968032/(24*60*60) = 11天於17632秒
    17632/(60*60)  = 4小時餘3232秒, GMT + 8 + 4 = 12
    3232/60 = 53分餘52秒

  4. Characteristics = 0x0102,表示32位元的可執行檔,可參考微軟官方網頁 IMAGE_FILE_HEADER structure 說明。

AGE_OPTIONAL_HEADER OptionalHeader;
typedef struct _IMAGE_OPTIONAL_HEADER
{
     WORD Magic;
     UCHAR MajorLinkerVersion;
     UCHAR MinorLinkerVersion;
     ULONG SizeOfCode;
     ULONG SizeOfInitializedData;
     ULONG SizeOfUninitializedData;
     ULONG AddressOfEntryPoint;
     ULONG BaseOfCode;
     ULONG BaseOfData;
     ULONG ImageBase;
     ULONG SectionAlignment;
     ULONG FileAlignment;
     WORD MajorOperatingSystemVersion;
     WORD MinorOperatingSystemVersion;
     WORD MajorImageVersion;
     WORD MinorImageVersion;
     WORD MajorSubsystemVersion;
     WORD MinorSubsystemVersion;
     ULONG Win32VersionValue;
     ULONG SizeOfImage;
     ULONG SizeOfHeaders;
     ULONG CheckSum;
     WORD Subsystem;
     WORD DllCharacteristics;
     ULONG SizeOfStackReserve;
     ULONG SizeOfStackCommit;
     ULONG SizeOfHeapReserve;
     ULONG SizeOfHeapCommit;
     ULONG LoaderFlags;
     ULONG NumberOfRvaAndSizes;
     IMAGE_DATA_DIRECTORY DataDirectory[16];
} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;


欄位注意
  1. MajorLinkerVersion = 0x0A,表示使用VC2010連結器的版本。
  2. MajorLinkerVersion = 0x06,表示使用VC6連結器的版本。
  3. MajorOperatingSystemVersion = 0x05,表示作業系統的版本。
  4. MinorOperatingSystemVersion = 0x01
IMAGE_DATA_DIRECTORY
typedef struct _IMAGE_DATA_DIRECTORY
{
     ULONG VirtualAddress;
     ULONG Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;


這裡就以一張PE文件格的圖做結束,後續會再針對其他未介紹的部分做說明。
圖片來源:典型PE文件格式

參考資料: