diy pe的教學文章1 (6千字)

看雪資料發表於2002-08-08

首先宣告:我這片文章不是給初學cracker的人看得,如果是初學者,就不要來信問我基本的cracker問題

網路軍棋現在是很流行,我自己也沉迷裡面了,不過作為一個菜鳥diype者(現在ltjjj,hying,囚童,夜月等高手都說自己菜,我也不能落後),只不過覺的原來軍棋程式設計有些地方煩人就diy it當它按照自己的意思辦
目標中國遊戲中心,網路軍棋。版本---你現在能下到的最新版.
比如當你點選求和後,按鈕會變灰(用到了enablewindow的api,修改其前面的push 0為push 1就不會變灰了),然後彈出視窗提示求和請求傳送完畢,挺煩人的,現在我就來修改這個彈出的提示,讓他不要彈出視窗提示,把提示改動到右邊的riched框裡顯示。好我們首先觀察這段,這裡是原來的程式碼
:004034CE E81E860100              call 0041BAF1
:004034D3 6A00                    push 00000000==》傳送引數
:004034D5 6A00                    push 00000000==》傳送引數

* Possible StringData Ref from Data Obj ->"求和請求傳送完畢"
                                  |
:004034D7 687CA24500              push 0045A27C==》傳送顯示文字地址的引數
:004034DC E8AF1A0100              call 00414F90==》這個函式就彈出提示
:004034E1 83C40C                  add esp, 0000000C
我們知道了需要顯示“求和請求傳送完畢”的文字offset是0045A27C。現在想到啟動軍棋後,都會在右邊的riched框裡顯示"歡迎進入四國軍棋"的字樣。我們看看
其顯示程式碼如下
:0040F646 6A00                    push 00000000==》傳送引數
:0040F648 6A09                    push 00000009==》傳送引數
* Possible StringData Ref from Data Obj ->"歡迎進入四國軍棋"
                                  |
:0040F64A 682CAB4500              push 0045AB2C==》傳送顯示文字地址的引數
:0040F64F 8B45F8                  mov eax, dword ptr [ebp-08]
:0040F652 8B887A450000            mov ecx, dword ptr [eax+0000457A]==》這裡又多了個引數ecx,這個引數是用來描述riched框的狀態的,每次都不同。
:0040F658 E8491C0000              call 004112A6==》這個函式就會在riched框顯示前面push的字串
:0040F65D B801000000              mov eax, 00000001
好了,知道了函式如何工作的,我們就開始修改,首先在右邊riched顯示字串的引數比彈出對話方塊的引數多一個,而且這個引數是變化的,所以我們要在其使用
這個引數的時候把ecx儲存下來
修改後如下:
:0040F646 6A00                    push 00000000
:0040F648 6A09                    push 00000009
* Possible StringData Ref from Data Obj ->"歡迎進入四國軍棋"
                                  |
:0040F64A 682CAB4500              push 0045AB2C
:0040F64F 8B45F8                  mov eax, dword ptr [ebp-08]
:0040F652 E980B70300              jmp 0044ADD7==》調到儲存引數的地方,你可以自己尋找code段、data段對齊後之間的空隙,把自己的程式碼鑲嵌裡面,我這裡是44ADD7的地方
:0040F657 90                      nop
:0040F658 E8491C0000              call 004112A6


:0044ADD7 8B887A450000            mov ecx, dword ptr [eax+0000457A]==》這是原句
:0044ADDD 890D40AB4500            mov dword ptr [0045AB40], ecx==》把ecx儲存在45ab40處,當然你也可以尋找其他的地方,我是使用了原來的單機版的資料空間
:0044ADE3 E97048FCFF              jmp 0040F658==》儲存完畢,跳回

好了,現在我們把引數已經儲存好了,下一步
就是修改原來求和顯示的程式碼如下
:004034CE E81E860100              call 0041BAF1
004034D3: E910790400                  jmp        .00044ADE8 ==》跳到儲存引數的地方
004034D8: 90                          nop
004034D9: 90                          nop
004034DA: 90                          nop
004034DB: 90                          nop
004034DC: E8C5DD0000            call 004112A6==》這個call已經改為在riched控制元件顯示的call了
:004034E1 83C40C                  add esp, 0000000C


