欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

记一次安卓游戏破解

程序员文章站 2022-04-22 10:52:37
需要的工具:IDA,APK改之理,八门神器 起因:CatWar2,钻石不够,而且用八门神器修改之后,钻石数会自动清0   线索:   顺藤摸瓜,搜索bg_sy...

需要的工具:IDA,APK改之理,八门神器


起因:CatWar2,钻石不够,而且用八门神器修改之后,钻石数会自动清0
 记一次安卓游戏破解

线索:
 记一次安卓游戏破解

顺藤摸瓜,搜索bg_sysmsg

 记一次安卓游戏破解

发现其被引用于libhelloworld.so文件中

引用:
.so 文件是动态链接库文件,相当于 win下的 .dll 文件
于是操起IDA,ALT+T搜索bg_sysmsg

 记一次安卓游戏破解

经过一番观察,根据函数名,来到了
引用:
ShopScene2::init(void)
出现在初始化里,然后在函数列表里找到ShopScene2::ShowSysMsg(int)。
引用:
.text:000E864A                 MOVS    R0, 0x3F800000
.text:000E864E                 BL      _ZN7cocos2d11CCDelayTime18actionWithDurationEf ; cocos2d::CCDelayTime::actionWithDuration(float)
用了延迟,第一张图的提示,也是显示一段时间就消失了了。猜测就是调用这个函数,显示信息。

再次查找引用
 记一次安卓游戏破解

进入第一个函数,这个函数引用了一个很可疑的函数:WRIntEncrypt::Get(void)

引用:
BL      _ZN12WRIntEncrypt3GetEv ; WRIntEncrypt::Get(void)
看一下这个类的所有函数,目测就是要找的了。
 记一次安卓游戏破解

来到构造函数:
(PS:R0是this指针)
引用:
.text:000F1260                 PUSH    {R4-R6,LR}
.text:000F1262                 MOVS    R5, #0
.text:000F1264                 STR     R5, [R0]
.text:000F1266                 MOVS    R4, R0
.text:000F1268                 BLX     lrand48
.text:000F126C                 STR     R5, [R4,#8]
.text:000F126E                 STR     R0, [R4,#4]
.text:000F1270                 BLX     lrand48
.text:000F1274                 STR     R0, [R4,#0xC]
.text:000F1276                 STR     R5, [R4,#0x10]
.text:000F1278                 MOVS    R0, R4
.text:000F127A                 POP     {R4-R6,PC}
确定这个类成员有5个,初始化之后
+0     0
+4     随机数1
+8     0
+c     随机数2
+10  0

再看WRIntEncrypt::Set(int)
(PS:R1是参数,就是要设置的数值)
引用:
.text:000F1118                 LDR     R3, [R0,#4]
.text:000F111A                 STR     R1, [R0,#0x10]
.text:000F111C                 EORS    R3, R1
.text:000F111E                 STR     R3, [R0]
.text:000F1120                 LDR     R3, [R0,#0xC]
.text:000F1122                 EORS    R1, R3
.text:000F1124                 STR     R1, [R0,#8]
.text:000F1126                 BX      LR
从这里就看到
+0     未加密值 异或 随机数1
+4     随机数1
+8     未加密值 异或 随机数2
+c     随机数2
+10  未加密值

struct EncryptInt
{
  int eint1;//加密数值
  int key1;//随机密钥
  int eint2;//加密数值
  int key2;//随机密钥
  int realint;//原始数值
};

也就是说,游戏保存了三份数据,二份是加密过,一次是未加密的。

再看看WRIntEncrypt::Get(void)
引用:
.text:000F120C                 PUSH    {R4,LR}
.text:000F120E                 LDR     R3, [R0,#EncryptInt]
.text:000F1210                 LDR     R2, [R0,#EncryptInt.key1]
.text:000F1212                 LDR     R1, [R0,#EncryptInt.key2]
.text:000F1214                 MOVS    R4, R0
.text:000F1216                 EORS    R2, R3
.text:000F1218                 LDR     R3, [R0,#EncryptInt.eint2]
.text:000F121A                 EORS    R3, R1
.text:000F121C                 LDR     R1, [R0,#EncryptInt.realint]
.text:000F121E                 MOVS    R0, #1
.text:000F1220                 CMP     R3, R1
.text:000F1222                 BEQ     loc_F123C
.text:000F1224                 CMP     R2, R3
.text:000F1226                 BEQ     loc_F1246
.text:000F1228
.text:000F1228 loc_F1228                               ; CODE XREF: WRIntEncrypt::Get(void)+38j
.text:000F1228                                         ; WRIntEncrypt::Get(void)+3Ej
.text:000F1228                 MOVS    R0, R4
.text:000F122A                 BL      _ZN12WRIntEncrypt8CheatingEv ; WRIntEncrypt::Cheating(void)
与加密的数值做了比较,不相等就进入作弊处理WRIntEncrypt::Cheating(void)

知道了加密怎么处理,就很容易了。回到手机,八门神器定位到realint

struct EncryptInt
{
  int eint1;
  int key1;
  int eint2;
  int key2;
  int realint;
};

然后eint1,eint2,realint都改为0xFFFFFF,key1,key2清零。任何数值异或0都不变。

 记一次安卓游戏破解
记一次安卓游戏破解
记一次安卓游戏破解

 
 

不会APKDIY,只能先这样了。最后发现,钻石退出以后,重新进入游戏会清0.可能还有别的地方有验证。不过修改完钻石,把英雄升级之后,基本就无敌了。也算是够用了。