Exe文件中
3B7D0开始66个字节 取值范围0-1CH 法术威力
在策略伤害公式中,[(攻击方精神力-防御方精神力)*1/3+攻击方等级+25]*K,取值0~1C对应的系数K如下所示:
0.2:0D、18
0.4:0B、16
0.5:02、07、09、0C、14、17
0.7:00、03、05、08、0A、0E、10、13、15、1A
0.9:01、04、06、0F、11
1.0:1B
1.2:12、19
0.0:1C
可以看到,这里有29种取值,而对应的K的取值却只有8种。实际上浪费了21种取值。我们可以把这21种取值占用的空间腾出来,实现更多的K的取值。
从3B75C开始是这些取值的跳转表,每个取值对应跳转表中的4个字节。
这4个字节是跳转表对应的虚拟地址(RVA),减去400C00即为实际地址,可以找到实际地址从3B4AA开始,共70个字节。8组代码。前7组代码每组9个字节,是
C7 45 F8 XX 00 00 00 EB YY(XX,YY数值不固定)
最后一组是7个字节,没有后面的EB YY
借助反汇编可以看出,前7组代码由两条指令组成,分别是(以第一组为例,左侧为机器码,右侧为反汇编结果)
C7 45 F8 02 00 00 00 mov[ebp-08],00000002
EB 3D jmp 0043C0F0
可以看出[ebp-08]中存放的就是系数K*10,机器码中的XX就是K*10
第二条指令则是跳转。第8组代码只有一条指令,不需要跳转。
也就是说,要增加一个新的K值,需要9个字节的指令,以及4个字节的跳转表,总共13个字节。84/13=6。可以增加6个K值。
把K值和3B7D0开始的取值重新安排一下:
0.0:00 0.2:02 0.3:02
0.4:03 0.5:04 0.6:05
0.7:06 0.8:07 0.9:08
1.0:09 1.1:0A 1.2:0B
1.3:0C 1.4:0D
(把0.0安排在00还有其他意义,后面会看到)
具体修改方法:
1 将3B4F0开始的620字节向后移动54个字节,并将其后的6个字节改为00。
2 修改从3B4AA开始的描述,一共14组代码,前13组每组9个字节,为
C7 45 F8 XX 00 00 00 EB YY
其中,XX依次为00,02,03,04,05,06,07,08,09,0A,0B,0C,0D
YY则为
73,6A,61,58,4F,46,3D,34,2B,22,19,10,07(还好不需要长跳转)
最有一组只有C7 45 F8 0E 00 00 00
3 修改跳转表,从3B798开始,
AAC04300 B3C04300 BCC04300 C5C04300
CEC04300 D7C04300 E0C04300 E9C04300
F2C04300 FBC04300 04C14300 0DC14300
16C14300 14C14300
4 通过反汇编可以看出有相当多的相关跳转和调用需要修改:
跳转:
3B4A6为跳转表的入口,原为5CC343,现改为98C343
3B497处的51改成12(这里是跳转到K=0的代码)
3B456的FC02改为3203
3B3FE的54改为8A
3B427的2B改为61
3B3DA的75改为AB
调用:
3B55C的74改为3E
3B57D的C5改为8F
3B5E2的C0改为8A
3B60B的47改为11
3B629的12B8改为DCB7
3B642的E2改为AC
3B675的DD改为A7
3B694的A7改为71
3B6AD的77改为41
3B6D3的68改为32
3B6E1的43改为0D
3B70A的3B改为05
3B732的9E改为68
3B75B的1765改为E164
3B768的0A65改为D464
3B775的4D改为17
3B782的40改为0A
|