第一階段: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中的大小。