PE文件格式分析


第一階段:PE文件格式分析

使用UltraEdit觀察PE文件例子程序hello-2.5.exe的16進制數據,在打印稿中畫出該PE文件基本結構。

使用Ollydbg對該程序進行初步調試,了解該程序功能結構,在內存中觀察該程序的完整結構。 熟悉各類PE文件格式查看和編輯工具(PEView、Stud_PE等)。

使用UltraEdit修改該程序,使得該程序僅彈出第二個對話框。

第二階段:熟悉並分析PE文件的引出表

找到系統System32目錄下的user32.dll文件,用UltraEdit打開並分析該文件引出表,找出函數MessageBoxA的地址,並驗證該地址是否正確。

第三階段:熟悉並修改PE文件的引入表結構,以及代碼段和數據段

手工修改hello-2.5.exe程序,使得其可以彈出第三個對話框

用UltraEdit修改hello-2.5.exe程序的引入表,使該程序僅可以從kernel32.dll中引入LoadLibrary和GetProcAddress函數,而不從user32.dll導入任何函數。然后,在代碼節中寫入部分代碼利用這兩個函數獲取MessageBoxA的函數地址,使hello-2.5.exe程序原有功能正常。

第四階段:熟悉並修改PE文件的資源表

利用PEview.exe熟悉PEview.exe程序的資源表的結構。

用UltraEdit修改PEview.exe,使得該文件的圖標變成csWhu.ico。

熟悉eXeScope工具的使用,並利用該工具漢化PEview.exe程序。

第五階段:思考

如何打造最小的PE文件:修改WHU_PE-2.5.exe文件,保持該文件的功能不變,使得該文件大小盡可能小。

替換程序的圖標時,如果新圖標比原有圖標大,應該如何解決?

如何給一個沒有圖標的程序(如hello-2.5.exe),添加一個圖標?

1.PE文件格式分析

 

代碼節

 

引入函數節

 

 

已初始化的數據節

 

OD觀察結構

 

STUDYPE

 

 

PEview

 

2.修改使只彈出第二個窗口:

查看到第二個窗口RVA為1016

 

在PE文件可選映像頭AddressofEntryPoint處(大小4字節,偏移10H)修改值為1016

原:

 

修改后:

 

效果圖:

 

 

3.找到系統System32目錄下的user32.dll文件,用UltraEdit打開並分析該文件引出表,找出函數MessageBoxA的地址,並驗證該地址是否正確。

這里采用上課教授的PEview+STUD_PE方法

1.使用PEView打開user32.dll,查找MessageBoxA的RVA。

在AddressOfNames數組(Name Pointer Table)中找到MessageBoxA字符串,其數組序號為01DD

 

 

0000740C在EXPORT NAME 位置上是字符串 MessageBoxA


 

在Ordinal Table找到序號(Value)01DD項,Data為01DC。而由於Ordinal Table中Data從0開始,故在Address Table中找到第01DC+1 即01DD項

 


 

 

Data為407EA,也即MessageBoxA的RVA

 

2.得到其RVA為407EA后,用Stud_PE打開user32.dll,使用Raw與Rva轉換功能,得其VA為77D507EA。

3.用OD打開hello-2.5.exe,查看MessageBoxA,對比,確認一致

 

4.手工修改hello-2.5.exe程序,使得其可以彈出第三個對話框。

OD打開hello-2.5.exe

1.修改.data  title和text之間用00隔開

 

2.修改其代碼

 


 

這里注意先添加了五行,類似前兩個彈窗的代碼

然后將原來最后的六行下移

然后修改前三個CALL,因為可以看到三個JMP的位置已經改變了。比如MessageBoxA變成401056

 

然后修改最后一個call,這里call的是結束,0040104a

然后修改新框的title為00403059,這是我們剛剛在.data中添加內容的起始地址

 


 

Text為0040306E 這樣就顯示data段添加的內容,而不是原來的內容教學測試

 

然后保存

先保存.Text段

再保存.data段(保存時選中所有修改)

最后保存為文件

 

1.拓展

這里JMPmessagebox也是一個跳轉,402008.

於是上面call messagebox的地方也可以直接call 402008

 


 

 


 

效果圖:

就不放了。。效果是彈出了第三個框:

