lzc090 发表于 2019-1-6 01:07

《乐活兔》详细教程

本帖最后由 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:01

本帖最后由 kenorizon 于 2019-1-6 03:03 编辑

这个游戏不是使用 Unity3D 引擎制作的游戏,而是使用 cocos2d-x 引擎制作的游戏(特征是 lib 里面有一个 libMyGame.so 文件,脚本就在这个文件里面)
自然是找不到 Mono / il2cpp 的相关文件的。

cxfzaysb 发表于 2019-1-6 08:41

这个游戏不是使用 Unity3D 引擎制作的游戏,而是使用 cocos2d-x 引擎制作的游戏(特征是 lib 里面有一个 libMyGame.so 文件,脚本就在这个文件里面)
自然是找不到 Mono / il2cpp 的相关文件的。

CrazyNut 发表于 2019-1-6 01:13

{:1_932:}{:1_932:}{:1_932:}{:1_932:}前排膜拜一下

trombe108 发表于 2019-1-6 01:17

膜拜一下

1676TKMS 发表于 2019-1-6 08:01

和大佬学习

lzc090 发表于 2019-1-6 08:49

kenorizon 发表于 2019-1-6 03:01
这个游戏不是使用 Unity3D 引擎制作的游戏,而是使用 cocos2d-x 引擎制作的游戏(特征是 lib 里面有一个 li ...

感谢指正,这游戏我把他丢进Android killer 反编译完,它提醒的是U3D游戏,所以我就认为了。

ci4y0nWF 发表于 2019-1-6 09:13

感谢几个小时的付出,学习大佬的知识

罗茂松 发表于 2019-1-6 09:27

这个太牛了,看看去

chen1234 发表于 2019-1-6 09:39

谢谢分享,大佬分析给力
页: [1] 2 3 4 5 6 7 8
查看完整版本: 《乐活兔》详细教程