同人Mod游戏 《Craft The World -The Age of Dragon v5.7 (for 1.4013)(打造世界-巨龙时代v1.4013)-制作》修改器制作-[附带1.7002 版本修改CT文件] (持续更新)
日期:2020.06.05
博客期:177
星期五
【温馨提示】:
我现在把资源先放到开头,不想研究学习的就直接取用。如果修改器失效了,你们可以在博客园本页直接评论,也可以给我发邮件告诉我,就是不要到百度云上去说了,百度云我好久不登录一次的!大家给我发邮件的话,记得要注明是哪个游戏,内容当然是越详细越好啦!邮箱地址:nightskysxs@163.com
资源链接表 | |||
没有博客园账号的网友 |
百度网盘下载地址: https://pan.baidu.com/s/1Y6gaAHKWxhEiFHIVRUn6UA 提取码:taod
Git Hub下载地址:https://github.com/TwoStarsGodNightSky/GameTrainer (暂时未更新) |
||
有博客园账号的博友 | 版本 | CT文件 | 修改器 |
1.4.013 (TAOD 5.7) | 点我下载 | 点我下载 | |
1.6.007 (TAOD 6.4) | 点我下载 | 点我下载 | |
1.6.007 (TAOD 6.5) | 点我下载 | 点我下载 | |
1.6.007 (TAOD 6.7) | 点我下载 | 点我下载 | |
1.6.007 (TAOD 6.8) | 点我下载 | 点我下载 | |
1.9.005(TAOD 6.9) | 点我下载 | 点我下载 | |
1.7.002 | 点我下载 | x | |
1.8.000 & 1.8.001 | 点我下载 | x | |
1.8.002 | 点我下载 | x |
博客防爬取部分:https://www.cnblogs.com/onepersonwholive/p/13053102.html
a.学习现状
我先说我现在是什么状况吧,一般临近考试周我们都会很忙。一方面要准备考试,另一方面要准备实验资料要交作业了。我对于剩下的时间要做的事情规划了一个计划表,发现我还要去做大大小小32项任务。所以大家真的不要再催我多写一点修改器文章了。再者说,写一个修改器真的没那么容易,我又不是老手,对吧!
b.为什么我想做这个游戏
这个问题其实我早就回答了。我前面的修改器日志里说过对于这一项修改的问题。我寒假时研究 Steam 版本的最新 1.7002 版本,什么也研究不出来。我看 M佬 做的版本大概是 1.7001 版本的吧,反正我试着没用。等我们放暑假了,我看 WeGame 上他更新没有,如果没更新,我就来做新版本的。
c.研究成果
本次的博客相当于挖坑,讨论我在修改上遇到的问题和修改的先行成果。
首先,进入游戏。(注意对应版本1.4013)
我们进去世界后砍一棵树,等木头运到仓库里以后。我们按照 4字节 搜索的方法,找到一个地址。你建造一次木棍消耗两个木头,完后把建造九宫格上的木头退回,继续搜索。但是不要高兴地太早了了——尝试修改这个值为 999,回到游戏它的值并没有发生变化。
所以,我们首先知道这个地址的值是被真实值修改的,但它的修改无法影响到真实值。而且我们从刚才的搜索中也看到了真实值没有被搜索出来,这让我们小白一看到就感到十分的诡异。那真实数据是怎样的呢?我们重新搜索一次木头数量并找到对应的虚假地址。我们选择“找出什么地址改写了它”。
我们选择改变一下木头数量。
.... ...
d.目前的结果:
CT文件使用方法:
1、打开游戏以后选择左上角第一个按钮,如下图:
2、然后双击你的游戏
3、之后读取文件
4、找到我的CT文件地址
5、打开以后点击 Reset-set values
6、改变 item_num 的值 为 999
7、点击 ignore_the_num_examine
8、点击 change item to num of [item_num]
9、之后,所有物品都会解锁并变到 999
10、不过下一次,如果直接关游戏的话,仓库会被清空。所以直接点退出游戏,之后关掉修改项再进入游戏就没事了。
具体操作:
后续更新部分----------------[更新日期:2020-06-30]
今天研究的内容是 Mana 部分,我看到了之前研究的 Death 为什么会死,其实原理和无限物品是一样的。
物品在你修改以后会变成 0,这是因为有数据加密项。它要经过一些 xor (异或) 运算,才能得到真实结果,而实际存储的是这两个异或的操作数。
先补充一个小知识:已知三个位数相同的二进制数 a,b,c。若满足 a xor b = c ,则 b xor c = a 且 a xor c = b , 其中任意两数做异或,结果一定是另外一数
异或: 0 xor 1 = 1 , 1 xor 0 = 1 , 1 xor 1 = 0 , 0 xor 0 = 0
a = 01010010
b = 10001110
c = 11011100
可以验证一下的。
所以,我们需要修改未保存的 c 值为 999,就首先赋值一个 d 为 999,然后让它与 b (假定b不会改变)做异或操作,结果赋值给 a 。这样当被改值的 a 再与 b 做异或操作时,得到的 c 值就是我们要修改的 999 了。
原理搞清楚了,但是在加密的过程中会存在校验,如果有一组值做异或的结果超过了 999,那么就会改变它的 b 值和 a 值重新为某一相同值,这样 a 等于 b ,再做异或得到的 c 值就会是 0。所以,我上次就索性把校验直接砍掉,反正是仓库物品数量,不会对系统造成什么可玩性的改变。但是今天的校验内容不一样了,它的加密内容不仅多而杂,而且 Float 类型的修改项有 Mana 值、生命值、饥饿值等等。我虽然关掉校验并统一赋值 20,可以保证 Mana 锁定,但是同时也锁定了矮人们的生命值和饥饿值。你可能觉得“这岂不美哉”?但是“变量加密”是一段公用代码,锁定的同时也锁定了怪物的血,就等于是锁定了战斗状态(双方都不死),啊!这便是永恒!另外,如果不关闭校验,就会赋值 矮人们的生命到 0,因而所有矮人都死了,当然所有怪物也没能幸免。
嗯,Mana 的修改方式我得亲自找对加密的调用了,还有就是加密函数是如何实现加密的?它需要调用那几个寄存器参数?返回结果如何?之后,再对症下药。
下面是它的异或操作(输入项为 esp、ecx、edx, 可能为固定寄存器的有 dl、dh、cl、ch,最终赋值到 xmm0 的是 [ebp-04],对应校验项为 [ebp-08],灰色表示这一项在实际效果中未起到作用、属于干扰段)。这之后有校验将 xmm0 ([ebp-04]——我们的 Float 类型的 “c”值) 和 [ebp-08] 进行比较。如果二者相等方可正常运行,否则置要修改的 c 值为 0 (一系列操作)。
后续更新部分-------------------------[更新日期:2020-07-01]
我今天去把无限物品的功能完善了一下,找到了之前的错误原因。另外,我发现可以直接使用汇编语句 MOV eax,3E7 来赋值 999,我之前都是先定义一个全局变量然后再改的,现在好了,就可以方便我们使用了。还有,我之前遇到的打造世界的修改器的无限物品都是按照你有了什么物资,就把什么物资的数量改为 999 的。我个人也比较喜欢这种的,这样省去了搜集资源的时间,就能大幅度推进游戏科技树了。你一下子把所有资源刷新出来确实不太好,我做修改器的时候就按照“有了什么物资就改到 999”的需求制作了,全资源刷新的功能我保留到 CT 文件当中好了。
下面给大家看看汇编代码和效果展示。
汇编代码(无限物品——渐进无限):
[ENABLE] //code from here to '[DISABLE]' will be used to enable the cheat alloc(newmem,2048) label(returnhere) label(originalcode) label(exit) newmem: //this is allocated memory, you have read,write,execute access //place your code here originalcode: xor eax,[esi+000001F4] push ebx push edx // ebx 用于保存 999 数据 (item_num的值) //lea ebx,[item_num] mov ebx,3E7 // edx 用于 存储 临时数据 //lea edx,[item_sys] mov edx,0 //mov ebx,[ebx] //---[edx置为0] //xor edx,edx //---[比较ecx与0的大小] cmp ecx,edx //---[存储物品值 等于 0,则不进行修改] je exit //---[如果不是零,做修改] mov ecx,3E7 mov eax,3E7 //------(修改至999) //真实存储值修改 mov edx,3E7 xor edx,[esi+00000088] mov [esi+000001F0],edx //检验存储值修改 mov edx,3E7 xor edx,[esi+000001F4] mov [esi+000001F8],edx jmp exit exit: //释放 pop edx pop ebx jmp returnhere "CTW-巨龙时代V v5.7-1.4013-完结篇.exe"+3009E3: jmp newmem nop returnhere: [DISABLE] //code from here till the end of the code will be used to disable the cheat dealloc(newmem) "CTW-巨龙时代V v5.7-1.4013-完结篇.exe"+3009E3: xor eax,[esi+000001F4] //Alt: db 33 86 F4 01 00 00
效果展示:
制作修改器模拟:
注意不要两项都使用。
后续更新部分----------------------[更新日期:2020-07-03]
本来是昨天可以更新博客的,奈何研究到第2天凌晨了,先去睡个觉,刚刚完成了“无限魔法”和“无限饱食度”。现在就差两部分没做了,一个是“大量经验值(我就设定为10 倍经验,说老实话,我不会创建线程,就不做加多少经验值的了)”,还有一个是“矮人无限生命值”,啊啊啊啊!一想到改共用代码段,要找区别就很烦!相当非时间,想想不知道多大的结构体,里面存储的还是加密的数据,我佛了。哦!另外还有一类功能 “一击必杀” 不是很想做。“提高矮人工作效率”我想到了,但是无从下手啊。不要跟我说打造世界可以通过修改文件的方式,加大游戏性。我当然知道我要是能找到这个版本的 XML 配置文件,就不用这么累人的做修改器了!问题就是压根找不到啊!
以上是我更新的CT文件内容,然后就小更新了一下修改器,现在可以下载了。截图如下:
今天实际上是做完了,但不完善,保命居然只能保护第一个矮人的?我真是醉了。做一个20长度的数组,也许可以,但我不会,看来只能是根据什么地址跳转过来的,来确定是否进行改正。
呃~确实这图不是很美观,下次更新我再换回那个标题为 Craft The World 来。
后续更新部分-----------------------------[更新日期:2020-07-07]
我看了看 1.7002 版本的无限物品要比 1.4013 版本的更难一点,起码找到物品对应的数据就很难。不过,我已经有了上一次的基础,再做就不难了。嗯~ 新版本的话,还是推荐大家以修改配置文件的形式,更改游戏性。毕竟这也是官方给定的投机之处,最好按照官方的来。懒得刷物品,就找我的 CT 文件里面的无限物品,里面还有10 倍经验和无限魔法(关于无限魔法,我还是投机采用自动给魔法值赋值 999,而不是根据实际最大魔法上限而定的,我这里在 CT 文件内部留下了一些地址信息方便我日后完善)。我看代码里面还有构造函数和析构函数,我大概知道这游戏是使用什么语言写的或以什么语言为基础写的了。我每次生成 1.7002 版本的修改器的时候,总被当作一个垃圾软件,系统自动给我删了,我很难受。这几天要把工作重心偏离打造世界了。
原本做了 1.7002 版本的修改器,但是总是会自己闪退,不得已我不再上传...对应版本的CT文件的使用倒是没什么问题,大家可以放心。
后续更新部分----------------------[更新日期:2020-07-08]
我原本想就这样算了,唉~原来Steam都更新到1.8000版本了,这么快的吗?也许是我玩Steam版本比较少吧。嗯嗯嗯...还是看了一下各个网上都没有对应版本的修改器,而 WeMod 上又是只有1.7001版本的。这都1.8000版本了,这游戏出新版本的速度比出修改器的速度都快...我估计完成这一版本以后过不了多少时间,就可以继续下一个版本的编写了。我将所有信息配置到开头,方便大家。
重要的是利用 Float 找到 Mana 值,找到修改 Float 值的区域代码,判定 OneSecondTicker 之前就行了。还有无限物品就只需要我们找到 ChangeResourceNumber 区域,然后逐步查看导入的数据究竟哪一项符合结果。
[ENABLE] //code from here to '[DISABLE]' will be used to enable the cheat alloc(newmem,2048) label(returnhere) label(originalcode) label(exit) newmem: //this is allocated memory, you have read,write,execute access //place your code here originalcode: //sub esi,eax mov eax,3E7 //add esi,eax mov esi,3E7 mov [ebp-000000B0],eax exit: jmp returnhere "CraftWorld.exe"+3E0B97: jmp newmem nop 3 returnhere: [DISABLE] //code from here till the end of the code will be used to disable the cheat dealloc(newmem) "CraftWorld.exe"+3E0B97: add esi,eax mov [ebp-000000B0],eax //Alt: db 03 F0 89 85 50 FF FF FF
测试结果:
后续更新部分---------------------------[更新日期:2020-07-21]
今天收到网友的消息,原来巨龙时代还有更新的版本啊,我其实是不知道的,哈哈哈,它的 5.7 版本上说是最终版,难道它说的是 第 5 版的最终版么?不管怎样,我还是按照之前1.4013 版本的游戏修改方法实现了上面的三项功能,CT文件和修改器已经更新到最上方的表格中,大家可以自行取用。我遇到的问题是物品数量存储无法找到的问题,最终靠搜索指令 xor ,[esi+000001 找到了物品地址。
后续更新部分---------------------------[更新日期:2020-07-28]
今天我深入研究了一下魔法值在 OneSecondTicker 部分的变化情况,经过对函数最开始状况的 [ebp-04]的值进行追踪,更改前的数据值有三部分。一个是负数“无穷大”,对应 [ebp-04] 的值为 80000000;一个是整值 3.00 (实际是当前的 Mana 值),对应 edx 是 00000003 ;最后一个是整值 145.00 (实际上是 Mana 值的上限),我们完善修改器要实现无限魔法,并把魔法值的上限赋值到实际魔法值的地址,不再是之前那样单纯赋值999,这样看起来就不会那么突兀。随着技能的升级,Mana值始终不会超越上限。效果见下图。(注:今天研究的1.8001版本【目前Steam版本(2020.07.28)】)
思路:
def MAX 00000000 // 定义变量 MAX
... ...
//-------------<下面一部分是改变浮点值存储的函数内要附加代码的逻辑结构,因为 OneSecondTicker 是每一秒要执行一次的,所以下面的代码会被执行三次>-----------//
if ( [ebp-04] == 80000000 ) // 如果是未知赋值数
jump out // 就不进行操作
else // 否则
a = (int) [ebp-04] // 将 [ebp-04] 的值转为整形类型赋值到 变量a 中
if (MAX <= a) // 如果 MAX 大于 a
MAX = a // 更新 MAX 的信息
... ...
if ( [ebp-04] == 80000000 ) // 如果是未知赋值数
jump out // 就不进行操作
else // 否则
[ebp-04] = MAX // 将 [ebp-04] 的值更新到 Mana上限值。
测试图:
后续更新部分-------------------------[更新日期:2020-08-31]
嗯,最近专心在准备 “中国软件杯” 的比赛,比赛成绩确实不太理想啊,就搞到了一个最普通的奖状。至于游戏修改这方面,我有点忘了。因为 Steam上又更新了(我比赛完才看到),我就简单做了最新的那个CT文件,大家看最新的表能看到 1.8.002 的 CT文件的一项是可以下载的了,没有博客园的网友可以选百度网盘,所有资源我都存到链接上了。为什么还是没有修改器?当然是因为修改器运行以后会自动关闭,也不知道是什么原因。等我下一次深造吧,我来试着做一个修改器类型的 MOD。
后续更新部分-------------------------[更新日期:2020-09-08]
今天试着做了 无限饱食度 ,看着是完成了,但是呃~我原本是向着 无限生命 去做的,这样看来还是不成功的。哦,对了,我顺便做了 快速挖掘 的功能,当然目前还是只有 对应最新版本 1.8.002 的。搞好了本页面提到的所有版本的 CT 文件以后,我再更新哦!
1 [ENABLE] 2 //code from here to '[DISABLE]' will be used to enable the cheat 3 alloc(newmem,2048) 4 label(returnhere) 5 label(originalcode) 6 label(exit) 7 8 newmem: //this is allocated memory, you have read,write,execute access 9 //place your code here 10 11 originalcode: 12 push edx 13 //初始化整型值 14 mov edx,0 15 //整型值转化为浮点值 16 CVTSI2SS xmm0,edx 17 pop edx 18 movss [eax+ecx*8+0C],xmm0 19 20 exit: 21 jmp returnhere 22 23 "CraftWorld.exe"+3F6B7F: 24 jmp newmem 25 nop 26 returnhere: 27 28 29 30 31 [DISABLE] 32 //code from here till the end of the code will be used to disable the cheat 33 dealloc(newmem) 34 "CraftWorld.exe"+3F6B7F: 35 movss [eax+ecx*8+0C],xmm0 36 //Alt: db F3 0F 11 44 C8 0C
1 [ENABLE] 2 //code from here to '[DISABLE]' will be used to enable the cheat 3 alloc(newmem,2048) 4 label(returnhere) 5 label(originalcode) 6 label(exit) 7 8 newmem: //this is allocated memory, you have read,write,execute access 9 //place your code here 10 11 originalcode: 12 push edx 13 //初始化整型值 14 mov edx,A 15 //整型值转化为浮点值 16 CVTSI2SS xmm0,edx 17 pop edx 18 subss xmm0,xmm1 19 lea ecx,[edi+00000180] 20 21 exit: 22 jmp returnhere 23 24 "CraftWorld.exe"+5927A7: 25 jmp newmem 26 nop 5 27 returnhere: 28 29 30 31 32 [DISABLE] 33 //code from here till the end of the code will be used to disable the cheat 34 dealloc(newmem) 35 "CraftWorld.exe"+5927A7: 36 subss xmm0,xmm1 37 lea ecx,[edi+00000180] 38 //Alt: db F3 0F 5C C1 8D 8F 80 01 00 00
我不知道是不是更新的问题,两次申请空间的话,貌似会报错。所以,无限魔法的功能肯定就是失效了。
后续更新部分-------------------------[更新日期:2020-10-17]
嗯,任务来的比较仓促,我也做的比较仓促,说是大佬出了正式版,嗯呃呃呃呃,不过我也没时间玩就是了。我就是按照之前的经验,随便整了一个和之前一样的修改器,能使就行了,我是真的没什么时间了。
PS: 6.5 的修改器目测已经可以了,只是 CT 表对应不上,大家等我考完研再更新 CT 表吧。其余的功能我自然很想做,但我没精力了啊。
后续更新部分-------------------------[更新日期:2021-01-29]
嗯,我加入到巨龙交流群了,以后等它更新了,就方便我直接改项了。(功能还是只有三项,无限魔法还没有测试,因为基础两个魔法被删除了)