信長の野望・天道/Mod/Exe修改

信長の野望・天道/Mod/Exe修改

内存修改 => exe

http://game.ali213.net/thread-4106967-1-1.html

内存地址均为“虚拟内存地址”。修改exe里对应代码步骤:

  1. 用PE编辑工具(如 LordPE)打开天道主程序 NOBU13PK.exe。查看其镜像基址等 PE 头信息。

信长之野望天道pk的镜像基址是 0x400000,块对齐是 00001000 (8)。

镜像基址:是一个额外的偏移量,它规定了计算机把程序代码载入到虚拟内存中时的起始偏移量。

块对齐:它规定了,每个代码块、数据块的最小大小,我们如果想增加一段代码空间,就必须是这个大小的倍数。

  1. 查看 exe 区段信息里的各区段地址:

VOffset / VSize / ROffset / RSize 分别为
内存偏移 / 内存大小 / 物理偏移 / 物理大小

物理偏移 即为 exe 文件里位置。

物理大小 >= 区段大小 (末尾可以有填充位置)

内存偏移 + exe 镜像基址 = 区段起点的虚拟内存地址。

快速修改

如何固化exe代码,一般向(有个别情况会因为出错而无法更改,这种情况解决起来有点烦,不谈)
例如,要把0067ee91=数A 写到exe 里,用16进制编辑器(如 Hex Workshop,UltraEdit)打开exe,找到27ee91(0067ee91-400000),把数A写进去 保存。
再启动这个刚改过的exe,到游戏主界面,用内存修改工具(OllyDbg,或 Cheat Engine 之类的游戏内存修改器等)找到内存0067ee91处,查看此时数据为数B,然后关掉游戏,再用16进制编辑器打开exe文件,找到刚才修改的地址27ee91,改为数B 保存。完工
以上方法适用于经过信长之野望天道壳加密的代码的修改,如果是像固定的值,如战法指令的名字、四围的名字等,还有我新加的代码部分 都是可以直接修改的,不需要上面的转化。

以上方法是修改简单的固定数值的初入门,只要把论坛各位大大已经找到的内存数据,直接转换替换到EXE就可以了

说明

比如说天道 exe 第一行的.text段:

名称 VOffset VSize ROffset RSize 标志

.text 00001000 00A7BCFA 00001000 00A7C000 C0000040

名称,顾名思义,就是这个区段的名字,这个可以随便定义,计算机执行程序的时候并不在乎它叫什么名字,是用不到的。

VOffset,虚拟地址,它是一个参量,如果我们把这个数加上之前说过的那个镜像基址,在信野13中为0x400000,加上这个VOffset就是0x401000,这个地址就是.text这个区段里的代码载入到虚拟内存中时的实际地址,也就是我们常用金山游侠、CE等内存修改工具时用到的“内存地址”。
VSize,就是这个区段在程序运行后占用的虚拟内存空间的大小,这个大小可以按实际占用大小来算,可以看到这里的0x00A7BCFA很随意,并不是上面说过的块大小——0x1000的倍数。

ROffset,物理偏移量,这个是对exe文件而言的,它指出了,这个块的数据在exe文件中是从哪个地址开始的。

RSize,物理大小,这个区段在exe文件中占用的存储空间的大小。这个大小必须是块大小的倍数。

标志,这个区段是干什么的,是代码么?有数据么?可以读写么?这些信息就是标志的作用。

因为我们要固化代码到程序,有很多地方不只是修改,还要增加一些代码,而这些代码是需要空间来存储的。

所以接下来,我们就是要找到一些空闲的空间来写这些代码。

有两种方式,第一种,找到原先程序里本来就没用到的一些空白区域,直接写在那里。但是信野13里几乎没有这样的空间,所以作罢。

第二种,自己增加一段空间。

这里又有三种方式。

  1. 观察区段定义,找到虚拟空间之间空白的区域,然后扩大区段大小达到增加空间的目的,这个我试过,信野13在运行的时候会释放一些代码到这些空白区域,实际上并不能使用,另外这种方式也不简单,放弃。

  2. 增加一个区段,这是一般修改中用到的方法,但是因为信野13繁中PK版目前还没有去壳的破解exe放出,这里增加一个区段会导致游戏出错进不了游戏,只好放弃。

  3. 扩大最后一个区段的大小,在这里就是.settec这个段,为什么是最后一个段,因为在末尾加比较容易、方便。

好了,点击.settec段,再单击右键,在弹出菜单中选择“编辑区段”。

可以看到这段的物理大小和虚拟大小都是0x0015A000,我们要增加一段,比如说增

0x4000大小的空间。将这两个数改成0x0015E000就行了。然后击“确定”退出区段修改框,再点击区段表对话框右上角的红色小叉退出到一开始打开PE编辑器时的界面。再点击“保存”按钮,保存现在对PE头的修改。

实际上,这个保存主要是为了保存PE头里的其他信息,我们增加段大小的数值,在退出段编辑器的时候工具已经对程序做了修改,所以如果怕误操作修改错了,最后自己先备份一下要修改的程序。

这一步所做的只是规定了这一段空白的区域,就像政府批了文件说可以在某个地方建楼,但是实际上那个地方可能还是原始森林……

接下来要做的就是在exe文件中增加一段真正的物理储存空间。

我们需要一个16进制编辑器,我用的是Hexworkshop这款软件,但是大多数人用的是Ultra Edit,希望名字没记错。看自己喜好用。

用编辑器打开exe文件。拖到文件末尾。

插入0x4000字节的内容。关于填充字节,可以是0x00,也可以是0xcc,这个随意填,但是一般填0xcc比较好,那样编辑起来比较直观,不容易出错。
上面的图是我用Hex Workshop编辑的界面,如果你用的是其他16进制编辑器,可能界面有所不同,需自行研究操作。

