第二部分 PE檔案格式

滕瑞發表於2015-03-23

第13章 PE檔案格式

  1. Characteristics是一種掩碼工作方式,其值可以用按位或的方式疊加,用的時候和掩碼進行與操作。所以010F裡面有5個1就代表了5種屬性。

  2. PE檔案格式其實可以和其他檔案格式類比。拿圖片檔案舉例,它們也都用不同資料結構定義了檔案頭,例如圖片的長和寬、壓縮方法等。

    所以Visual Studio就如同照相機,分別用來產生可執行檔案(.exe)和圖片檔案(.jpg),而作業系統則相對於照片檢視器。這麼說來,逆向工程有點像PS的感覺了。

  3. 研究了一下RVA to RAW的演算法,居然相同節區在檔案和記憶體中的大小不一樣,而且有時記憶體中的節區比檔案中的還要小。

  4. 學習了IAT和EAT,關於import和export,在Java OSGi這種模組化程式設計中也是基本概念,不知Bundle是否來源於DLL的思想。

  5. PEView.zip的下載地址目前是:http://wjradburn.com/software/PEview.zip,但是主要針對32位exe或者dll的。64位環境中使用效果不理想。

第14章 執行時壓縮

下載了一個UPX工具,在Windows 7 64位環境下生成的檔案不能執行,在Windows XP中生成的檔案會被電腦管家當作木馬查殺。

第15章 除錯UPX壓縮的notepad程式

這一章學會了Ctrl+F8,Ctrl+F7這兩個命令,可以反覆執行F8和F7。由於程式需要解壓縮,即使完全自動執行F7、F8,程式也不會馬上結束。解壓縮的過程中,大迴圈裡面還有小迴圈。

第16章 基址重定位表

以前在OllyDbg裡面執行F2的時候,就發現每次執行的地址都在變,看完這一章後知道,原來Windows Vista之後引入了ASLR安全機制。不過還是可以修改基址重定位的型別來進行攻擊。

第17章 從可執行檔案中刪除.reloc節區

一開始在Windows7裡面修改notepad.exe,修改到最後,發現最新的PE格式裡面多了check sum,破解失敗。

  1. 修改節區頭,並刪除最後的節區內容

    enter image description here

  2. 修改節區個數

    enter image description here

  3. 等修改IMAGE_OPTIONAL_HEADER的時候,遇到了新的結構體,裡面加入了CheckSum,所以沒有成功,等以後再研究了怎麼計算CheckSum再來破解。

    enter image description here

只好再拿reloc.exe練習了一下,在PEView的幫助下,沒有難度。

今天遇到有人問.reloc節區的VirtualSize值為E40,根據Section Alignment擴充套件後變為1000,這個擴充套件的根據是怎麼來的,也就是1000是怎麼來的。這個貌似要比C語言裡面的位元組對齊複雜多了,但轉念一想,不需要知道規則,這些節區的大小在檔案裡面已經是已知的了,應該根據檔案裡面的開始和結束位置來計算出實際的擴充套件後的大小。

第18章 UPack PE檔案頭詳細分析

UPack是中國人編寫的PE壓縮器,曾經給安全界帶來不少麻煩,不過現在有Stud_PE可以對其進行分析,防毒工具也不會對其壓縮的檔案不進行區分就查殺了。

關於UPack的一些思想:

  1. e_lfanew的位置固定在3C~3F的地方,但可以將MZ檔案頭的大小設定得小一些。從而拉進了MZ和PE檔案頭的距離。至於為什麼大小為0x10,我想是因為PE檔案頭裡面正好有一個0x10,而且位置正好合適。
  2. 圖18-9勘誤如下:

    enter image description here

  3. UPack增加了IMAGE_OPTIONAL_HEADER的大小,並減少了NumberOfRvaAndSizes的值,然後在IMAGE_DATA_DIRECTORY裡嵌入的是可執行程式碼。

  4. 預設的節區是不重合的,但是UPack壓縮後的節區是重合的,可能裡面的資料很多沒有用的,或者重要資料的值相同吧。

第19章 UPack除錯-查詢OEP

有了Stud_PE的幫助,入口地址是RVA+ImageBase(00001018+01000000),另外OllyDbg 1.10需要設定一個“New origin here”。如果使用OllyDbg2.01版本,已經可以自動處理UPack壓縮過的檔案了。

第20章 “內嵌補丁”練習

計算校驗碼的地方無法在後面設定斷點,有點麻煩。

[A],[B],[C]以及[Decoding Code]的程式碼都在0x400-0x680的.text節區中,還有0x680-0x800的空間可以用,而且這部分空間是不會被解碼的。

  1. 手工輸入以下彙編程式碼,“Unpacked”居然少打了一個‘d'。

    enter image description here

  2. 儘管程式碼部分不需要解壓縮,但是入口地址的修改還是需要加密的。原來的EE 91 06需要修改為EE FF 06,即解密後的E9 96 01需要變為E9 F8 01。書上的圖例好像不太對,順手提勘誤一個:P

    enter image description here

需要用到的RVA to RAW計算我還不是很熟悉,以後再補上。

破解留念:

enter image description here

enter image description here

相關文章