游侠NETSHOW论坛

标题: 分享偶今天对城市兵装上限代码的一点研究 [打印本页]

作者: ryan_knight_12    时间: 2010-3-26 21:05:38     标题: 分享偶今天对城市兵装上限代码的一点研究

这段代码是判断城市兵装、攻具、舰船上限的代码,程序中共有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个小时的研究成果,贴上来分享一下,希望能有点借鉴作用。
作者: 8043235    时间: 2010-3-26 21:34:13

第一时间~~~    20破~~~~~~~~~~`
作者: bondelj    时间: 2010-3-26 22:45:31

好复杂···能做成修改器更好···LZ强人·····
作者: ryan_knight_12    时间: 2010-3-26 23:22:48

已经做到自己的修改器里了。。。
作者: bondelj    时间: 2010-3-27 03:34:44

原帖由 ryan_knight_12 于 2010-3-26 23:22 发表
已经做到自己的修改器里了。。。


了解了,应该是那个统帅决定攻击的修改器吧?

不知LZ在游侠是否专发一帖提供修改器了?
作者: cyehua    时间: 2010-3-27 07:35:14     标题: 回复 #5 bondelj 的帖子

http://tieba.baidu.com/f?kz=735078306
我发给你好了
作者: adam_zhou    时间: 2010-3-27 12:16:59

强人啊,用汇编来分析啊!!!!
作者: ryan_knight_12    时间: 2010-3-27 13:19:46     标题: 回复 #5 bondelj 的帖子

鉴于游侠里面都是GM、FPE牛人,所以我要等到完善后再到这里发
作者: bondelj    时间: 2010-3-27 23:27:25

原帖由 ryan_knight_12 于 2010-3-27 13:19 发表
鉴于游侠里面都是GM、FPE牛人,所以我要等到完善后再到这里发

LZ严谨,期待完善的修改器·····
作者: huxinwanghuaxue    时间: 2010-3-27 23:31:21

楼主发这种让人看不懂的帖子,真是罪过啊。 我过来围观一下。




欢迎光临 游侠NETSHOW论坛 (https://game.ali213.net/) Powered by Discuz! X2