增加一个能力档的详细改法
在论坛里不断有网友询问如何增加能力档,对于这个问题,一直也没有看到很全面的解答,我个人曾经研究过这个问题,略作说明,不足之处还请指正。
以下的代码和说明均是以我发部的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 编辑 ] | |