Steam游戏《Rabi-Ribi(拉比哩比)》修改器制作【版本:1.99s + 1.99t + 2.01 】

  

日期:2020.07.23

博客期:178

星期四

 

【温馨提示】:

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

      

资源下载表
没有博客园账号的网友

百度网盘下载链接https://pan.baidu.com/s/1oAA7ypODHSAKSkCKO1FOUg

提取码rabi

有博客园账号的网友 版本 CT文件 修改器
1.99s 点我下载 点我下载
1.99t 点我下载 点我下载
2.01 点我下载 点我下载

 

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

B 站测试视频 bv 号BV1YU4y1s7Qx


 前言

  这个游戏最近刚接触到,我靠着自己不作弊的情况下就只能打到一部分,唉~我的躲弹幕类型游戏的投入确实不深,不要再说我游戏菜鸟了,我自己说了我自己,大家就不要说了。有好多人说你玩个游戏还用修改器,这样你玩不了多久就不想玩下去了。我个人认为大多数这些人都是自己通关了,想看别人受难。还有我只负责做修改器,别人用不用可不是我说了算的。所以我个人想说,你用了修改器和不用修改器是两种不同的体验,想一想你会无限跳就能提前跑到之前到达不了的地方,就会有不一样的通关路线,这对游戏是有帮助的。总之,做了修改器甚至能够丰富游戏性,让用户有不同体验的选择,这不是更好么?

