- UID
- 2654655
- 主题
- 8
- 阅读权限
- 50
- 帖子
- 1502
- 精华
- 1
- 积分
- 1180
- 金钱
- 6398
- 荣誉
- 22
- 人气
- 92
- 在线时间
- 2670 小时
- 评议
- 0
- 帖子
- 1502
- 精华
- 1
- 积分
- 1180
- 金钱
- 6398
- 荣誉
- 22
- 人气
- 92
- 评议
- 0
|
这段代码是判断城市兵装、攻具、舰船上限的代码,程序中共有7段判断,都差不多,修改起始地址分别为:
0x0047B382 0x0047BDB73 0x005C7321 0x005ED009 0x005F1BAE 0x00607848 0x00607B64
看看原始的程序:
0047B370 - 8b 44 24 04 - mov eax,[esp+04] //将兵装类型放入EAX
0047B374 - 85 c0 - test eax,eax //测试EAX否为0(剑兵)
0047B376 - 7c 1c - jnge 0047b394 //EAX为0则跳转到0047B394
0047B378 - 83 f8 0b - cmp eax,0b //比较EAX与11(11以上应该是未知兵装)
0047B37B - 7f 17 - jg 0047b394 //如果EAX大于11则跳转到0047B394
0047B37D - 33 c9 - xor ecx,ecx //ECX清零
0047B37F - 83 f8 04 - cmp eax,04 //比较EAX与4(1-4为兵装,5-11为攻具舰船)
0047B382 - 0f 9f c1 - setg cl //如果EAX大于4则将CL(ECX的低8位)置为1(由于ECX是0,此命令即将ECX置为1)
0047B385 - 49 - dec ecx //ECX自减1(即如果EAX代表兵装,此时ECX是0xFFFFFFFF,如果EAX代表攻具舰船,此时ECX是0x00000000)
0047B386 - 81 e1 3c 86 01 00 - and ecx,0001863c //将ECX与兵装最大值(99000)做逻辑与操作(即如果EAX代表兵装,ECX置为兵装上限值,如果EAX代表攻具舰船,ECX仍为0)
0047B38C - 83 c1 64 - add ecx,64 //将ECX的值加上攻具舰船上限(100),仍置入ECX(这解释了为什么兵装上限设为99900,攻具上限设为100时,实际兵装上限为100000)
0047B38F - 8b c1 - mov eax,ecx //将EAX的值置为ECX(上限)的值
0047B391 - c2 04 00 - ret 0004 //返回
0047B394 - 33 c0 - xor eax,eax //EAX清零
0047B396 - c2 04 00 - ret 0004 //返回
VAN解除了这个上限,使兵装与攻具船舰共享一个上限。
【VAN的改法(修改了前面加*的地址)】
0047B370 - 8b 44 24 04 - mov eax,[esp+04]
0047B374 - 85 c0 - test eax,eax
0047B376 - 7c 1c - jnge 0047b394
0047B378 - 83 f8 0b - cmp eax,0b
0047B37B - 7f 17 - jg 0047b394
0047B37D - 33 c9 - xor ecx,ecx
0047B37F - 83 f8 04 - cmp eax,04
*0047B382 - 90 90 90 - nop nop nop //取消原来对兵装、攻具舰船的区别处理,等于将攻具舰船等同于兵装
0047B385 - 49 - dec ecx //ECX自减1(此时ECX是0xFFFFFFFF)
*0047B386 - 81 e1 FF FF FF 07 - and ecx,7FFFFFFF //将ECX与兵装上限(2亿多)做逻辑与操作(即兵装和攻具舰船的上限都设为此值)
*0047B38C - 83 c1 00 - add ecx,00 //将ECX的值加上攻具舰船最大值(改为0,则此句执行完上限不变)
0047B38F - 8b c1 - mov eax,ecx
0047B391 - c2 04 00 - ret 0004
0047B394 - 33 c0 - xor eax,eax
0047B396 - c2 04 00 - ret 0004
偶觉得有必要将兵装和攻具船舰上限区别对待,所以也改了一下
【我的改法(修改了前面加*的地址)】
0047B370 - 8b 44 24 04 - mov eax,[esp+04]
0047B374 - 85 c0 - test eax,eax
0047B376 - 7c 1c - jnge 0047b394
0047B378 - 83 f8 0b - cmp eax,0b
0047B37B - 7f 17 - jg 0047b394
0047B37D - 33 c9 - xor ecx,ecx
0047B37F - 83 f8 04 - cmp eax,04
*0047B382 - 7f 08 - jg 0047b38c //如果EAX大于4则跳转到0047B386, 同时省下一个字节
*0047B384 - b9 3c 86 01 00 - mov ecx,000186a0 //直接将ECX置为兵装上限(比如100000),删掉ECX自减1这一个字节,同时再省下一个字节
*0047B389 - 90 - nop //空执行一个富裕字节
*0047B38A - eb 03 - jmp 0047b38f //无条件跳转到0047B38F,不再去加攻具舰船上限值
*0047B38C - 80 c1 64 - add cl,64 //CL(ECX的低8位)的值设为攻具舰船上限(比如100),这个无符号操作突破了127限制,使攻具舰船最大值可达到255
0047B38F - 8b c1 - mov eax,ecx
0047B391 - c2 04 00 - ret 0004
0047B394 - 33 c0 - xor eax,eax
0047B396 - c2 04 00 - ret 0004
好了,这就是4个小时的研究成果,贴上来分享一下,希望能有点借鉴作用。  |
|