其實看雪的一些前輩已經學過了相關的文章,由於本人技術很菜,下面如果有寫得不足之處還請指出.
*********************
作者:二點(BrOkeN)
*********************
工具:
PEditor
stud-PE
HIEW
Winhex
實驗物件:Window 98的記事本(notepad.exe).
*********************
描述:
我們要給一個程式加一個對話方塊首先要有:
1.在程式中多餘的空間,這樣可以用來加入我們的程式碼,對話方塊標題和內容的文字.
2.要有MessageBox或MessageBoxA函式的地址,MessageBoxA位於user.dll裡面,如果程式本身已經引入了這個函式,我們找到該函式在程式裡面的地址就可以直接可以在程式裡呼叫它了(記事本里已經引入了MessageBoxA這個函式,關於如何知道請見下面),如果程式本身沒有引入了這個函式,那麼我們就要手動在輸入表(import table)里加入該函式(這裡本文不討論,詳細可以見一些打QQ補丁的文章,看學精華里有).
3.在彙編中呼叫一個函式,首先先將函式引數壓棧,最後一個引數先壓棧,然後是最第二個...最後是第一個引數壓棧,壓棧在彙編裡是這樣表達的:
push xxx
xxx 可以是一個常數,也可以是一個函式引數的地址.
MessageBoxA的函式模型.
int MessageBox
( HWND hWnd, // 視窗控制程式碼,一般不需要,我們可以設為0,
LPCTSTR lpText, // 對話方塊的內容.
LPCTSTR lpCaption, // 對話寬的標題,
UINT uType //對話方塊的風格.
***********************
手術過程:
我們先來看看notepad.exe的塊表;用PEditor開啟notepad .exe,點選右下角的"sections",看到:
Section Virtual Size Virtual Offset Raw Size Raw Offset Characteristics
.text 00003FD4 00001000 00004000 00001000 60000020
.data 0000084C 00005000 00001000 00005000 C0000040
.idata 00000E02 00006000 00001000 00006000 40000040
.rsrc 00004FB8 00007000 00005000 00007000 40000040
.reloc 00000AC6 0000C000 00001000 0000C000 40000040
從這裡我們可以知道notepad.exe的RVA=Offset(Virtual Offset=Raw Offset),這樣我們下面的一些操作就可以省去要用工具把Offset (檔案偏移)轉換為RVA(相對虛擬地址)或VA(虛擬地址)的麻煩了,如果不相同就要將Offset轉換為RVA,VA)
看sections除了瞭解一下程式本身外,也為了要找到一些空餘的空間可以用來加入我們的程式碼,因為一般情況下在每一個段的間縫處都可以找到一些空餘的空間,我們可以看到.data(資料段)是從00005000開始的,用Winhex開啟,跳到Offset 00005000,向下翻果然在004052A0開始發現有一大段空間(注意:如果在程式中找不到空餘的空間,那麼可以用一些工具來增加一些空間,比如:topo ) :
000052A0: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00
000052B0: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00
000052C0: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00
000052D0: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00
000052E0: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00
000052F0: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00
00005300: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00
00005310: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00
00005320: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00
00005330: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00
00005340: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00
現在我們選擇004052E0來加入我們的對話寬的標題.
選擇00405300來加入我們的對話方塊的內容.
000052A0: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00
000052B0: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00
000052C0: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00
000052D0: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00
000052E0: 4D 65 73 73-61 67 65 42-6F 58 21 00-00 00 00 00 MessageBoX!
000052F0: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00
00005300: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00
00005310: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00
00005320: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00
00005330: 48 65 48 65-21 54 68 69-73 20 4E 6F-74 65 70 61 HeHe!This Notepa
00005340: 64 20 77 61-73 20 70 61-74 63 68 65-64 20 42 79 d was patched By
00005350: 20 42 72 4F-6B 65 4E 2E-0A 63 6E 62-72 6F 6B 65 BrOkeN.cnbroke
00005360: 6E 40 68 61-63 6B 65 72-6D 61 69 6C-2E 63 6F 6D n@hackermail.com
現在我們搞定了對話寬的標題和對話方塊的內容,接著的就是要找MessageBoxA在notepad.exe中呼叫的地址, 用stud-PE開啟notepad.exe選擇functions,將選中左下角最左的兩個選擇框,展開user.dll可以看到:
+MessageBoxA ord:428 rva:0064AC
那麼MessageBoxA的虛擬地址就是(VA)=RVA(相對虛擬地址) + imagebase(基址)=000064AC+00400000=004064AC
所以,我們的程式碼中Call dword [004064AC]就等於Call MessageBoxA。
現在就可以來寫我們的程式碼了,我把程式碼放在Offset=000053A0處,我構造的程式碼如下;
push 00000000 //對話方塊的風格,0為只有一個確定(OK)按鍵,1為一個確定和取消按鍵,其它請參考編 程書籍。
push 004052E0 // 對話寬的標題.注意:這裡表示的都是虛擬地址,我們上面在檔案中新增文字的是 檔案的Offset,如果程式的Offset <> RVA,那麼就要用工具進行轉換了,PEditor 有這個功能。
push 00405330 // 對話方塊的內容.
push 00000000 // 視窗控制程式碼,一般不需要,我們可以設為0
Call dword [004064AC] //呼叫MessageBoxA.
jmp 10CC //執行程式碼後跳到notepad入口點(可以在PEditor看到Entry Point=000010CC)
現在手術就要成功了,用hiew開啟notepad,f4選擇decode 模式,按f5,輸入53A0,enter來到53A0處,按f3,enter後
輸入上面程式碼,完成後esc,再按f9更新:
004053A0: 6A00 push 000
004053A2: 68E0524000 push 0004052E0 ----- (1)
004053A7: 6830534000 push 000405330 ----- (2)
004053AC: 6A00 push 000
004053AE: FF15AC644000 call MessageBoxA ;USER32.dll
004053B4: E913BDFFFF jmp .0004010CC ----- (3)
現在要做的就是讓程式執行的從我們的程式碼處開始執行,也就是要把程式的入口點改到我們的程式碼處,先執行我們的程式碼然後在跳到程式原來的入口點,用PEditor開啟notepad將Entry Point=000010CC改為Entry Point=000053A0就大功告成了,執行程式看看,哈哈,對話方塊是不是跳出來了啊,好開心