修改内容(内部构造)

  1、血量不减的思路

  首先,如果会CE的基本操作的网友就可以直接搜索数值,进行锁定就可以了,这样我们可以找到基础的 HP 的位置,可以透过扫描或者多重地址的方法利用基质锁定位置,这样我们实际上就可以慢慢地打了,但是我不会。我就是能用汇编代码的地方坚决不找地址。我会先找到一个 HP 的普通地址(没有关联,就是地址)【要找那个不随其他变化而变化,且能引起其他变化的地址】。然后继续找修改它的地方,我找到的是 "rabiribi.exe"+8D368 的地址(你们可以打开 “查看内存”,右击选择“转到地址”,将上述地址写入,并转到对应地址)。可以看到如下几句:

  汇编代码              实际效果

  mov ecx,[ebp-10]          // [ebp-10] = ecx

  sub eax,ecx             // eax = eax - ecx

  mov [esi+edi+000004DC],eax     //  [esi+edi+000004DC] = eax 

  我们分析上述代码,我们找到这是血量减少的语句,[ebp-10] 是要减少多少血量,[esi+edi+000004DC] 是实际血量地址。

  那么我们现在就有很多种办法进行修改,一是在整段话之前将 [ebp-10] 的值改为 0,即将 “mov [ebp-10],00000000”一句写入第一句之前;也可以在第一句之后加入“mov ecx,00000000”一句;也可以直接注释掉 “sub eax,ecx”一句或者改写成“sub eax,00000000”或者改写成“add eax,00000000” 等等,还可以注释掉后面的赋值一句。(这其实挺好理解的)无论哪一种都能达到我们生命不减少的目的。然后,我自己亲身测试了一下果然自己的生命没有减少,但是自己也无法减少敌人的血量,我的历史经验告诉我——遇到 共用代码段 了。(共用代码段就是敌人减少血量和自己减少血量所用函数相同,例如函数 def attack(Int code,Int damage) //code为生物所属ID,damage为减少的生命值)。所以遇到公用代码段,我最常用的方法就是修改公用代码利用判断语句区别传来的地址是敌人的还是自己的。使用这种方法就要找区别,我们可以在 mov [esi+edi+000004DC] 一句中加入断点,查看其各个寄存器的值,经过发现,只有当传入的地址是自己的血量值的时候 edi 寄存器的值才会是 0 ,所以我们针对 mov [esi+edi+000004DC] 一句中展开汇编:

 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 edi,0
13 je exit
14 mov [esi+edi+000004DC],eax
15 
16 exit:
17 jmp returnhere
18 
19 "rabiribi.exe"+8D368:
20 jmp newmem
21 nop 2
22 returnhere:
23 
24 
25  
26  
27 [DISABLE]
28 //code from here till the end of the code will be used to disable the cheat
29 dealloc(newmem)
30 "rabiribi.exe"+8D368:
31 mov [esi+edi+000004DC],eax
32 //Alt: db 89 84 3E DC 04 00 00
血量不减汇编码

  经过亲测可以达到绑定个人血量的效果。

2、提升个人十倍伤害

  我们已经找到了上述代码,其中 [ebp-10] 的值是伤害的大小。那么我们的思路就很清晰了:如果传来的地址是个人的地址(要减少个人血量),那就不对伤害值进行操作;如果不是个人地址(那就是敌人的地址),就将伤害予以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 mov ecx,[ebp-10]
13 cmp edi,0
14 je exit
15 imul ecx,ecx,A
16 
17 
18 exit:
19 sub eax,ecx
20 jmp returnhere
21 
22 "rabiribi.exe"+8D363:
23 jmp newmem
24 returnhere:
25 
26 
27  
28  
29 [DISABLE]
30 //code from here till the end of the code will be used to disable the cheat
31 dealloc(newmem)
32 "rabiribi.exe"+8D363:
33 mov ecx,[ebp-10]
34 sub eax,ecx
35 //Alt: db 8B 4D F0 29 C8
十倍伤害汇编码

  经过亲测可以达到效果。其中 A 是 十六进制的 10,如果想要100倍就将 A 改成 64 ( 6 * 16 + 4 = 100 )。

3、SP值不减(可以不停的敲锤子)

  我们还是通过“未知初始值”,然后不断变化找到 SP值 的地址,然后查找修改它的汇编码,我找到的汇编码地址是 "rabiribi.exe"+84F7E ,大抵是:

  汇编代码              实际效果

  movd xmm0,[ecx+edx+000005B8]     // xmm0 = (float) [ecx+edx+000005B8]  (这一句可能不太妥,大家看看就好,不必较真)

  subss xmm0,xmm1          // xmm0 = xmm0 - xmm1

  cvttss2si eax,xmm0         // eax = (int) xmm0

  mov [ecx+edx+000005B8],eax     // [ecx+edx+000005B8] = eax

  经过分析,我们知道 [ecx+edx+000005B8] 是 SP 值地址,xmm1 是其中要减去的值。所以,我们采用最简单的方法,将 subss xmm0,xmm1 一句注释掉掉,就可以了。大家甚至可以将这四句话都注释掉,运行还能更加快捷呢!

 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 //subss xmm0,xmm1
13 cvttss2si eax,xmm0
14 
15 exit:
16 jmp returnhere
17 
18 "rabiribi.exe"+84F7E:
19 jmp newmem
20 nop 3
21 returnhere:
22 
23 
24  
25  
26 [DISABLE]
27 //code from here till the end of the code will be used to disable the cheat
28 dealloc(newmem)
29 "rabiribi.exe"+84F7E:
30 subss xmm0,xmm1
31 cvttss2si eax,xmm0
32 //Alt: db F3 0F 5C C1 F3 0F 2C C0
SP值不减汇编码

4、MP值不减

  这个和 SP 类似,但是又不完全是,我找到的地址是 "rabiribi.exe"+4F7D1

  汇编代码              实际效果

  movss xmm1,[esi+ecx+000006BC]     // xmm1 = [esi+ecx+000006BC]

  ...                  ...

  subss xmm1,xmm0           // xmm1 = xmm1 - xmm0

  ...                  ...

  movss [ecx+esi+000006BC],xmm1    // xmm1 = [ecx+esi+000006BC]

  这个我就不多说了吧,[esi+ecx+000006BC] 是 MP地址的值(实际存),去除 sub 一句,去除 mov 一句等等方法都可以!任选一种,亲测为去除最后赋值 movss 一句,有效果!

 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 //movss [esi+ecx+000006BC],xmm1
13 
14 exit:
15 jmp returnhere
16 
17 "rabiribi.exe"+4F7D1:
18 jmp newmem
19 nop 4
20 returnhere:
21 
22 
23  
24  
25 [DISABLE]
26 //code from here till the end of the code will be used to disable the cheat
27 dealloc(newmem)
28 "rabiribi.exe"+4F7D1:
29 movss [esi+ecx+000006BC],xmm1
30 //Alt: db F3 0F 11 8C 0E BC 06 00 00
MP值不减

5、无限金钱(EN值)

  我们通过找寻金钱值,发现共有三处可以修改它:一是商店购买,消耗 EN值;二是打怪,补充 EN值;三是最大 99999 的 EN 值 越界判定。嗯,其实简单来说直接找到 EN值的基地址就行了,因为它本身就是一级地址,直接找到改成 99999 就行了。但是呢,我偏不!!!我就要整代码!(大家不要学我,除非你遇到的地址是变化的多级地址)。我们把补充 EN 值 的代码和消耗 EN 值 的代码统一修改成 越界赋值语句就可以了。下面是汇编代码:

 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 //mov [rabiribi.exe+167608C],eax
13 mov [rabiribi.exe+167608C],0001869F
14 
15 exit:
16 jmp returnhere
17 
18 "rabiribi.exe"+1C10EA:
19 jmp newmem
20 returnhere:
21 
22 
23  
24  
25 [DISABLE]
26 //code from here till the end of the code will be used to disable the cheat
27 dealloc(newmem)
28 "rabiribi.exe"+1C10EA:
29 mov [rabiribi.exe+167608C],eax
30 //Alt: db A3 8C 60 6D 01
无限金钱-打怪
 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 //sub [rabiribi.exe+167608C],esi
13 
14 exit:
15 jmp returnhere
16 
17 "rabiribi.exe"+29134:
18 jmp newmem
19 nop
20 returnhere:
21 
22 
23  
24  
25 [DISABLE]
26 //code from here till the end of the code will be used to disable the cheat
27 dealloc(newmem)
28 "rabiribi.exe"+29134:
29 sub [rabiribi.exe+167608C],esi
30 //Alt: db 29 35 8C 60 6D 01
无限金钱-商店消耗

6、无限跳

  好了,大家上面的其实也还好。这次的 “无限跳” 是属于我之前未接触过的修改项。当然喽,我也是身法实在没有,才迫不得已准备这一个功能。我们首先确立思路:当我们对这一功能如何实现完全无法入手的时候,我们应该先想一想它跳跃为什么只能跳一下?再者,要是让我来写我要怎样写才能实现只跳一次呢?如果实在无从下手,索性我们就直接搜索未知值的地址。跳起来搜索变化的地址,落地搜索变化的地址,常此往复(可以适当在空中暂停俩次,其中一次查为改变;或者在路上走一走,查未改变的值),直到我们剩余的值的数量可以控制。之后绑定所有的值不变看看是不是能够实现 “无限跳”的效果。如果能,我们就可以继续寻找 究竟是哪几项不改变能实现“无限跳”的功能了。那么,实际上我找到的是两个地址,一个地址在落地后值为 0,空中为1;另一个值在落地后为 0,空中是 6。这样,我们再找是什么修改这两个值。凡是有可能将其值改变成不是 0 的代码都要被修改,修改成 给地址赋值 的语句就行了。你试着找一下,你一开始会找到三个。如果只修改这三个,那么你在下落的时候就无法再次起跳。所以,在锁定这三个的同时继续寻找,会找到一个下落时的数值判定,再把它改成 赋值为 0 的语句就大功告成了。

  汇编代码如下:

 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 //mov [ecx+edi+00000644],00000001
13 mov [ecx+edi+00000644],00000000
14 
15 exit:
16 jmp returnhere
17 
18 "rabiribi.exe"+8CAF9:
19 jmp newmem
20 nop 6
21 returnhere:
22 
23 
24  
25  
26 [DISABLE]
27 //code from here till the end of the code will be used to disable the cheat
28 dealloc(newmem)
29 "rabiribi.exe"+8CAF9:
30 mov [ecx+edi+00000644],00000001
31 //Alt: db C7 84 39 44 06 00 00 01 00 00 00
next address to 0 not 1
 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 //mov [edi+esi+00000644],00000001
13 mov [edi+esi+00000644],00000000
14 
15 exit:
16 jmp returnhere
17 
18 "rabiribi.exe"+94A3F:
19 jmp newmem
20 nop 6
21 returnhere:
22 
23 
24  
25  
26 [DISABLE]
27 //code from here till the end of the code will be used to disable the cheat
28 dealloc(newmem)
29 "rabiribi.exe"+94A3F:
30 mov [edi+esi+00000644],00000001
31 //Alt: db C7 84 37 44 06 00 00 01 00 00 00
next address to 0 not 1 under
 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 //mov [ebx+esi+000004BC],eax
13 mov [ebx+esi+000004BC],0
14 
15 exit:
16 jmp returnhere
17 
18 "rabiribi.exe"+1BDCFC:
19 jmp newmem
20 nop 2
21 returnhere:
22 
23 
24  
25  
26 [DISABLE]
27 //code from here till the end of the code will be used to disable the cheat
28 dealloc(newmem)
29 "rabiribi.exe"+1BDCFC:
30 mov [ebx+esi+000004BC],eax
31 //Alt: db 89 84 33 BC 04 00 00
prev address to 0 for eax
 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 //mov [ebx+esi+000004BC],00000006
13 mov [ebx+esi+000004BC],00000000
14 
15 exit:
16 jmp returnhere
17 
18 "rabiribi.exe"+1BDD15:
19 jmp newmem
20 nop 6
21 returnhere:
22 
23 
24  
25  
26 [DISABLE]
27 //code from here till the end of the code will be used to disable the cheat
28 dealloc(newmem)
29 "rabiribi.exe"+1BDD15:
30 mov [ebx+esi+000004BC],00000006
31 //Alt: db C7 84 33 BC 04 00 00 06 00 00 00
prev address to 0 not 6

亲测无限跳的演示

  

修改器截图

  


 后续更新部分---------------【2020-09-03 更新】

  呼~网上真的是找不到 1.99t 版本的游戏本体,我还是老老实实的去Steam上买了,下载完都下午了。我测试了一下,这个版本貌似有 CE 监听,不能设断点,自然也是不能查找修改代码端。一路上都是靠着分析之前的代码,进行查找最后完成的功能修改。今天心态不太好,就不准备做新的功能了,我也要步入学业忙起来了,我就先休息了。下次更新时间再定吧!

新的功能部分和修改部分解释说明:

  1、无限金钱因为1.99t中,有刷怪的EN值检测,无法完成。所以最终决定仅仅保留商店不消耗的部分。(因为打怪刷EN值的代码不能启用,于是我就把它丢尽 old address 部分了)

  2、无限跳

  起初因为开启了4个代码修改无法实现(prev 两个和 next 两个),而关闭了后面的prev两个可以实现,我就认定只需要前两个就可以了,但实际上亲测时重新开了一个存档发现还是不能无限跳。最终发现需要执行最后两项修改(prev)也还是需要执行一次,所以我们采用新颖的办法,增加一个 if 判定(cmp je)。生成一个全局变量 x 。一开始生成的时候,系统会默认它的值是 0,所以我们判定如果它是 0,就不再执行之前的语句,而是给 x 赋一个 不为 0 的值。这样第二次遇到的时候就可以不再执行。当然我们取消掉 “无限跳”的功能的时候,变量和代码都会被更改因而不会产生变化。

 1 [ENABLE]
 2 //code from here to '[DISABLE]' will be used to enable the cheat
 3 alloc(newmem,2048)
 4 alloc(item_tmp,8)
 5 label(returnhere)
 6 label(originalcode)
 7 label(exit)
 8 registersymbol(item_tmp)
 9 
10 newmem: //this is allocated memory, you have read,write,execute access
11 //place your code here
12 
13 originalcode:
14 cmp [item_tmp],00000000
15 je exit
16 mov [ebx+esi+000004BC],00000006
17 
18 exit:
19 mov [item_tmp],00000006
20 mov [ebx+esi+000004BC],00000000
21 jmp returnhere
22 
23 "rabiribi.exe"+1BFBB5:
24 jmp newmem
25 nop 6
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 dealloc(item_tmp)
35 unregistersymbol(item_tmp)
36 "rabiribi.exe"+1BFBB5:
37 //mov [ebx+esi+000004BC],00000006
38 mov [ebx+esi+000004BC],00000000
39 //Alt: db C7 84 33 BC 04 00 00 06 00 00 00
无限跳-prev address to 0 not 6-1.99t
 1 [ENABLE]
 2 //code from here to '[DISABLE]' will be used to enable the cheat
 3 alloc(newmem,2048)
 4 alloc(item_tmp_s,8)
 5 label(returnhere)
 6 label(originalcode)
 7 label(exit)
 8 registersymbol(item_tmp_s)
 9 
10 newmem: //this is allocated memory, you have read,write,execute access
11 //place your code here
12 
13 originalcode:
14 //mov [ebx+esi+000004BC],eax
15 mov [ebx+esi+000004BC],0
16 
17 exit:
18 jmp returnhere
19 
20 "rabiribi.exe"+1BFB9C:
21 jmp newmem
22 nop 2
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(item_tmp_s)
32 unregistersymbol(item_tmp_s)
33 "rabiribi.exe"+1BFB9C:
34 mov [ebx+esi+000004BC],eax
35 //Alt: db 89 84 33 BC 04 00 00
无限跳-prev address to 0 for eax-1.99t

  1.99s版本无限跳没有任何改变,因而不再演示(没有特殊标注是1.99t版本的统一认定是1.99s版本)

  3、BOSS连续伤害MAX判定

  这个功能是在打BOSS 的时候,可以一击达到 MAX 99999 的判定,可以说是一击达到要求,后续正确做一个判定锁定的。注意:如果被攻击貌似也还是会回扣...反正亲测没有。原理是把赋值的位置改为赋值 99999.

 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 mov [eax+000005C8],1869F
13 mov ecx,[eax+000005C8]
14 
15 exit:
16 jmp returnhere
17 
18 "rabiribi.exe"+59A42:
19 jmp newmem
20 nop
21 returnhere:
22 
23 
24  
25  
26 [DISABLE]
27 //code from here till the end of the code will be used to disable the cheat
28 dealloc(newmem)
29 "rabiribi.exe"+59A42:
30 mov ecx,[eax+000005C8]
31 //Alt: db 8B 88 C8 05 00 00
BOSS连伤MAX-1.99t

  4、无敌状态

  无敌状态的原理其实非常简单,在系统中有赋值语句对应 [edi + esi + 00000680] 的语句中,若 edi0,则可以判定这是玩家的结构体内部,而此地址就是对应玩家的无敌状态剩余时间。(只要不为 444,就说明处于无敌状态)。所以我们需要在它数值更改的代码段进行更改(Steam1.99t 版本在执行断点是会被察觉自动退出游戏进而无法修改,可以先使用1.99s 版本进行修改,并记住修改位置及其附近的代码【应挑选没有rabirabi.exe+xxxxx的代码】,到1.99t时直接搜索代码段进行查找) 

  我遇到的修改项有 5 个,但并不是每一个都要修改,有赋值成 FFFFFFFF32 的,这个是我们进入对话之后的状态,建议不要修改(亲测修改的话,游戏会黑屏)。我们要修改赋值为 0 的和两个赋值为 eax 的,0 对应的是 “当你切换地图时,我们会产生无敌状态” 的代码段。而 eax 是对应 “你受伤时的赋值” 和 “无敌状态剩余时间不为 0 时自动减少” 的代码段。 我们可以分析并进行汇编代码的编写:

 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 ebx,00000000
13 jne exit
14 mov edx,20
15 jmp exit
16 
17 exit:
18 mov [ebx+esi+00000684],edx
19 jmp returnhere
20 
21 "rabiribi.exe"+1C05C2:
22 jmp newmem
23 nop 2
24 returnhere:
25 
26 
27  
28  
29 [DISABLE]
30 //code from here till the end of the code will be used to disable the cheat
31 dealloc(newmem)
32 "rabiribi.exe"+1C05C2:
33 mov [ebx+esi+00000684],edx
34 //Alt: db 89 94 33 84 06 00 00
无敌状态-受伤后一直处于无敌状态-1.99t
 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 mov [esi+00000684],00000020
13 
14 exit:
15 jmp returnhere
16 
17 "rabiribi.exe"+3255C9:
18 jmp newmem
19 nop 5
20 returnhere:
21 
22 
23  
24  
25 [DISABLE]
26 //code from here till the end of the code will be used to disable the cheat
27 dealloc(newmem)
28 "rabiribi.exe"+3255C9:
29 mov [esi+00000684],00000000
30 //Alt: db C7 86 84 06 00 00 00 00 00 00
无敌状态-进入新地图不更新变量“剩余无敌时间”-1.99t

  5、取消BOSS无敌判定(仅限1.99s版本)

  首先因为1.99t 版本BOSS无敌判定有监听,无法完成修改,所以1.99t 版本没有此项功能。要实现这个功能,原理和上一个差不多,我们 判定 edi 不是 0,则把无敌时间改为 0 即可。不过为了和个人无敌状态不冲突,我们需要和上一个修改做妥协处理,我们需要隔开,选用上上句进行自动汇编。

 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 jp rabiribi.exe+1BE729
13 lea edx,[ecx-01]
14 cmp ebx,00000000
15 je exit
16 mov edx,0
17 jmp returnhere
18 
19 exit:
20 jmp returnhere
21 
22 "rabiribi.exe"+1BE71D:
23 jmp newmem
24 returnhere:
25 
26 
27  
28  
29 [DISABLE]
30 //code from here till the end of the code will be used to disable the cheat
31 dealloc(newmem)
32 "rabiribi.exe"+1BE71D:
33 jp rabiribi.exe+1BE729
34 lea edx,[ecx-01]
35 //Alt: db 7A 0A 8D 51 FF
取消敌人无敌状态

  CT文件一览:(下载时是分开的)

  

  新的修改器页面如下:

  version 1.99s

   

  version 1.99t

  

  顺便提一句,用了修改器我几个小时就通关了,还完成了不少成就(亲测至通过)

  


后续更新部分---------------【2021-01-29 更新】

  好了,我看到 Rabi-ribi 在 Steam 更新了,所以我也来小更新一波。我觉得也没什么,其中地址变了倒是挺麻烦的,大概就做了4个小时,就知道是什么机制了。这里面值得提及的是,如果遇到 [edi+ebx+00000460]这类地址,着重搜索 “+00000460],”字眼就好了。因为我发现里面的 edi ebx 都是可能变换的(下一版本可能是 edx esi 等等),找不变的地方才好找到原本代码。(好了,下载链接已经更新)

posted @ 2020-07-23 23:49  初等变换不改变矩阵的秩  阅读(6201)  评论(11编辑  收藏  举报