• Steam 游戏 《Crashlands(崩溃大陆)》修改器制作-[先使用CE写,之后有时间的话改用CheatMaker](2020年寒假小目标12)


    日期:2020.02.15

    博客期:155

    星期六

        

        【温馨提示】:

          只是想要修改器的网友,可以直接点击此链接下载;

          只是想拿CT文件的网友,可以直接点击此链接下载;

          没有博客园账号的网友,可以选择百度网盘下载:

          地址:https://pan.baidu.com/s/1JFjhjfMeVHZWRKbjFoUqoQ

          提取码:cras

          Git Hub下载地址https://github.com/TwoStarsGodNightSky/GameTrainer (Git Hub已过期)

          如果修改器失效了,你们可以在博客园本页直接评论,也可以给我发邮件告诉我,就是不要到百度云上去说了,百度云我好久不登录一次的!大家给我发邮件的话,记得要注明是哪个游戏,内容当然是越详细越好啦!邮箱地址:nightskysxs@163.com

          博客防爬取部分:https://www.cnblogs.com/onepersonwholive/p/12312322.html

          B 站测试视频 bv 号BV1af4y1k7fX

          当前最新研究的版本如下图:

          

        今天是寒假最后一天了,最后写个修改器作为结尾吧!今天本来想做《打造世界》的修改器的,奈何本人水平菜,搞不懂(有人会问了——博主,你不是有人做了修改器,自己就不做了吗?我的回答是:嗯!M佬 确实已经在 WeMod 里写了,但是无限物品一项我怎么也没实现【无效】 )!只好半路转移来做 崩溃大陆 了,当然今天因为时间原因还是只做一部分了,剩下的我在寒假以后补充回来!

        今天先做 无限血量 吧!使用的方法——人造地址!嗯,凡是用到这个方法的都需要 Home 键做初始化!

                   

        我已经找了 10 级以上的偏移地址了,居然没能找到可以用的!唉~

        我知道,这个游戏最麻烦的地方在于收集资源,我也会在寒假过后尽快地把 这部分补齐 的。(水平有限,开学以后时间也有限)

     1 [ENABLE]
     2 //code from here to '[DISABLE]' will be used to enable the cheat
     3 alloc(newmem,2048)
     4 alloc(point,8)
     5 label(returnhere)
     6 label(originalcode)
     7 label(exit)
     8 registersymbol(point)
     9 
    10 newmem:
    11 
    12 originalcode:
    13 mov [point],eax
    14 movsd xmm0,[eax]
    15 addsd xmm0,[Crashlands.exe+170E880]
    16 
    17 exit:
    18 jmp returnhere
    19 
    20 "Crashlands.exe"+1262D40:
    21 jmp newmem
    22 nop 7
    23 returnhere:
    24 
    25 
    26  
    27  
    28 [DISABLE]
    29 dealloc(newmem)
    30 unregistersymbol(point)
    31 "Crashlands.exe"+1262D40:
    32 movsd xmm0,[eax]
    33 addsd xmm0,[Crashlands.exe+170E880]
    ResetBlood

        下面我开始准备各类文件的上传....

        CT文件下载地址:https://files.cnblogs.com/files/onepersonwholive/Crashlands.zip (无效,请按照最上方链接)

        修改器下载地址:https://files.cnblogs.com/files/onepersonwholive/Crashlands-cheaterV1.00.zip (无效,请按照最上方链接)

        修改器截图:

        

        血量绑定效果展示:

        

        //--------------------------------------------------------------[ 2020-07-09, 更新内容 ]

        我知道那个生命值的失效了,但奈何本人太菜了,真的找不到数据啊!我看那个里面根本没有映射关系,每次输出的信息都是随机分布的。且不建立映射,我也不知道它是怎么读到这个数据的,于是我转头去做物品数量修改了,这个物品数量修改说简单是理解起来简单——每一次搜索 双浮点数(Double)找到的 2 个值都进行修改就完事了。但要说它难是物品的存储地址也没有映射,没办法只能一对一对地找,而且修改它的值的位置是一段共用代码,它可能修改的值有几千种可能,从这里面找到一种合适的来的方法貌似是行不通的。于是,我可以先暂时采用集10个物品,召唤神龙(归变为49999)的方法。

        对应找到地址的两段分别进行汇编:

     1 [ENABLE]
     2 //code from here to '[DISABLE]' will be used to enable the cheat
     3 alloc(newmem,2048)
     4 alloc(td_first,8)
     5 label(returnhere)
     6 label(originalcode)
     7 label(exit)
     8 
     9 newmem: //this is allocated memory, you have read,write,execute access
    10 //place your code here
    11 
    12 originalcode:
    13 push edx
    14 CVTTSD2SI edx,xmm0 // 浮点-转-整型
    15 // 如果要修改为 10,就变
    16 cmp edx,A
    17 je exit
    18 //如果要原值是 49999 ,就变
    19 movsd [td_first],xmm0
    20 movsd xmm0,[edi]
    21 CVTTSD2SI edx,xmm0
    22 cmp edx,C34F
    23 je exit
    24 pop edx
    25 movsd xmm0,[td_first]
    26 //源码
    27 movsd [edi],xmm0
    28 pop edi
    29 jmp returnhere
    30 
    31 exit:
    32 mov edx,C34F      // 49999
    33 CVTSI2SD xmm0,edx
    34 pop edx
    35 movsd [edi],xmm0
    36 pop edi
    37 jmp returnhere
    38 
    39 "Crashlands.exe"+1D80E26:
    40 jmp newmem
    41 returnhere:
    42 
    43 
    44  
    45  
    46 [DISABLE]
    47 //code from here till the end of the code will be used to disable the cheat
    48 dealloc(newmem)
    49 dealloc(td_first)
    50 "Crashlands.exe"+1D80E26:
    51 movsd [edi],xmm0
    52 pop edi
    53 //Alt: db F2 0F 11 07 5F
    "Crashlands.exe"+1D80E26
     1 [ENABLE]
     2 //code from here to '[DISABLE]' will be used to enable the cheat
     3 alloc(newmem,2048)
     4 alloc(td_second,8)
     5 label(returnhere)
     6 label(originalcode)
     7 label(exit)
     8 
     9 newmem: //this is allocated memory, you have read,write,execute access
    10 //place your code here
    11 
    12 originalcode:
    13 push edx
    14 CVTTSD2SI edx,xmm0 // 浮点-转-整型
    15 // 如果要修改为 10,就变
    16 cmp edx,A
    17 je exit
    18 //如果要原值是 49999 ,就变
    19 movsd [td_second],xmm0
    20 movsd xmm0,[edi]
    21 CVTTSD2SI edx,xmm0
    22 cmp edx,C34F
    23 je exit
    24 pop edx
    25 movsd xmm0,[td_second]
    26 //源码
    27 movsd [edi],xmm0
    28 mov ecx,[ebp-0C]
    29 jmp returnhere
    30 
    31 exit:
    32 mov edx,C34F      // 49999
    33 //CVTSI2SS xmm0,edx // 转-浮点
    34 CVTSI2SD xmm0,edx
    35 pop edx
    36 movsd [edi],xmm0
    37 mov ecx,[ebp-0C]
    38 jmp returnhere
    39 
    40 "Crashlands.exe"+1D82773:
    41 jmp newmem
    42 nop 2
    43 returnhere:
    44 
    45 
    46  
    47  
    48 [DISABLE]
    49 //code from here till the end of the code will be used to disable the cheat
    50 dealloc(newmem)
    51 dealloc(td_second)
    52 "Crashlands.exe"+1D82773:
    53 movsd [edi],xmm0
    54 mov ecx,[ebp-0C]
    55 //Alt: db F2 0F 11 07 8B 4D F4
    "Crashlands.exe"+1D82773

        //----------------------------------[ END ]

        //--------------------------------------------------------------[ 2020-12-07, 更新内容 ]

        好了,之前一直都想不到有什么方法能够完成断点的处理。因为那一段共用代码是每一秒执行数百次以上的,所以我们找不到对应修改的跳转。不过还是有方法的,我仔细研究发现了一种方法:

        1、首先,进入游戏找到每秒伤害,如下图:

                   

         2、选择好 Double (双浮点) 类型的搜索,(如上图,我应该搜索 79.0 )点击搜索更换武器,再次搜索就可以得到地址:

                   

         3、得到了两个地址,将其中一个改为 9999999 ,之后绑定住数值,去攻击怪物,看能不能一击干掉怪物。亲测,数值较大的为有效的值,另外一个是用于展示的。我们需要监听是什么修改了此地址的值。之后点击“关闭”,让它修改。

        

         4、然后进入到反汇编程序。

        

         5、可以看到是 "Crashlands.exe"+1519 的地址段,我们在这里设置一下书签。然后选择 工具 ---> 自动汇编,选择 模板 ---> CT表框架代码 ,再次选择 模板 ---> 代码注入,之后改成如下代码,并分配到当前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 movsd [ecx],xmm0
    13 pop esi
    14 // 282B36B0 应该是 搜索到的代码
    15 cmp ecx,282B36B0
    16 jne exit
    17 // 下面是临时代码
    18 movsd [ecx],xmm0
    19 jmp returnhere
    20 
    21 
    22 exit:
    23 jmp returnhere
    24 
    25 "Crashlands.exe"+1519:
    26 jmp newmem
    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 "Crashlands.exe"+1519:
    36 movsd [ecx],xmm0
    37 pop esi
    38 //Alt: db F2 0F 11 01 5E
    temp CT

        6、我们激活一下这部分代码,之后看 "Crashlands.exe"+1519 的地址段,记录下的跳转地址 (亲测是 03330000),跳转到这里,然后记录上书签。

        

         7、在刚刚跳转到的地方设置断点如下:

        

         8、返回去继续换装备,看看断点的状况:

        

         9、我们选择 视图 ---> 堆栈跟踪,得到结果如下:

        

         10、我们就找到了连续多个的跳转:

          ”Crashlands.exe“+1BDFF9B

          ”Crashlands.exe“+1E62B49

          ”Crashlands.exe“+1E6123D

        那我们就直接跳转到 ”Crashlands.exe“+1BDFF9B 地址段,找到 call ”Crashlands.exe“+14F0,设置断点发现,它的 ecx 的值是从 282B3670 到 282B38A0 变化的。而其中 282B36B0 是我们的修改值——攻击力。所以这一部分代码执行应该是赋值给玩家的这一系列的属性。那么,我们向上一步一步做监听,去寻找 ecx 的赋值语句。其中下图的 nop 一句不会被执行,而是直接执行的 mov ecx,[eax+0C] 一句。所以我们寻找上一步就需要搜索代码段,选择搜索 ---> 查找汇编码。左边大框输入当前的执行到的地址(我的是 Crashlands.exe+1BDFF70,搜绝对地址 024CFF70 ,如下图),右边将起始地址的后四位改为0,点击搜索。

        

         11、搜索结果如下,找到 JNE 一句,跳转并设置书签:

        

         12、之后,我们向前寻找 ecx 改变的原因,似乎是 mov ecx,[esi+00000114] 一句,所以现在的线索就变成了 esi 的值,不过我们可以取巧在前面一句设置断点,观察数值的变化(eax 和 edx)

        

          13、得到的数值变化关系为:

          一开始,eax 为 282B3670,edx 是 00000000,之后每一次运行,eax 都自增 10,edx 都自增 1,所以我们可以根据 edx 的值,判定我们索取的 eax 的值。

        14、我们在 add esp,08 一句进行汇编,目的是找到 edx 对应的初始 eax 值。

     1 [ENABLE]
     2 //code from here to '[DISABLE]' will be used to enable the cheat
     3 alloc(newmem,2048)
     4 alloc(reset_data_of_base,8)
     5 registersymbol(reset_data_of_base)
     6 label(returnhere)
     7 label(originalcode)
     8 label(exit)
     9 
    10 newmem: //this is allocated memory, you have read,write,execute access
    11 //place your code here
    12 
    13 originalcode:
    14 //让它们先执行,以免报错
    15 add esp,08
    16 //判断edx的值,将eax初始值获取
    17 cmp edx,00000000
    18 jne exit
    19 //如果是第一次的数据
    20 mov [reset_data_of_base],eax
    21 jmp exit
    22 
    23 exit:
    24 mov ecx,[esi+00000114]
    25 jmp returnhere
    26 
    27 "Crashlands.exe"+1BDFF02:
    28 jmp newmem
    29 nop 4
    30 returnhere:
    31 
    32 
    33  
    34  
    35 [DISABLE]
    36 //code from here till the end of the code will be used to disable the cheat
    37 dealloc(newmem)
    38 dealloc(reset_data_of_base)
    39 unregistersymbol(reset_data_of_base)
    40 "Crashlands.exe"+1BDFF02:
    41 add esp,08
    42 mov ecx,[esi+00000114]
    43 //Alt: db 83 C4 08 8B 8E 14 01 00 00
    find redata

        15、然后,回到游戏刷新数据,让代码段执行,查看地址

        

         16、选择添加地址,选择指针,最开始的地址输入 reset_data_of_base,第一偏移量设置为 40,就可以实现不查找内容直接找到攻击力的地址。

        

         17、我们修改这个值到 9999999,然后绑定住,就可以实现一击必杀了。

        

        PS:新的修改器已经更新,其他功能我再摸索争取做的和《九张羊皮纸》那样吧。

        

        //----------------------------------[ END ]

        //--------------------------------------------------------------[ 2020-12-29 至 2020-12-31, 更新内容 ] 

        先按照之前的内容把调用好的代码进行绑定,搞定可以直接完成 “一击必杀” 的效果,我之前看了 WeMod 上已经有了 它的修改器。功能有两项——把资源型物品改成99 以及 血量绑定999,但是之后的强大怪物能不能不被秒杀,这我没有做测试。不过前期应该可以配合着使用。我给大家看看直接的截图:

        

        以上是29号的研究,只不过是在更新攻击力的代码那里判断一下是不是攻击力的地址,如果是那就修改成 99999999 ,否则不用管。

        下面是对应代码:

     1 [ENABLE]
     2 //code from here to '[DISABLE]' will be used to enable the cheat
     3 alloc(newmem,2048)
     4 alloc(reset_data_of_base,8)
     5 registersymbol(reset_data_of_base)
     6 label(returnhere)
     7 label(originalcode)
     8 label(exit)
     9 
    10 newmem: //this is allocated memory, you have read,write,execute access
    11 //place your code here
    12 
    13 originalcode:
    14 add esp,08
    15 cmp edx,00000000
    16 jne exit
    17 //如果是第一次的数据
    18 mov [reset_data_of_base],eax
    19 jmp exit
    20 
    21 exit:
    22 mov ecx,[esi+00000114]
    23 jmp returnhere
    24 
    25 "Crashlands.exe"+1BDFF02:
    26 jmp newmem
    27 nop 4
    28 returnhere:
    29 
    30 
    31  
    32  
    33 [DISABLE]
    34 //code from here till the end of the code will be used to disable the cheat
    35 dealloc(newmem)
    36 dealloc(reset_data_of_base)
    37 unregistersymbol(reset_data_of_base)
    38 "Crashlands.exe"+1BDFF02:
    39 add esp,08
    40 mov ecx,[esi+00000114]
    41 //Alt: db 83 C4 08 8B 8E 14 01 00 00
    find redata
     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 call Crashlands.exe+14F0
    13 push edx
    14 mov edx,[reset_data_of_base]
    15 add edx,40
    16 push ebx
    17 mov ebx,F423F
    18 cvtsi2sd xmm0,ebx
    19 movsd [edx],xmm0
    20 exit:
    21 pop edx
    22 jmp returnhere
    23 
    24 "Crashlands.exe"+1BDFF96:
    25 jmp newmem
    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 "Crashlands.exe"+1BDFF96:
    35 call Crashlands.exe+14F0
    36 //Alt: db E8 55 15 42 FE
    make attack 99999999

        之后我进行了对物品修改的研究:

        1、首先,搜索物品的数量(双浮点)

        2、找到一组相同的值。这个时候,可以只修改其中一个值,查看是否可以建造。

        3、找到其中真实值以后,选择 “是什么访问了这个地址”。(访问是要找修改之前,是什么地方读取了这个地址。修改是要找把值最终修改的地方)

        4、回到游戏中,更改一下物品数量。

        5、查找到是 "Crashlands.exe"+1E7B425 一处的代码访问了 [eax+10] 的值。

        6、在这里设置 断点 会发现它会不断的停在这里,不会执行我们需要的代码。

        7、所以我们采用老方法,在这里比较一下是不是那个值(才怪)。我们直接查看是代码停止的时候,刚好是哪些特殊的 eax 值,发现真正停到的值就只有两个 它们的地址之间相差 208.

        8、我们写代码进行比较,如果是这两个地址就跳过正常执行。继续设置断点。回去采集一项资源。

        9、发现最终会出现一个 FFFFFFFF 的停止符,我们一并设置跳过,然后看看可不可以把剩下的数据改了。

        10、结果是可以改了,但是一切换地图就又会崩溃。经过长期重试,我总结原因:打开地图的时候,会更新地图的数据,而它恰恰是不能修改的。

        11、而且上述的效果也不是很持久,因为之前跳过的那两个地址也是变化的。这就很难办了,起初我决定设置两个全局变量,当读取到是那两个变量的时候再跳过,但是这个和后面地图的代码无法达到兼容的效果,所以最终还是要靠一系列数值上的排除。

        12、一次比较是否相等,还不如比较谁大谁小。本着这样的原则,我们首先排除掉 ebx 、ecx 不等于 00000000 的项,找到 [eax+10]的值,分别存取它的 双浮点的值 和 4字节 的值。

        13、之后发现 双浮点的值 对应 4字节 都是 0 ,我们可以直接排除 4字节 状态下的 [eax+10] 不是 0 的项。

        14、之后,发现地图对应的双浮点是 354.00、378.00、22.00。所以,我姑且让 [15,1000] 区间内不通过。其余的修改为 49999 就好了。

        对应代码:

     1 [ENABLE]
     2 //code from here to '[DISABLE]' will be used to enable the cheat
     3 alloc(newmem,2048)
     4 alloc(tmp_data,8)
     5 registersymbol(tmp_data)
     6 label(returnhere)
     7 label(originalcode)
     8 label(exit)
     9 label(test_oil)
    10 
    11 newmem: //this is allocated memory, you have read,write,execute access
    12 //place your code here
    13 
    14 originalcode:
    15 
    16 cmp ebx,00000000
    17 jne exit
    18 
    19 cmp ecx,00000000
    20 jne exit
    21 
    22 push edx
    23 mov edx,[eax+10]
    24 mov [tmp_data],edx
    25 pop edx
    26 
    27 cmp [tmp_data],00000000
    28 jne exit
    29 
    30 push edx
    31 movsd xmm0,[eax+10]
    32 cvttsd2si edx,xmm0
    33 mov [tmp_data],edx
    34 pop edx
    35 
    36 cmp [tmp_data],0  //0
    37 je exit
    38 cmp [tmp_data],F   //15
    39 jb test_oil
    40 cmp [tmp_data],3E8   //1000
    41 ja test_oil
    42 jmp exit
    43 
    44 test_oil:
    45 push ebx
    46 mov ebx,C34F //49999
    47 cvtsi2sd xmm0,ebx
    48 pop ebx
    49 movsd [eax+10],xmm0
    50 jmp exit
    51 
    52 exit:
    53 movups xmm0,[eax+10]
    54 mov edi,[ebp+08]
    55 jmp returnhere
    56 
    57 "Crashlands.exe"+1E7B425:
    58 jmp newmem
    59 nop 2
    60 returnhere:
    61 
    62 
    63  
    64  
    65 [DISABLE]
    66 //code from here till the end of the code will be used to disable the cheat
    67 dealloc(newmem)
    68 dealloc(tmp_data)
    69 unregistersymbol(tmp_data)
    70 "Crashlands.exe"+1E7B425:
    71 movups xmm0,[eax+10]
    72 mov edi,[ebp+08]
    73 //Alt: db 0F 10 40 10 8B 7D 08
    item to 49999

        为了更好的修改物品数量,我们考虑把之前的数据项也改掉(记得之前找到两个“物品地址”,只有一个进行了监听)。我们对第二个进行修改。

     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 // 1 级 判定
    13 cmp ecx,5
    14 jne exit
    15 // 2 级 判定
    16 cmp esi,257
    17 jne exit
    18 
    19 push eax
    20 mov eax,C34F //49999
    21 cvtsi2sd xmm0,eax
    22 movsd [ebx],xmm0
    23 pop eax
    24 jmp exit
    25 
    26 exit:
    27 movsd xmm0,[ebx]
    28 pop ebx
    29 jmp returnhere
    30 
    31 "Crashlands.exe"+1E78A4B:
    32 jmp newmem
    33 returnhere:
    34 
    35 
    36  
    37  
    38 [DISABLE]
    39 //code from here till the end of the code will be used to disable the cheat
    40 dealloc(newmem)
    41 "Crashlands.exe"+1E78A4B:
    42 movsd xmm0,[ebx]
    43 pop ebx
    44 //Alt: db F2 0F 10 03 5B
    false item to 49999

        然后,对另外的数据进行监听,然后修改好代码:

     1 [ENABLE]
     2 //code from here to '[DISABLE]' will be used to enable the cheat
     3 alloc(newmem,2048)
     4 alloc(tmp_data,8)
     5 registersymbol(tmp_data)
     6 label(returnhere)
     7 label(originalcode)
     8 label(exit)
     9 
    10 newmem: //this is allocated memory, you have read,write,execute access
    11 //place your code here
    12 
    13 originalcode:
    14 //修改
    15 //cmp ebx,006FE0F0
    16 //jne exit
    17 // 1 级 判定 - error
    18 //cmp ecx,7
    19 //jne exit
    20 // 1.5 级 判定
    21 cmp edx,00000000
    22 jne exit
    23 // 2 级 判定
    24 push edx
    25 mov edx,[eax+10]
    26 cmp edx,00000000
    27 pop edx
    28 jne exit
    29 
    30 // 预备
    31 push edx
    32 movsd xmm0,[esi] //movsd xmm0,[eax+10]
    33 cvttsd2si edx,xmm0
    34 mov [tmp_data],edx
    35 pop edx
    36 
    37 cmp [tmp_data],DD // 221
    38 jne exit
    39 
    40 //执行
    41 push edx
    42 mov edx,C34F //49999
    43 cvtsi2sd xmm0,edx
    44 pop edx
    45 movsd [eax+10],xmm0
    46 jmp exit
    47 
    48 
    49 exit:
    50 movups xmm0,[eax+10]
    51 mov edi,[ebp+08]
    52 jmp returnhere
    53 
    54 "Crashlands.exe"+1E7B425:
    55 jmp newmem
    56 nop 2
    57 returnhere:
    58 
    59 
    60  
    61  
    62 [DISABLE]
    63 //code from here till the end of the code will be used to disable the cheat
    64 dealloc(newmem)
    65 dealloc(tmp_data)
    66 unregistersymbol(tmp_data)
    67 "Crashlands.exe"+1E7B425:
    68 movups xmm0,[eax+10]
    69 mov edi,[ebp+08]
    70 //Alt: db 0F 10 40 10 8B 7D 08
    true item to 49999

        接下来是血量,我们也是直接选择改上限值和真实值,我们把数据改成 99999999 , 是的。

     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 ebx
    13 mov ebx,5F5E0FF
    14 cvtsi2sd xmm0,ebx
    15 pop ebx
    16 movsd [eax],xmm0
    17 movsd xmm0,[eax]
    18 movsd xmm1,[eax+08]
    19 
    20 exit:
    21 jmp returnhere
    22 
    23 "Crashlands.exe"+D0884B:
    24 jmp newmem
    25 nop 4
    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 "Crashlands.exe"+D0884B:
    35 movsd xmm0,[eax]
    36 movsd xmm1,[eax+08]
    37 //Alt: db F2 0F 10 00 F2 0F 10 48 08
    unlimited blood - true value

        为了上述图像的美观,我又改了如下代码:

     1 [ENABLE]
     2 //code from here to '[DISABLE]' will be used to enable the cheat
     3 alloc(newmem,2048)
     4 alloc(reset_data_of_blood,8)
     5 registersymbol(reset_data_of_blood)
     6 label(returnhere)
     7 label(originalcode)
     8 label(exit)
     9 
    10 newmem: //this is allocated memory, you have read,write,execute access
    11 //place your code here
    12 
    13 originalcode:
    14 cmp edx,00000000
    15 jne exit
    16 //如果是第一次的数据
    17 mov [reset_data_of_blood],eax
    18 jmp exit
    19 
    20 exit:
    21 cmp ecx,eax
    22 je Crashlands.exe+1BDFF9B
    23 jmp returnhere
    24 
    25 "Crashlands.exe"+1BDFF0B:
    26 jmp newmem
    27 nop 3
    28 returnhere:
    29 
    30 
    31  
    32  
    33 [DISABLE]
    34 //code from here till the end of the code will be used to disable the cheat
    35 dealloc(newmem)
    36 dealloc(reset_data_of_blood)
    37 unregistersymbol(reset_data_of_blood)
    38 "Crashlands.exe"+1BDFF0B:
    39 cmp ecx,eax
    40 je Crashlands.exe+1BDFF9B
    41 //Alt: db 39 C1 0F 84 88 00 00 00
    find redata
     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 mov edx,[reset_data_of_blood]
    14 push ebx
    15 mov ebx,5F5E0FF
    16 cvtsi2sd xmm0,ebx
    17 pop ebx
    18 movsd [edx],xmm0
    19 pop edx
    20 jmp exit
    21 
    22 exit:
    23 mov eax,[esi+64]
    24 mov ecx,Crashlands.exe+CFFFF
    25 jmp returnhere
    26 
    27 "Crashlands.exe"+1BDFF9B:
    28 jmp newmem
    29 nop 3
    30 returnhere:
    31 
    32 
    33  
    34  
    35 [DISABLE]
    36 //code from here till the end of the code will be used to disable the cheat
    37 dealloc(newmem)
    38 "Crashlands.exe"+1BDFF9B:
    39 mov eax,[esi+64]
    40 mov ecx,Crashlands.exe+CFFFF
    41 //Alt: db 8B 46 64 B9 FF FF FF 00
    make blood upper 99999999

        修改器截图:

          可以下载(图后补)

        测试效果:

          绑定血量测试

          物品数量绑定测试

        以上测试仅针对下图版本,如果是此版本的用户,可以私自联系我,找到这一版本的修改器。(网络空间实在有限,我就仅在个人磁盘中保存)

                   

         //----------------------------------[ END ]

         //--------------------------------------------------------------[ 2021-01-18 至 2021-01-20, 更新内容 ] 

        我看到有人AT我,是因为游戏貌似更新了哈!哈?我努力钻研、并在2020年年底做完修改器,准备完结了,结果 2021年1月就更新了。估计官方看我最近不写修改器,指定给我安排呢!

        到 20 号这一天,我才做好 “无限物品” 和 “一击必杀” 两项,讲道理啊,真的不好做!我遇见的修改器里面最难做的了。

        研究过程

        1、一击必杀

          思路还是找到修改攻击力的代码,将它改成 “把攻击力绑定在 99,999,999 ”。(先找到攻击力地址,查看是什么访问了这里,根据断点找到上一级返回的地址,就知道是调用的那个CALL了,最后在那里记录下地址,再把修改地址的地方改写)

          (1)、搜索 Double 类型(双浮点),找到对应下图的地址(如果找到两个,可以把一个改成 99,999,999 并绑定看看是不是会一击必杀)【和之前一样】

                          

          (2)、右击选择 “是什么访问了这个地址”,回去按 “Q” 看看是什么地址访问的。如下图:

          

          (3)、找到如下图的汇编,点击 “显示反汇编程序”,之后 查找反汇编地址的窗口就可以了,保留我们点击以后的窗口。找到的地址是 "Crashlands.exe+A70C" (物理地址:0066A70C),那么,我们可以设置一下地址书签方便我们找到这个地址。

                         

          (4)、分析 movsd [esi],xmm0 一句,这句汇编代码的意思是 将 xmm0 的数据(Double类型)存到 esi 寄存器所显示的地址当中去。

          (5)、我们如果在这里设置断点,发现程序会一直检测到断点,而想要的断点都不是我们需要的断点。造成这种结果的原因可能是这是一段较为基础的共用代码,在其他的线程中经常会被调用。(看到地址只是+A70C就知道大概率是静态部分的代码)

          (6)、采取的办法依旧是在对应上方 movsd [esi],xmm0 一句处做汇编处理:(绿色的是源码,橙色的是要写上去的代码)

            originalcode:
              cmp esi,1578AF70
              jne exit
              jmp exit

            exit:
              movsd [esi],xmm0
              pop esi
              jmp returnhere

         (7)、把代码激活以后在 jmp exit 一句中设置断点,之后打开堆栈跟踪(视图里最上面那个),如下图:

                      

           (8)、找到如下图一样的跳转表。找到了下表,就可以把断点取消,然后恢复游戏状态。之后,取消上面的代码的激活状态。

                     

          (9)、我们还是和上次一样准备去寻找给 esi 赋值的对应 edx 为 0 的值。先跳转到表上第二行的 “Crashlands.exe+3A7B3D7”地址,并设置书签。

          (10)、根据上一次修改攻击力的经验,我们这一次要找到前面类似于 Crashlands.exe+A??? 的地址。各位,我觉得下图的它就不错。对,也只能是它——Crashlands.exe+3A7B38B。

                     

          (11)、在上面一处设置断点,之后回去按 Q 进入页面,再按 Q 退出,得到如下的规律。(edx 没有再变,与其这样说,还不如说是只有 eax 在从 0 到 23【35】变化)

                    

         (12)、因为 eax 在调用 CALL 之前是我们观察的关键,我们需要在前面知道 eax 是 0 的时候,对应执行的后面的代码也对应着做修改。但是,在代码执行的过程中间,eax的值就会被丢弃,我们到后面无法得知原本 eax 的值。

         (13)、那怎么办呢?我们需要在调用 CALL 之前的代码中把 eax 的值保存下来,用于我们后面代码的判断。简而言之,就是注册新内存让整体代码都可以被调用。

         (14)、在 Crashlands.exe + 3A7B38B 处或者前面的“没有修改 eax 值的”的代码处做汇编,可以 AOB 也可以直接代码注入。

     1 { Game   : Crashlands.exe
     2   Version: 
     3   Date   : 2021-01-18
     4   Author : dell
     5 
     6   This script does blah blah blah
     7 }
     8 
     9 [ENABLE]
    10 //code from here to '[DISABLE]' will be used to enable the cheat
    11 
    12  
    13  
    14 aobscanmodule(FIND_DATA_TMP,Crashlands.exe,83 C4 04 8B 4E 08 50 E8 30) // should be unique
    15 alloc(newmem,$1000)
    16 alloc(reset_data_of_tmp,8)
    17 registersymbol(reset_data_of_tmp)
    18 label(code)
    19 label(return)
    20 
    21 newmem:
    22   add esp,04
    23   mov ecx,[esi+08]
    24   mov [reset_data_of_tmp],eax
    25   jmp return
    26 
    27 code:
    28   add esp,04
    29   mov ecx,[esi+08]
    30   jmp return
    31 
    32 FIND_DATA_TMP:
    33   jmp newmem
    34   nop
    35 return:
    36 registersymbol(FIND_DATA_TMP)
    37 
    38 [DISABLE]
    39 //code from here till the end of the code will be used to disable the cheat
    40 FIND_DATA_TMP:
    41   db 83 C4 04 8B 4E 08
    42 
    43 unregistersymbol(FIND_DATA_TMP)
    44 dealloc(newmem)
    45 dealloc(reset_data_of_tmp)
    46 unregistersymbol(reset_data_of_tmp)
    47 {
    48 // ORIGINAL CODE - INJECTION POINT: "Crashlands.exe"+3A7B384
    49 
    50 "Crashlands.exe"+3A7B361: 83 C4 08                 -  add esp,08
    51 "Crashlands.exe"+3A7B364: 8B 4D 08                 -  mov ecx,[ebp+08]
    52 "Crashlands.exe"+3A7B367: C7 46 3C 67 00 00 00     -  mov [esi+3C],00000067
    53 "Crashlands.exe"+3A7B36E: 8B 01                    -  mov eax,[ecx]
    54 "Crashlands.exe"+3A7B370: 68 DB 94 01 00           -  push 000194DB
    55 "Crashlands.exe"+3A7B375: FF 50 08                 -  call dword ptr [eax+08]
    56 "Crashlands.exe"+3A7B378: 89 46 04                 -  mov [esi+04],eax
    57 "Crashlands.exe"+3A7B37B: 8D 46 70                 -  lea eax,[esi+70]
    58 "Crashlands.exe"+3A7B37E: 50                       -  push eax
    59 "Crashlands.exe"+3A7B37F: E8 4C FD 51 00           -  call Crashlands.exe+3F9B0D0
    60 // ---------- INJECTING HERE ----------
    61 "Crashlands.exe"+3A7B384: 83 C4 04                 -  add esp,04
    62 "Crashlands.exe"+3A7B387: 8B 4E 08                 -  mov ecx,[esi+08]
    63 // ---------- DONE INJECTING  ----------
    64 "Crashlands.exe"+3A7B38A: 50                       -  push eax
    65 "Crashlands.exe"+3A7B38B: E8 30 F2 58 FC           -  call Crashlands.exe+A5C0
    66 "Crashlands.exe"+3A7B390: 89 46 0C                 -  mov [esi+0C],eax
    67 "Crashlands.exe"+3A7B393: FF 75 08                 -  push [ebp+08]
    68 "Crashlands.exe"+3A7B396: E8 55 E3 53 00           -  call Crashlands.exe+3FB96F0
    69 "Crashlands.exe"+3A7B39B: 83 C4 04                 -  add esp,04
    70 "Crashlands.exe"+3A7B39E: 8D 46 70                 -  lea eax,[esi+70]
    71 "Crashlands.exe"+3A7B3A1: 50                       -  push eax
    72 "Crashlands.exe"+3A7B3A2: E8 29 FD 51 00           -  call Crashlands.exe+3F9B0D0
    73 "Crashlands.exe"+3A7B3A7: 83 C4 04                 -  add esp,04
    74 }
    find redata before

         (15)、这样在激活这个代码以后,就可以提供一个临时数据 reset_data_of_tmp ,它帮我们记录 eax 值的状态。

         (16)、在上图 call 的后面一句,设置断点。发现 eax 的值是规律的 +10 变化的。其中这些地址都是我们玩家的一些属性,只不过我们需要的只是攻击力那一项而已。

                    

         (17)、上述地址我们可以得到最基础的那个地址,然后下面的所有属性的地址都能够找到

                   

          (18)、我们在取消那个地方的断点,恢复游戏运行,然后在那里进行汇编。(绿色是源码,橙色是汇编码)

          newmem:
            push edx
            mov edx,[reset_data_of_tmp]    // 前面汇编代码已经保存了的 “eax” 的值
            cmp edx,00000000         // 如果 CALL前面 eax 值 是 0,我们需要将对应的 CALL 后面的 eax 值 记录到 reset_data_of_base 中
            pop edx
            jne code
            mov [reset_data_of_base],eax
            jmp code

          code:
            mov [esi+0C],eax
            push [ebp+08]
            jmp return

          (19)、总体的汇编如下,也可以使用 AOB 注入,直接注入也可以,我就用 AOB 了。

     1 { Game   : Crashlands.exe
     2   Version: 
     3   Date   : 2021-01-18
     4   Author : dell
     5 
     6   This script does blah blah blah
     7 }
     8 
     9 [ENABLE]
    10 //code from here to '[DISABLE]' will be used to enable the cheat
    11 
    12  
    13  
    14 aobscanmodule(FIND_REDATA,Crashlands.exe,89 46 0C FF 75 08 E8 55) // should be unique
    15 alloc(newmem,$1000)
    16 alloc(reset_data_of_base,8)
    17 registersymbol(reset_data_of_base)
    18 label(code)
    19 label(return)
    20 
    21 newmem:
    22   push edx
    23   mov edx,[reset_data_of_tmp]
    24   cmp edx,00000000
    25   pop edx
    26   jne code
    27   mov [reset_data_of_base],eax
    28   jmp code
    29 
    30 code:
    31   mov [esi+0C],eax
    32   push [ebp+08]
    33   jmp return
    34 
    35 FIND_REDATA:
    36   jmp newmem
    37   nop
    38 return:
    39 registersymbol(FIND_REDATA)
    40 dealloc(reset_data_of_base)
    41 unregistersymbol(reset_data_of_base)
    42 
    43 [DISABLE]
    44 //code from here till the end of the code will be used to disable the cheat
    45 FIND_REDATA:
    46   db 89 46 0C FF 75 08
    47 
    48 unregistersymbol(FIND_REDATA)
    49 dealloc(newmem)
    50 
    51 {
    52 // ORIGINAL CODE - INJECTION POINT: "Crashlands.exe"+3A7B390
    53 
    54 "Crashlands.exe"+3A7B370: 68 DB 94 01 00           -  push 000194DB
    55 "Crashlands.exe"+3A7B375: FF 50 08                 -  call dword ptr [eax+08]
    56 "Crashlands.exe"+3A7B378: 89 46 04                 -  mov [esi+04],eax
    57 "Crashlands.exe"+3A7B37B: 8D 46 70                 -  lea eax,[esi+70]
    58 "Crashlands.exe"+3A7B37E: 50                       -  push eax
    59 "Crashlands.exe"+3A7B37F: E8 4C FD 51 00           -  call Crashlands.exe+3F9B0D0
    60 "Crashlands.exe"+3A7B384: 83 C4 04                 -  add esp,04
    61 "Crashlands.exe"+3A7B387: 8B 4E 08                 -  mov ecx,[esi+08]
    62 "Crashlands.exe"+3A7B38A: 50                       -  push eax
    63 "Crashlands.exe"+3A7B38B: E8 30 F2 58 FC           -  call Crashlands.exe+A5C0
    64 // ---------- INJECTING HERE ----------
    65 "Crashlands.exe"+3A7B390: 89 46 0C                 -  mov [esi+0C],eax
    66 "Crashlands.exe"+3A7B393: FF 75 08                 -  push [ebp+08]
    67 // ---------- DONE INJECTING  ----------
    68 "Crashlands.exe"+3A7B396: E8 55 E3 53 00           -  call Crashlands.exe+3FB96F0
    69 "Crashlands.exe"+3A7B39B: 83 C4 04                 -  add esp,04
    70 "Crashlands.exe"+3A7B39E: 8D 46 70                 -  lea eax,[esi+70]
    71 "Crashlands.exe"+3A7B3A1: 50                       -  push eax
    72 "Crashlands.exe"+3A7B3A2: E8 29 FD 51 00           -  call Crashlands.exe+3F9B0D0
    73 "Crashlands.exe"+3A7B3A7: 83 C4 04                 -  add esp,04
    74 "Crashlands.exe"+3A7B3AA: 50                       -  push eax
    75 "Crashlands.exe"+3A7B3AB: FF 76 04                 -  push [esi+04]
    76 "Crashlands.exe"+3A7B3AE: E8 5D E8 51 00           -  call Crashlands.exe+3F99C10
    77 "Crashlands.exe"+3A7B3B3: 83 C4 08                 -  add esp,08
    78 }
    find redata

          (20)、上面得到的 reset_data_of_base 是基础地址,[reset_data_of_base + 40 ] 才是 攻击力!reset_data_of_base + 40 是 攻击力的地址。

          (21)、现在我们激活上面的代码,再回到一开始修改地址的地方—— Crashlands.exe+A70C ! 才怪!是代码为 call Crashlands.exe+A70C 的地方——Crashlands.exe+3A7B3D2!

          (22)、在这里汇编,如果被修改的地址(esi)是攻击力的地址 ( reset_data_of_base + 40 ),那么我们就改 esi 里的值变成 99,999,999 。

     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 call Crashlands.exe+A480
    13 push edx
    14 mov edx,[reset_data_of_base]
    15 add edx,40
    16 push ebx
    17 mov ebx,F423F
    18 cvtsi2sd xmm0,ebx
    19 movsd [edx],xmm0
    20 
    21 exit:
    22 pop edx
    23 jmp returnhere
    24 
    25 "Crashlands.exe"+3A7B3D2:
    26 jmp newmem
    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 "Crashlands.exe"+3A7B3D2:
    36 call Crashlands.exe+A480
    37 //Alt: db E8 A9 F0 58 FC
    make attack 99999999

          (23)、代码解析:(绿色是源码,橙色是汇编码)

          originalcode:
            call Crashlands.exe+A480
            push edx
            mov edx,[reset_data_of_base]  //找到 基础地址
            add edx,40           // + 40 变成 攻击力的地址
            push ebx
            mov ebx,F423F          // ebx = F423F         // 99,999,999
            cvtsi2sd xmm0,ebx         // xmm0 = (double) ebx
            movsd [edx],xmm0

          exit:
            pop edx
            jmp returnhere

      2、无限物品

        (1)、先搜索到物品的两个地址,以木材为例。(搜索双浮点 Double)

        

        (2)、我们把在工作台那里显示的数据称为 True 地址,把另外一个在 “建造模式” 下显示的数据称为 False 地址

        (3)、那么我们如何给它们两个做好标记呢?很简单,只修改一个地址,之后回去打开工作台看看木材数量有没有变化。如果变化了,那就是 True 地址。

        (4)、对 True 地址的 “是什么操作码访问了该地址” 以后是这样的结果:(蓝色代码处记录书签A)—— Crashlands.exe+3FD9F55

         

        (5)、对 False 地址的 “是什么操作码访问了该地址” 以后是这样的结果:(蓝色代码处记录书签B)—— Crashlands.exe+3FD7D04

        

          (6)、现在我们有一点是十分确定的,这两部分代码都是共用代码!这就需要分别用我之前用的“特别值法”试出来堆栈排布。

          (7)、我们先看看 True 地址的 试探!

        

        (8)、上面有几点:(需要长时间的一个一个比较观察)

          a. [esi] 的值永远是 Double 类型的 224

          b.  edx 的值永远是 00000000

          c. [eax+10]的值应该是 Double 类型的整数

        (9)、所以,我们要把不满足上述关系的地址排除掉!满足的就修改到 49999!

        (10)、!!!上!!!汇!!!编!!!

     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 // 1 级 判定
    13 cmp edx,00000000
    14 jne exit
    15 
    16 // 2 级 判定 --- 此判定会删除采集类物资
    17 //cmp ecx,00000007
    18 //jne exit
    19 
    20 // 3 级 判定
    21 push edx
    22 mov edx,[eax+10]
    23 cmp edx,00000000
    24 pop edx
    25 jne exit
    26 
    27 // 预备
    28 push edx
    29 movsd xmm0,[esi] // movsd xmm0,[eax+10]
    30 cvttsd2si edx,xmm0
    31 // 4 pan
    32 cmp edx,E0 // 224
    33 pop edx
    34 jne exit
    35 
    36 //执行
    37 push edx
    38 mov edx,C34F //49999
    39 cvtsi2sd xmm0,edx
    40 pop edx
    41 movsd [eax+10],xmm0
    42 jmp exit
    43 
    44 exit:
    45 movups xmm0,[eax+10]
    46 mov esi,[ebp+08]
    47 jmp returnhere
    48 
    49 "Crashlands.exe"+3FD9F55:
    50 jmp newmem
    51 nop 2
    52 returnhere:
    53 
    54 
    55  
    56  
    57 [DISABLE]
    58 //code from here till the end of the code will be used to disable the cheat
    59 dealloc(newmem)
    60 "Crashlands.exe"+3FD9F55:
    61 movups xmm0,[eax+10]
    62 mov esi,[ebp+08]
    63 //Alt: db 0F 10 40 10 8B 75 08
    true item to 49999

        (11)、True 地址就可以被修改了,(起码在工作台那里)有过的资源就可以当无限使用。

        (12)、False 地址就比较特殊。它这里调用的是一个多类型的共用代码——我无法根据找到的特殊寄存器值进行比较,筛选出合适的地址。(结果不完美)

        (13)、所以,我们要回溯!我们继续找堆栈关系,如下图:

        

           (14)、每一次修改会被执行两次,分别对应 Crashlands.exe+9FF563 、Crashlands.exe+9FF74E,这两个都是 Crashlands.exe+3FBC100 的 CALL 返回后的地址。

        (15)、所以我们要让它每一次修改的时候执行的必须是我们通过 Crashlands.exe+9FF563 、Crashlands.exe+9FF74E 地址调过去的才可以被修改。所以,我们在最后一个 CALL 的左右两次进行数据设置,先设为1,再设为0。当我们进行地址访问时,如果这个数是1,我们做修改;否则不改。

          (16)、如下方代码,给定 bit_tag 全局变量。让它去左右是否改为 49999。

     1 [ENABLE]
     2 //code from here to '[DISABLE]' will be used to enable the cheat
     3 alloc(newmem,2048)
     4 alloc(bit_tag,8)
     5 registersymbol(bit_tag)
     6 label(returnhere)
     7 label(originalcode)
     8 label(exit)
     9 
    10 newmem: //this is allocated memory, you have read,write,execute access
    11 //place your code here
    12 
    13 originalcode:
    14 mov [bit_tag],00000001
    15 call Crashlands.exe+3FBC100
    16 mov [bit_tag],00000000
    17 
    18 exit:
    19 jmp returnhere
    20 
    21 "Crashlands.exe"+9FF749:
    22 jmp newmem
    23 returnhere:
    24 
    25 
    26  
    27  
    28 [DISABLE]
    29 //code from here till the end of the code will be used to disable the cheat
    30 dealloc(newmem)
    31 dealloc(bit_tag)
    32 unregistersymbol(bit_tag)
    33 "Crashlands.exe"+9FF749:
    34 call Crashlands.exe+3FBC100
    35 //Alt: db E8 B2 C9 5B 03
    bit_tag = 1 ; CALL ; bit_tag = 0 ;

        (17)、确定了当 [bit_tag] 是 1 的时候修改,我们就把数据改为 49999!

     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 cmp [bit_tag],00000001
    13 jne exit
    14 //执行
    15 push edx
    16 mov edx,C34F //49999
    17 cvtsi2sd xmm0,edx
    18 pop edx
    19 movsd [edi],xmm0
    20 jmp exit
    21 
    22 exit:
    23 movsd xmm0,[edi]
    24 pop edi
    25 jmp returnhere
    26 
    27 "Crashlands.exe"+3FD7D04:
    28 jmp newmem
    29 returnhere:
    30 
    31 
    32  
    33  
    34 [DISABLE]
    35 //code from here till the end of the code will be used to disable the cheat
    36 dealloc(newmem)
    37 "Crashlands.exe"+3FD7D04:
    38 movsd xmm0,[edi]
    39 pop edi
    40 //Alt: db F2 0F 10 07 5F
    false item to 49999

        (18)、代码激活的顺序,注意有需要到全局变量的,一定要让带有它的内存申请部分代码的代码项先激活。如下图,只有父项先激活,才可以激活它的子项。(只有先取消激活它的子项,才能取消激活它的父项)

        

      3、绑定血量(99,999,999)

        给大家看看效果:

        

         嗯,更新已经是 2021-01-25 ,思路如下:

        (1)、找到访问数据的地址或者修改数据的地址(亲测修改数据的地址可行,其余的代码量和访问量过大) 。找到地址是 Crashlands.exe + A70C !

        (2)、按照 “惯例”,我们使用特殊值法找到地址跳转的三级。

        

        Crashlands.exe+52FE31  有用,记录

        Crashlands.exe+3A52D2E     有用,同上

        Crashlands.exe+3F9A90C  真没用

        (3)、记录好断点回归的三个地址以后,我们在一开始处设置断点,观察结果:

        

         

        (4)、我们需要的是这里的 ecx 值,判断它是我们需要的结果我们就修改它。

        (5)、如果只是判断它不是1就更改的话,结果就是我们的血量绑定到 99,999,999了,而怪物的血量同样的被绑定了。

        (6)、这个时候,我们需要判断——什么时候这个地址修改的不是自己的血量值,而是怪物的。我们看到怪物血量所对应的堆栈跟踪是如下图这样的:

        

        (7)、这样我们可以确定了—— 通过 Crashlands.exe+3A52D2E 之前的地址 访问 Crashlands.exe+52FE31 之前的地址 的是修改自己的血量,而通过 Crashlands.exe+23F1791 之前的地址 访问 Crashlands.exe+52FE31 之前的地址 的则不是。

        (8)、那么我们就故技重施!在 Crashlands.exe+3A52D2E 前后声明全局变量,先赋值 1,再赋值 0 。判定为1时修改,否则不改。

     1 [ENABLE]
     2 //code from here to '[DISABLE]' will be used to enable the cheat
     3 alloc(newmem,2048)
     4 alloc(seq_before,8)
     5 registersymbol(seq_before)
     6 label(returnhere)
     7 label(originalcode)
     8 label(exit)
     9 
    10 newmem: //this is allocated memory, you have read,write,execute access
    11 //place your code here
    12 
    13 originalcode:
    14 mov [seq_before],00000001
    15 call Crashlands.exe+52E330
    16 mov [seq_before],00000000
    17 
    18 exit:
    19 jmp returnhere
    20 
    21 "Crashlands.exe"+3A52D29:
    22 jmp newmem
    23 returnhere:
    24 
    25 
    26  
    27  
    28 [DISABLE]
    29 //code from here till the end of the code will be used to disable the cheat
    30 dealloc(newmem)
    31 dealloc(seq_before)
    32 unregistersymbol(seq_before)
    33 "Crashlands.exe"+3A52D29:
    34 call Crashlands.exe+52E330
    35 //Alt: db E8 02 B6 AD FC
    seq_before

        (9)、之后就是确定修改的代码了,如下:

     1 [ENABLE]
     2 //code from here to '[DISABLE]' will be used to enable the cheat
     3 alloc(newmem,2048)
     4 alloc(seq_blood,8)
     5 //registersymbol(seq_blood)
     6 label(returnhere)
     7 label(originalcode)
     8 label(exit)
     9 
    10 newmem: //this is allocated memory, you have read,write,execute access
    11 //place your code here
    12 
    13 originalcode:
    14 cmp [seq_before],00000001
    15 jne exit
    16 push edx
    17 movsd xmm0,[ecx]
    18 cvttsd2si edx,xmm0
    19 cmp edx,00000001      // 1
    20 pop edx
    21 je exit
    22 mov [seq_blood],ecx
    23 call Crashlands.exe+A480
    24 push edx
    25 mov edx,5F5E0FF
    26 cvtsi2sd xmm0,edx
    27 mov edx,[seq_blood]
    28 movsd [edx],xmm0
    29 pop edx
    30 jmp returnhere
    31 
    32 exit:
    33 call Crashlands.exe+A480
    34 jmp returnhere
    35 
    36 "Crashlands.exe"+52FE2C:
    37 jmp newmem
    38 returnhere:
    39 
    40 
    41  
    42  
    43 [DISABLE]
    44 //code from here till the end of the code will be used to disable the cheat
    45 dealloc(newmem)
    46 dealloc(seq_blood)
    47 //unregistersymbol(seq_blood)
    48 "Crashlands.exe"+52FE2C:
    49 call Crashlands.exe+A480
    50 //Alt: db E8 4F A6 AD FF
    < 50 ? go : mov it

        (10)、那么,我们留一个疑问?我们根据《Nine Parchments》的修改经验,用这段代码改成 “是我的血就无限着呆着,是怪物的血就清零”,是不是就可以做成另一类的 “一击必杀”了呢?我在这里先给出我自己的看法(因为我没尝试,所以说看法):嗯~这段代码好像不止用来修改人的血量,如果要尝试,也试着从 Crashlands.exe+23F1791 上故技重施!还有不排除外在 己方NPC 的问题,还有怪物血量访问的问题。

      4、Buff 时间固定 (我设置到 90 秒固定)

        先看看效果:

        

         思路很简单Buff值实际上就是双浮点数值,根据以往修改这个游戏的经验改就可以了。

        下图估计是我能找到的最全的 Buff 了。

        

       5、技能时间无冷却

        其实技能时间是1个双浮点数值,根据以往修改这个游戏的经验改成0就可以了。

        恐怖神明 道具的无冷却展示:

        

         弗恩圆球 道具的无冷却展示:

        

         //----------------------------------[ END ]

  • 相关阅读:
    用户登录
    在ASP.NET里实现计算器代码的封装
    计算器的封装
    典型用户和场景-老陈、小石头
    葫芦娃团队
    20155235 王玥 《基于Arm实验箱的接口测试和应用》 课程设计报告
    实验补交专用链接随笔
    20155235 《网络攻防》 实验九 Web安全基础
    20155235 《网络攻防》 实验七 网络欺诈防范
    20155235 《网络攻防》 实验八 Web基础
  • 原文地址:https://www.cnblogs.com/onepersonwholive/p/12312322.html
Copyright © 2020-2023  润新知