原帖内容
star175

2008-4-26 17:31
增加一个能力档的详细改法

在论坛里不断有网友询问如何增加能力档,对于这个问题,一直也没有看到很全面的解答,我个人曾经研究过这个问题,略作说明,不足之处还请指正。
以下的代码和说明均是以我发部的exe第四次修改版为例子。

由于我的exe第四次修改版已经增加了一个X能力档,在这里为了比较好的说明这个改法,就以再增加一个D能力档为例子说明。

目前exe第四次修改版的能力成长档为
                X          S         A          B         C
合格条件  100     90-98     80-88    70-78      
合格成长   5           4         3          2         1


完美条件                         100        90      100
完美成长                          4           3        3


假设现在需要修改为
                X         S            A            B           C          D
合格条件  100     90-98     80-88      70-78     60-68  
合格成长   6          5            4            3           2          1


完美条件                          100         90        100         90
完美成长                            5            4          4           3


步骤一:
用UE打开exe,按照图中的位置修改文字内容:
修改前:
图1
[attach]59963[/attach]
修改后:
图2
[attach]59964[/attach]
把这几个字母的UE位置记下来,然后关闭UE

步骤二:

先修改能力成长代码,用ollydbg打开exe,写代码:
0040736D  |.  3C 32            CMP AL,32                         ;  50×2=100
0040736F  |.  7C 04            JL SHORT Ekd5.00407375
00407371      B0 06            MOV AL,6
00407373  |.  EB 29            JMP SHORT Ekd5.0040739E
00407375  |>  3C 2D            CMP AL,2D                         ;  45×2=90
00407377  |.  7C 04            JL SHORT Ekd5.0040737D
00407379      B0 05            MOV AL,5
0040737B  |.  EB 21            JMP SHORT Ekd5.0040739E
0040737D  |>  3C 28            CMP AL,28                         ;  40×2=80
0040737F  |.  7C 04            JL SHORT Ekd5.00407385
00407381      B0 04            MOV AL,4
00407383  |.  EB 19            JMP SHORT Ekd5.0040739E
00407385  |>  3C 23            CMP AL,23                         ;  35×2=70
00407387  |.  7C 04            JL SHORT Ekd5.0040738D
00407389      B0 03            MOV AL,3
0040738B  |.  EB 11            JMP SHORT Ekd5.0040739E
0040738D      3C 1E            CMP AL,1E                         ;  30×2=60
0040738F      7C 04            JL SHORT Ekd5.00407395
00407391      B0 02            MOV AL,2
00407393      EB 09            JMP SHORT Ekd5.0040739E
00407395      B0 01            MOV AL,1                          ;  小于60的跳转到这里  增加1点
00407397  |.  90               NOP
00407398      90               NOP
00407399      90               NOP
0040739A  |.  90               NOP
0040739B  |.  90               NOP
0040739C  |.  90               NOP
0040739D  |.  90               NOP
0040739E  |>  8BE5             MOV ESP,EBP
004073A0  |.  5D               POP EBP
004073A1  \.  C2 0400          RETN 4
这里改好以后,人物升级时的能力成长就已经可以了,就是这么简单,但显示还是不行,所以还要改显示方面的代码。

步骤三:

修改显示代码
由于现在有六档能力,所以先要找一段6×4=24字节的空间。我的exe里有很多空间,我都是用90填充了,用Ctrl+B,找字节,
随意输入几个90,确定,就会跳到一些代码为都是90的地方,数到有24字节以上的地方就可以拿来用了。
图三:
[attach]59965[/attach]
我用了406A55处的位置。
现在看一下刚才记下的字母在Ue中的位置
Ue地址
X  8AEDA      
S  8AED8
A  8AED6
B  8AED4
C  8AED2
D  8AED0


在这里ob地址=Ue地址+401600
根据这个计算出ob的地址来
OB地址
X  0048C4DA
S  0048C4D8
A  0048C4D6
B  0048C4D4
C  0048C4D2
D  0048C4D0


在406A55处点一下,在Ctrl+E,进入二进制编辑窗口,输入二进制代码,注意转移顺序要颠倒过来。
图四
[attach]59966[/attach]

下面是一个很重要的自定义函数(这个函数在我的exe里已经有了,如果要在别的exe里改,需要找20字节的空间):