最后记得保存。

这一步,我们是从0xEF7568处加了0x4000字节。

*这一步中的插入的0x4000的这个大小严格上来讲并不正确!我们可以把最后一个区段的物理偏移与物理大小相加,得到的大小是0xEF6000,也就是说,这个程序严格上来说,exe文件的真实大小应该是0xEF6000,但是实际的大小却是0xEF7568!也就是说,原程序后面还附加了一些内容。我们在区段定义里加了0x4000的空间,但是因为实际大小比理论大小要大,所以0x4000是有点大了。我们应当填充的大小应该是:0x4000-(0xEF7568-0xEF6000)=0x2A98。而原程序后面多加的内容是当成这增加的0x4000空间的一部分了,所以我们真正可以用的地方是从exe文件中的0xEF7568处开始,内存中是从(0x0FC13000+0x15A000+0x400000)+(0xEF7568-0xEF6000)=0x1016E568处开始。

萌娘mod中,我加了0x4000字节的空间,因为多加了点空间其实也没什么问题,也就这样了。

我们新增加的代码在内存(我们一般讲的内存地址都是虚拟内存,真正的物理内存中的内容我们是看不到的)中是从哪个地方开始的呢?

通过前面讲到知识我们已经可以计算了。

这样,我们新增的内容,在内存中的地址是从0x1016E568开始,对应的exe文件中的内容是从0xEF7568开始。

内存研究成果的固化操作

做好前面的准备工作,就可以着手进行固化操作了。我是从干净的原程序开始做起讲的,如果是在我之前改过的exe文件上修改,则不需要之前讲过的步骤。

通过前面的说明,我们已经了解,对于增加的内存代码,我们是有要求的,就是要在0x1016E568后面才行,那里才有我们的新增的空间。

有些内存修改研究者,往往在改内存代码时见缝插针。如下面的代码:

00629EA4 jmp 0x400100

   ……

   ……

   00400100  mov eax,0x10


   在内存0x00400100处新增了代码。

我们知道,第一段的偏移是0x1000,而虚拟偏移量是0x400000,也就是说第一段程序是从0x401000处开始的,0x00400100这个地方,在exe文件中并没有指定的位置。另外,新增的代码写在自己定义的空间里才是最安全的,不容易出错。所以,我们要对别人的研究成果进行修改才能使用。

改成如下:

00629EA4 jmp 0x1016F000

……

……

1016F000 mov eax,0x10

修改代码往往是用OllyDbg这款工具完成的,可以说这是crack界的神器,非它不可。一般的工作都可以通过它来完成,但是如果是破解一些比较厉害的软件,可能就不行了,需要硬调试工具,那个在这里就不谈了。

有两种方式去调试一个程序,一种是先启动你的目标程序,再点OllyDbg菜单上的“文件”——“附加”,选择你的目标程序的进程,再点“附加”按钮,就会载入目标程序的信息,等待片刻,此时会自动中断目标程序的运行,按F9就可以继续让目标程序运行了。

另一种方式是,直接在菜单上点“文件”——“打开”,选择你的目标程序,工具会自动载入目标程序的代码,同样点工具栏上的运行按钮,或是按F9都可以让目标程序运行。

用打开方式载入信野13时,会提示代码被压缩或加密,这个不用管它,点是或否都行。如果你在这一步打开时,工具提示无法启动,或者游戏启动出错,那就说明你前面新增空间的部分有地方做得不对。

   按F9运行游戏,进入游戏看到主界面,这时候就可以切到工具这里进行修改了。




在上图蓝色框内右键——“转到”——“表达式”,打开一个对话框,在里面输入内存地址,按确定,转到对应的内存处,在对应的地方按下空格键就可以输入汇编码来进行修改了。

通常,在修改完成后,只要右键点击,使用“复制到可执行文件”命令,就可以把修改的内容写到exe文件中,但是信野13因为壳的关系,会出现无法定位的情况。这时候就需要人工进行输入修改了。

举个例子:

我要修改女武将可以跟姬百合,研究发现只要把内存0x008517c0处改成0x00就可以了。

计算一下这个地方对应在exe文件中的具体位置,0x008517c0-0x00400000=0x004517c0,用16进制编辑器打开游戏程序NOBU13PK.exe,把0x004517c0处改成0x00,保存。重新运行程序,用CE或者Ollydbg等可以查看内存的工具,找到0x8517c0处,发现,改过的数值并不是0x00,而是0x83!这是因为有壳的关系,数值发生了变化。幸好的是,信野13的壳很有意思,如果把0x83这个数再写到exe文件对应的地址0x004517c0处,你会发现,重启游戏后,数值居然正确了。这就是目前修改原有代码的步骤。

再举个例子:

我要修改0x1016F201处为:

1016F201 8948 04 mov dword ptr ds:[eax+4], ecx

计算一下0x1016f201对应在exe文件中的地址:

0x1016f201-(0x0FC13000+0x00400000-0x00D9C000)

=0x1016F201-0x0F277000

=0xEF8201

因为这里是我们新增的内容,壳管不到,所以就简单多了,只要在0xEF8201处写入这段汇编的机器码0x8948 04就行了。有时候,需要写入的代码会比较长,手工输入一大堆数字也挺烦的,但是也没什么办法,目前我也没找到什么好的工具或是方法。

用Ollydbg主要是可以进行调试,另外,用Ollydbg写汇编码的时候,生成的机器码要比CE规范,极个别的汇编码CE会出错。但是如果你习惯用CE来改代码,也不是不可以。

好了,这就是需要了解的内容了,一时兴起写的文章,或许有疏漏,请见谅。

                                                                                       Tkwlee

                                                                                2011819

Last update: 2019-04-26 01:03:19 UTC