《乐活兔》详细教程
本帖最后由 lzc090 于 2019-5-1 08:40 编辑准备:
本游戏为coscos2dx引擎,将libMyGame.so直接丢进IDA进行分析,和IL2少了一部dump
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一.金币修改
1.直接搜索coin你会发现或者搜索DataManager所有需要的都可以找到
红线部分的DataManager::getCoin其实就是我们要修改的地方
看到DataManager也就知道数据管理,所有修改也是修改这里面的。
伪代码:
int __fastcall DataManager::getCoin(DataManager *this)
{
return *((_DWORD *)this + 10);
}
ARM:
DataManager::getCoin(void)
.text:0024E19A 80 6A LDR R0,
.text:0024E19C 70 47 BXLR
以前正常人看到会修改成这样
LDR R0, ; 正常看到马上会给他修改成MOV R0,#fffffff
但请看下图
.text:0024E19A 80 6A LDR R0,
.text:0024E19C 70 47 BX LR
会将 80 6A 70 47 修改成了 6F F0 70 41
你修改成MOVR0,#fffffff,是SIZE 4,你会吧BX LR也修改掉 最终造成游戏闪退而已
2.再说说我的修改出现的问题,怎么有负数或者正数
其实我一开始是将
.text:0024E19A 80 6A LDR R0,
修改成了
.text:0024E19A 00 A0 ADR R0, 0x24E19C
这方法也是是从别人那里看来的。
上面的两个是意思是:
LDR-将地址,RO #0x28的值放入R0
ADR-将0x24E19C地址放入R0
一个是具体数字,另一个是一个地址,是什么值就不知道了,就造成了部分正数,部分负数的问题(我模拟器测试是正数,手机就负数了)
我个人的修改方法:
将.text:0024E19A 80 6A LDR R0,
修改成了
.text:0024E19A FF 20 MOVS R0, #0xFF
也是SIZE 2,不过最大的数值也就255根本就不够花,因此我修改了另一个地方。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
二.金币修改2
修改方法1:
在上面coin的搜索中其实我们还搜索到了一个就是addcoin
ARM:
1.text:0024E1A0 82 6A LDR R2, 将R0,#0x28地址的值给R2
2.text:0024E1A0 11 44 ADD R1, R2 R1+R2
3.text:0024E1A2 81 62 STR R1, 将R1的值存入R0,#0x28的地址
4.text:0024E1A4 70 47 BX LR
伪代码: *(_DWORD *)(result + 40) += a2;
看到R0=R2=(_DWORD *)(result + 40)=当前总金币,R1=a2=增加的金币
那么我修改是这样的:
1.text:0024E19E 6F F0 70 41 MOV R1, #0xFFFFFFF 给R1给#0xFFFFFFF值
2.text:0024E1A2 81 62 STR R1, 将R1的值存入R0,#0x28地址 R0就是总金币
3.text:0024E1A4 70 47 BX LR
解释下:
MOV R1, #0xFFFFFFF 的进制---6F F0 70 41 SIZE 4
我直接将上面的代码的1=82 6A 、2=11 44替换成了MOV=6F F0 70 41 而已
就是将
1.text:0024E1A0 82 6A LDR R2, 将R0,#0x28地址的值给R2
2.text:0024E1A0 11 44 ADD R1, R2 R1+R2
替换成了:
1.text:0024E19E 6F F0 70 41 MOV R1, #0xFFFFFFF
替换后其实就是每次增加金币,将存入总金币不过不相加,是替换,因为+号删掉了。
修改方法2:
ARM:
1.text:0024E1A0 82 6A LDR R2, 将R0,#0x28地址的值给R2
2.text:0024E1A0 11 44 ADD R1, R2 R1+R2
3.text:0024E1A2 81 62 STR R1, 将R1的值存入R0,#0x28地址
4.text:0024E1A4 70 47 BX LR
伪代码: *(_DWORD *)(result + 40) += a2;
修改后:
ARM:
1.text:0024E1A0 82 6A LDR R2, 将R0,#0x28地址的值给R2
2.text:0024E1A0 51 43 MULS R1, R2 R1*R2
3.text:0024E1A2 81 62 STR R1, 将R1的值存入R0,#0x28的地址
4.text:0024E1A4 70 47 BX LR
伪代码: *(_DWORD *)(result + 40) *= a2;
获得的金币和本金相乘也是一个巨大的数值,也等于无限金币
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
三.星星修改
DataManager::addStar(int)
.text:0024E18A ; DATA XREF: LOAD:000046B0↑o ...
.text:0024E18A 42 6A LDR R2,
.text:0024E18C 11 44 ADD R1, R2
.text:0024E18E 41 62 STR R1,
.text:0024E190 70 47 BX LR
int __fastcall DataManager::addStar(int result, int a2)
{
*(_DWORD *)(result + 36) += a2;
return result;
}
方法和金币的修改方式也是一样的
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
四:体力修改
1.修改方式一
DataManager::decLife 体力扣除
.text:0024E11E A0 F1 01 00 SUB.W R0, R0, #1
改后:
text:0024E11E A0 F1 00 00 SUB.W R0, R0, #0
这样体力就不会扣除,等于无限体力
2.修改方式二
在修改体力扣除的同时,我们知道了总体力的位置,那么我们直接给总体力赋值5,不就也无限体力了
修改处1:
需要NOP几个比较麻烦
.text:0024E0A2 81 12 ASRS R1, R0, #0xA
.text:0024E0A4 01 EB D0 70 ADD.W R0, R1, R0,LSR#31
.text:0024E0A8 10 44 ADD R0, R2
.text:0024E0AA 05 28 CMP R0, #5
.text:0024E0AC B8 BF IT LT
.text:0024E0AE 05 46 MOVLT R5, R0
修改后:
.text:0024E0A200 BF NOP
.text:0024E0A4 00 F0 20 E3 NOP
.text:0024E0A8 10 44 MOVS R0, 4
.text:0024E0AA 05 28 CMP R0, #5
.text:0024E0AC B8 BF IT LT
.text:0024E0AE 05 46 MOVLT R5, R0
当体力不满时,赋予体力V8=R0=4直接给予到结果,修改够就是无限体力4
修改处2:修改跳转指令
1处:体力不满的判断 2处:体力满的判断 3处:结果
意思是当R1和R0的对比,当R1≥R0时直接跳到3处结果,当R1≤R0时,跳转到1处,判断体力是不是满
.text:0024E086 81 42 CMP R1, R0
.text:0024E088 12 DC BGT loc_24E0B0
修改成了:
.text:0024E086 81 42 CMP R1, R0
.text:0024E088 12 E0 B loc_24E0B0
意思是直接执行2处的体力是满的,将体力满数字5直接跳转到3处的结果
修改处3:也是最简单的方法
.text:0024E0B0 28 46 MOV R0, R5
修改后:
.text:0024E0B0 05 20 MOVS R0, #5
直接修改结果,不管上面的代码怎么运行,最后的结果直接给5
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
五:无限时间修改
游戏一开始有给予30分钟的时间,在这段时间中,使用的体力是不会减少的,现在告诉大家的就是修改无限时间
v1 = *((_DWORD *)this + 12); 这是总时间
return v1 - time(0); 这是总时间-当前时间=30分钟
那么我们就只需要将time(0)删除或者变成0就是无限时间了
.text:0024E308 00 20 MOVS R0, #0; timer ---------这是(0)
.text:0024E30A BB F7 3C ED BLX time----------------------这是time(只要把这句NOP就可以了)
修改之后就是return v1 - 0 其实就是return v1
BB F7 3C ED 修改成00BF 00BF
六.无限签到
不过好像没什么意义
看伪代码就知道这函数其实就是bool
只要将
.text:0024E1DA 00 21 MOVS R1, #0 v3 = 0;
的0修改成1,那么意思都是可签到状态
.text:0024E1DA 01 21 MOVS R1, #1 v3 = 1;
七.无限道具
.text:0024E17E 9A 1A SUBS R2, R3, R2
*(result + 4 * a2) -= a3; 现有道具数-使用数=剩下数
那么只需要将a3直接改成0,就是不消耗道具,等于无限道具了
修改后:
.text:0024E17E 1A 1E SUBS R2, R3, #0
破解加整理教程花费了点时间,希望对大家有帮助,有错的地方也请大家指教。 本帖最后由 kenorizon 于 2019-1-6 03:03 编辑
这个游戏不是使用 Unity3D 引擎制作的游戏,而是使用 cocos2d-x 引擎制作的游戏(特征是 lib 里面有一个 libMyGame.so 文件,脚本就在这个文件里面)
自然是找不到 Mono / il2cpp 的相关文件的。 这个游戏不是使用 Unity3D 引擎制作的游戏,而是使用 cocos2d-x 引擎制作的游戏(特征是 lib 里面有一个 libMyGame.so 文件,脚本就在这个文件里面)
自然是找不到 Mono / il2cpp 的相关文件的。 {:1_932:}{:1_932:}{:1_932:}{:1_932:}前排膜拜一下 膜拜一下 和大佬学习 kenorizon 发表于 2019-1-6 03:01
这个游戏不是使用 Unity3D 引擎制作的游戏,而是使用 cocos2d-x 引擎制作的游戏(特征是 lib 里面有一个 li ...
感谢指正,这游戏我把他丢进Android killer 反编译完,它提醒的是U3D游戏,所以我就认为了。 感谢几个小时的付出,学习大佬的知识 这个太牛了,看看去 谢谢分享,大佬分析给力