00406CC9  /$  55               PUSH EBP
00406CCA  |.  8BEC             MOV EBP,ESP
00406CCC  |.  25 FF000000      AND EAX,0FF
00406CD1  |.  2C 00            SUB AL,0
00406CD3      3C 06            CMP AL,7                             ;  由于最高成长为6,所以这里是7,可以根据实际情况修改
00406CD5  |.  72 02            JB SHORT Ekd5.00406CD9               ;  小于7跳转,什么都不做
00406CD7  |.  B0 05            MOV AL,6                             ;  大于等于7都设为6,这里也可根据实际情况修改
00406CD9  |>  8BE5             MOV ESP,EBP
00406CDB  |.  5D               POP EBP
00406CDC  \.  C3               RETN

这个函数的一个作用是把大于7数值都设为6,这样当你在data中把某项能力设为7或更大时,就不会出现汉字的情况了。

还有一处需要注意:

00406CD1  |.  2C 00            SUB AL,0
这一句代码看上去似乎是多余的,现在也确实如此,这是因为我们现在的成长是从1开始计数的,如果是想岳飞传那样的4、5、6、8,最低档为4,就要靠这一
句来调整了,顺便说一下,在岳飞传里的这一句是 SUB AL,3,大家可以想一想为什么。
以上就是这个自定义函数的两个主要作用了。

步骤四:

在exe里调用这个函数的地方共有5处,就是兵种的五项能力成长了
图五:
[attach]59967[/attach]
这五个地方作用是一样的,就是通过自定义函数返回的值去找到相应的字母位置以表示兵种某项能力档,现在我们先来看一下477Cf7:

00477CF7  |.  E8 CDEFF8FF   CALL GEkd5.00406CC9                      ; 自定义函数,返回eax
00477CFC  |.  8B1485 516A40>MOV EDX,DWORD PTR DS:[EAX*4+406A51]
00477D03  |.  52            PUSH EDX                                 ; /Text

关键的位置在

0477CFC  |.  8B1485 516A40>MOV EDX,DWORD PTR DS:[EAX*4+406A51]

假设兵种的某项能力为1(eax)
EAX*4+406A51=406A55,这个位置就是我们刚才输入了24个字节的起始位置,而它的值就是0048C4D0,也就是字母D在exe里的ob地址了,这样此兵种
的该项能力成长就显示为D了。

以下依葫芦画瓢,修改其余的4处,就可以了。

00477CF7  |.  E8 CDEFF8FF   CALL GEkd5.00406CC9
00477CFC  |.  8B1485 516A40>MOV EDX,DWORD PTR DS:[EAX*4+406A51]

00477D30  |.  E8 94EFF8FF   CALL GEkd5.00406CC9
00477D35  |.  8B0485 516A40>MOV EAX,DWORD PTR DS:[EAX*4+406A51]

00477D69  |.  E8 5BEFF8FF   CALL GEkd5.00406CC9
00477D6E  |.  8B0C85 516A40>MOV ECX,DWORD PTR DS:[EAX*4+406A51]

00477DA0  |.  E8 24EFF8FF   CALL GEkd5.00406CC9
00477DA5  |.  8B1485 516A40>MOV EDX,DWORD PTR DS:[EAX*4+406A51]

00477DD9  |.  E8 EBEEF8FF   CALL GEkd5.00406CC9
00477DDE  |.  8B0485 516A40>MOV EAX,DWORD PTR DS:[EAX*4+406A51]

注意:需要说明的是改这几处代码最好是用Ctrl+E用二进制模式改,用汇编模式改会多占用调一个字节,会把下面一句给冲掉,不注意的话就出错了


修改完毕。

[ 本帖最后由 star175 于 2008-4-26 17:39 编辑 ]

用户名时间功绩理由
yanguodong 2008-4-27 14:08 +109 好帖奖励




当前时区 GMT+8, 现在时间是 2024-12-27 11:11
京ICP备2023018092号 轩辕春秋 2003-2023 www.xycq.org.cn

Powered by Discuz! 5.0.0 2001-2006 Comsenz Inc.
Processed in 0.012366 second(s), 6 queries , Gzip enabled

清除 Cookies - 联系我们 - 轩辕春秋 - Archiver - WAP