5.用UltraEdit修改hello-2.5.exe程序的引入表,使該程序僅可以從kernel32.dll中引入LoadLibrary和GetProcAddress函數,而不從user32.dll導入任何函數。然后,在代碼節中寫入部分代碼利用這兩個函數獲取MessageBoxA的函數地址,使hello-2.5.exe程序原有功能正常。

 

1. 修改結構IMPORT Hints/Names&DLL Names

這里每一條記錄前兩項是序號,可選。如664H開始的00 00.

兩條間用00隔開。如671H處的00.

 


 

2.修改INT

 


 

3.修改IAT

 


 

4.修改IDT

這里2092H是kernel32.dll的偏移

 


 

5.另存為hello_256.exe。用PEVIEW查看其引出節

 


 

 


 

 


 

 


 

6.修改PE頭部和節表中的相關結構

先改節表:

由PEview可知其節表位置及VirtualSize位置為1D8H。A6H為原來從600H到6A5H共6AH個字節的大小。修改為9FH.

 


 

 


 

再改PE頭部:

先查看IMPORT TABLE和IMPORT Address Table的位置

 


 

 


 

在UE中修改

 


 

7.在OD中修改代碼節和數據節

修改.data段

在“初始化數據段”添加代碼段中要用到的字符串“user32.dll”和“MessageBoxA”

記錄這兩個字符串的RVA

user32.dll:0040 3059

MessageBoxA:0040 3064

 


 

修改.text段

注意第一行匯編為:PUSH 00403059而不是PUSH hello_256.00403059

最后JMP的部分,值為VA. 比如

JMP DWORD PTR DS:[402004]即為Loadlibrary  是剛剛在PE文件IAT中修改的。

 


 

8.先保存.Text段

再保存.data段(保存時選中所有修改)

最后保存為文件 hello_2569.exe

結果如圖:

 

6.利用PEview.exe熟悉PEview.exe程序的資源表的結構。

如圖,復制了一個PEVIEW便於修改

 


 

7.用UltraEdit修改PEview.exe,使得該文件的圖標變成csWhu.ico。

在section .rsrc(資源節中)存放圖標資源。

icon 1 0001 0009

 

在DATA_ENTRY查看

 


 

大小為668H, 1640字節

而whucs.ico大小為776字節(UltraEdit打開可知。前面OD指OLLYDBG)。可以直接替換

用UE打開whucs.ico,復制內容,粘貼到PEVIEW的0000D4C0開始的位置。

注意復制的時候不要全選,否則會造成之后的文件移位。復制到D7A7

觀察可知數據從16開始復制。(“(”開始)

 

查看GROUP ICON開始位置為F3E4

 


 

然后復制whucs.ico的前20位(基本格式),復制到peview的 F3E4位置

之后注意修改icon id 16-->01,icon項數改為3.(因為原來就有3項)(具體字段內容見mooc)

 


 

保存為pevieww


 

8.熟悉eXeScope工具的使用,並利用該工具漢化PEview.exe程序。

先用exescope打開peview

修改兩處File和 open

保存,查看

 


 

9.思考

1.如何打造最小的PE文件:修改WHU_PE-2.5.exe文件,保持該文件的功能不變,使得該文件大小盡可能小。

參考慕課“挑戰自己:手工打造最小PE文件”

將NT映像頭填充到MZ文件頭和DOSstub中,保留前四個字節和入口點

刪除沒有用的節表,DataDirectory。刪除text節和rdata節中多余空間。保留IAT。

 

2.替換程序的圖標時,如果新圖標比原有圖標大,應該如何解決?

首先修改目標icon的size值。之后先計算超出多少,超出的字節后移。

然后更改之后受到影響的數據的RVA,

 

3.如何給一個沒有圖標的程序(如hello-2.5.exe),添加一個圖標?

1.添加資源節節表

修改映像文件頭中節表數,增加一

修改可選文件頭中SizeofImage,增加2000H

在DataDrictory添加資源節的RVA

2.之后在資源節節表按照成員信息填寫完成。(28H字節)

3.之后復制粘貼cs.ico的內容到icon1的偏移處。

注意修改group icon

4.添加完成后計算size,返回來修改節表的size和可選映像頭中的DataDrictory中的大小。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM