【第五弹】一起做SIRE 1.29吧(兼CE教学)
在这一弹中,我们一起来做SIRE的新君主技(名字我还不知道叫啥):所属势力内政设施行动力-1。在RK的设计中,君主技和本身特技是不冲突、可以并存的,但是我们这次简单一点,就用君主本身的技能判定。我们的目标效果姑且设置成,如果君主的技能是“能吏”,则所有行动力-1。这一弹的性质以教学为主,我不会把整个特技做出来,只会给大家讲一下最核心的思路,顺便介绍一下CE。(因为RK说他已经在做了)
为了实现这个效果,首先我们找和行动力有关的函数。RK的资料显示,4A1820是军团消耗行动力(势力本身也是一个军团)。在IDA中搜索所有的XREF(引用),其中有-20行动力大概有一页那么多。
我们当然可以一个一个点进去,逐个阅读每一个调用了减行动力的函数都是干什么的。然而,这实在是太复杂了,毕竟静态就意味着无法调试,只能肉眼反汇编,效率极低。
所以我们这一次引入CheatEngine(简称CE),一个为桌面游戏设计的、基于内存的动态调试。动态调试与之前的exe修改不同的是,之前我们需要手动写机器码、然后用Hex workshop导入,虽然有一些trick可以使整个过程更加简单(比如先在IDA里边改,确保结果正确),但是毕竟还是有些复杂了。使用CE,我们直接修改内存,就算修改崩了也大不了重启一下游戏。
在开始修改之前,要明确的是,我们修改的目标是【脱壳版三国志11威力加强版1.1】的exe,是一个修改日期为2014/06/01,文件大小约156MB的exe,如果使用未脱壳版的exe,可能出现CE跳出等问题。
下面就开始吧。CE最大的好处在于,它可以动态设置断点。达到和主流正向编译器差不多的效果。在游戏中,任何内政指令都一定会调用行动力减少的函数,在行动力减少的函数执行完毕后,会返回到之前调用的下一条指令。因此,我们只要将断点设置到行动力函数减少的函数中,然后看一下是谁调用了这个函数(专业术语:查看调用堆栈),我们就可以知道每个函数都是干什么的了。
完整步骤如下:
①打开311pk脱壳版主程序,载入游戏。【将分辨率设置为窗口模式】(否则停在断点之后还要切出去,很麻烦)。
②打开CE,点击左上角闪烁的图标,选择已经打开的311主程序(可能是乱码,因为311主程序采用的是繁体版的BIG5编码,在Windows下兼容性不好)。

③点击CE上的”Memory View”,进入内存查看区域。右键点击”jump to address”,输入已知的减行动力代码段地址:4A1820,在跳转后选中代码,使用快捷键F5设置断点。设置断点后,该行代码将变为红色。
如果我们要设置断点,就需要把CE自带的调试器连接到程序上,如果弹出“是否连接调试器”的弹窗,记得点“是”。
这一步中,我们并不关心在4A1820段发生了什么,只关心它会退出到哪里。因此,我们可以直接找到这个函数的ret指令,设置断点,这样就避免每次还需要手动完成整个函数体的执行过程。

④切回游戏。假设我们想知道巡查的函数位于哪个位置,我们就进行一次巡查。如果上述操作正确,CE的Memory View弹窗的标题会提示,现在已经停在了某个断点。我们接下来使用快捷键F8进行单步执行。(注意:F7 F8都是单步执行,区别在于,如果一行代码调用了一个函数,F7会进入这个函数,F8会直接等待函数执行完毕进入下一行。如果需要查看函数调用的子函数的执行过程,请使用F7。)
⑤在执行完ret后,函数会回到上一层调用的函数中,如果到了哪一层时,函数不一样了,就说明这一层是因行动而已的调用函数了。我们接下来就可以针对性的分析这一段代码,这样就节省了大量的精力。
贴一下我找到的各个行动指令调用行动力的位置:
军团改变行动力:004A1820
军团行动(会调用上一个函数消耗行动力):005B9340
巡查:5CBF95
市场等内政建设:5BC4C1
商人:5CAD1B
征兵:5C3CAB
生产兵装:5C67B3
研究技巧:5D8F68
吸收合并:5D758B
在这些函数中,会先push入一个值(比如20)作为函数参数,然后执行消耗行动力的函数。我们只需要先判断君主有没有这个技能,然后针对性的给每一个-1即可。加入这些逻辑,我们需要在额外代码段设置代码,然后跳转过去。这一部分的操作方法在上一弹中已经介绍的比较详细了,留给诸位作为练习~
顺便讲一下RK的君主技是怎么实现的吧。这一部分不是我做的,是RK和我讲的。在RK的整理资料中,我们会发现每个武将实际上有0x190个字节的信息,包括了五维、性格、亲爱武将等信息,集中储存在程序7200000左右的区域。在C语言中,这实际上就是一个struct。在这0x190个字节中,有一部分是空白的,也就是说,并没有被用上,被统一置为全0。我们可以利用这一部分空白信息加入君主技的相关信息,然后编写相关函数读写信息,完成君主技的系统设计。
至于这一部分,希望RK多多[url]http://发 表[/url]勤政,早日放出SIRE 1.30。
下一弹,我们讲多人搜索的实现(which我还没完全理清头绪,所以我会一边做一边写一边发)
在这一弹中,我们一起来做SIRE的新君主技(名字我还不知道叫啥):所属势力内政设施行动力-1。在RK的设计中,君主技和本身特技是不冲突、可以并存的,但是我们这次简单一点,就用君主本身的技能判定。我们的目标效果姑且设置成,如果君主的技能是“能吏”,则所有行动力-1。这一弹的性质以教学为主,我不会把整个特技做出来,只会给大家讲一下最核心的思路,顺便介绍一下CE。(因为RK说他已经在做了)
为了实现这个效果,首先我们找和行动力有关的函数。RK的资料显示,4A1820是军团消耗行动力(势力本身也是一个军团)。在IDA中搜索所有的XREF(引用),其中有-20行动力大概有一页那么多。
我们当然可以一个一个点进去,逐个阅读每一个调用了减行动力的函数都是干什么的。然而,这实在是太复杂了,毕竟静态就意味着无法调试,只能肉眼反汇编,效率极低。
所以我们这一次引入CheatEngine(简称CE),一个为桌面游戏设计的、基于内存的动态调试。动态调试与之前的exe修改不同的是,之前我们需要手动写机器码、然后用Hex workshop导入,虽然有一些trick可以使整个过程更加简单(比如先在IDA里边改,确保结果正确),但是毕竟还是有些复杂了。使用CE,我们直接修改内存,就算修改崩了也大不了重启一下游戏。
在开始修改之前,要明确的是,我们修改的目标是【脱壳版三国志11威力加强版1.1】的exe,是一个修改日期为2014/06/01,文件大小约156MB的exe,如果使用未脱壳版的exe,可能出现CE跳出等问题。
下面就开始吧。CE最大的好处在于,它可以动态设置断点。达到和主流正向编译器差不多的效果。在游戏中,任何内政指令都一定会调用行动力减少的函数,在行动力减少的函数执行完毕后,会返回到之前调用的下一条指令。因此,我们只要将断点设置到行动力函数减少的函数中,然后看一下是谁调用了这个函数(专业术语:查看调用堆栈),我们就可以知道每个函数都是干什么的了。
完整步骤如下:
①打开311pk脱壳版主程序,载入游戏。【将分辨率设置为窗口模式】(否则停在断点之后还要切出去,很麻烦)。
②打开CE,点击左上角闪烁的图标,选择已经打开的311主程序(可能是乱码,因为311主程序采用的是繁体版的BIG5编码,在Windows下兼容性不好)。

③点击CE上的”Memory View”,进入内存查看区域。右键点击”jump to address”,输入已知的减行动力代码段地址:4A1820,在跳转后选中代码,使用快捷键F5设置断点。设置断点后,该行代码将变为红色。
如果我们要设置断点,就需要把CE自带的调试器连接到程序上,如果弹出“是否连接调试器”的弹窗,记得点“是”。
这一步中,我们并不关心在4A1820段发生了什么,只关心它会退出到哪里。因此,我们可以直接找到这个函数的ret指令,设置断点,这样就避免每次还需要手动完成整个函数体的执行过程。

④切回游戏。假设我们想知道巡查的函数位于哪个位置,我们就进行一次巡查。如果上述操作正确,CE的Memory View弹窗的标题会提示,现在已经停在了某个断点。我们接下来使用快捷键F8进行单步执行。(注意:F7 F8都是单步执行,区别在于,如果一行代码调用了一个函数,F7会进入这个函数,F8会直接等待函数执行完毕进入下一行。如果需要查看函数调用的子函数的执行过程,请使用F7。)
⑤在执行完ret后,函数会回到上一层调用的函数中,如果到了哪一层时,函数不一样了,就说明这一层是因行动而已的调用函数了。我们接下来就可以针对性的分析这一段代码,这样就节省了大量的精力。
贴一下我找到的各个行动指令调用行动力的位置:
军团改变行动力:004A1820
军团行动(会调用上一个函数消耗行动力):005B9340
巡查:5CBF95
市场等内政建设:5BC4C1
商人:5CAD1B
征兵:5C3CAB
生产兵装:5C67B3
研究技巧:5D8F68
吸收合并:5D758B
在这些函数中,会先push入一个值(比如20)作为函数参数,然后执行消耗行动力的函数。我们只需要先判断君主有没有这个技能,然后针对性的给每一个-1即可。加入这些逻辑,我们需要在额外代码段设置代码,然后跳转过去。这一部分的操作方法在上一弹中已经介绍的比较详细了,留给诸位作为练习~
顺便讲一下RK的君主技是怎么实现的吧。这一部分不是我做的,是RK和我讲的。在RK的整理资料中,我们会发现每个武将实际上有0x190个字节的信息,包括了五维、性格、亲爱武将等信息,集中储存在程序7200000左右的区域。在C语言中,这实际上就是一个struct。在这0x190个字节中,有一部分是空白的,也就是说,并没有被用上,被统一置为全0。我们可以利用这一部分空白信息加入君主技的相关信息,然后编写相关函数读写信息,完成君主技的系统设计。
至于这一部分,希望RK多多[url]http://发 表[/url]勤政,早日放出SIRE 1.30。
下一弹,我们讲多人搜索的实现(which我还没完全理清头绪,所以我会一边做一边写一边发)