0044ADE8: 6A00                        push        000==》傳遞引數
0044ADEA: 6A09                        push        009==》傳遞
0044ADEC: 8B0D40AB4500                mov        ecx,[00045AB40]==》把我們原來儲存的ecx傳遞回來
0044ADF2: 687CA24500                  push        00045A27C===》傳遞offset of"求和請求傳送完畢"
0044ADF7: E9E086FBFF                  jmp        .0004034DC===》jmp 顯示call程式碼
這樣點選求和後就回在右邊的riched控制元件裡面顯示提示了,而不會彈出視窗提示。
當對方不同意和棋也會彈出視窗(我們也把他修改為在右邊riched控制元件顯示),其程式碼如下
:0040C02D 52                      push edx

* Possible StringData Ref from Data Obj ->"%s 不同意和棋"
                                  |
:0040C02E 6880A74500              push 0045A780
:0040C033 8D45F0                  lea eax, dword ptr [ebp-10]
:0040C036 50                      push eax
:0040C037 E8F9880200              call 00434935
:0040C03C 83C40C                  add esp, 0000000C
:0040C03F 6A00                    push 00000000
:0040C041 6A00                    push 00000000
:0040C043 8D4DF0                  lea ecx, dword ptr [ebp-10]
:0040C046 E89587FFFF              call 004047E0
:0040C04B 50                      push eax===》這個地址就是%s 不同意和棋的地址
:0040C04C E83F8F0000              call 00414F90==》這個call很眼熟吧,就是前面彈出視窗的call(這裡可以修改跳到自己的顯示程式碼上,保證引數正確就ok)
:0040C051 83C40C                  add esp, 0000000C

觀察以後發現如果要在右邊控制元件顯示的話,只需要增加一個引數ecx這次用的ecx引數和上次用的不同了,call 004112A6就ok
好我們在看這段
:00415F49 50                      push eax

* Possible StringData Ref from Data Obj ->"%s進來了"
                                  |
:00415F4A 68F4B14500              push 0045B1F4
:00415F4F 8D8D2CFFFFFF            lea ecx, dword ptr [ebp+FFFFFF2C]
:00415F55 51                      push ecx
:00415F56 E8DAE90100              call 00434935
:00415F5B 83C40C                  add esp, 0000000C
:00415F5E 6A00                    push 00000000
:00415F60 6A09                    push 00000009
:00415F62 8D8D2CFFFFFF            lea ecx, dword ptr [ebp+FFFFFF2C]
:00415F68 E873E8FEFF              call 004047E0
:00415F6D 50                      push eax
:00415F6E 8B8D28FFFFFF            mov ecx, dword ptr [ebp+FFFFFF28]
:00415F74 81C1DE000000            add ecx, 000000DE==》這個引數就可以用來顯示%s哦,儲存這個正確的引數,用來做以後的顯示
:00415F7A E827B3FFFF              call 004112A6==》看到這句了麼,怪眼熟的吧,就是在riched控制元件裡顯示東西的函式哦:)
:00415F7F C745FCFFFFFFFF          mov [ebp-04], FFFFFFFF

下面要做的工作和第一此差不多,就是儲存引數,修改跳轉,大家要學新東西,我也就不羅嗦重複的工作了。自己修改就ok了,我主要是介紹一種diy pe的思想
可以利用軟體提供的一些函式達到我們自己的目的(首先是你要看得懂這些函式),對於軍棋這個網路遊戲還是有很多的漏洞的,仔細研究就會發現,可以使自己下棋不超時,讓所有的棋子都變成司令,把地雷放在第一排,讓棋子可以不受規則限制到達任何地方,自己逃跑不扣分,下輸了就解散棋局等,鑑於要維護中國遊戲中心的平衡性我就不便在這裡提供如何修改程式碼達到這些目的。主要是怕中游可能會把我告上法庭???:)不過中游的所有遊戲都有漏洞,我自己倒是做了n個遊戲作弊版在上面過癮。就像當年用fpe修改紅色警報一樣過癮(主要是現在程式設計工作不忙,所以有點不務正業了)。有興趣者可以自己去跟蹤中國遊戲的程式碼,可以發email和我交流pll621@yeah.net不過不要在中游和我下棋,打牌,打檯球什麼的,我可是有作弊版本的作弊冠軍哦!
                                                        文筆不好,感覺很多東西可以交流的,但是用語言表達不出來,只能寫程式程式碼比較方便。你的朋友:pll621

相關文章