• 标 题:diy pe的教学文章1 (6千字)
  • 作 者:pll621
  • 时 间:2002-8-8 11:35:06
  • 链 接:http://bbs.pediy.com

首先声明:我这片文章不是给初学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