475905793 发表于 2013-5-6 07:45

记一次安卓游戏破解(分析代码全过程)

本帖最后由 淡然出尘 于 2015-2-3 19:23 编辑

关于安卓破解思路分析贴
转帖地址http://bbs.pediy.com/showthread.php?t=170132
起因:CatWar2,钻石不够,而且用八门神器修改之后,钻石数会自动清0
http://bbs.pediy.com/attachment.php?attachmentid=78363&thumb=1&d=1366459108

线索:
http://bbs.pediy.com/attachment.php?attachmentid=78364&thumb=1&d=1366459108

顺藤摸瓜,搜索bg_sysmsg

http://bbs.pediy.com/attachment.php?attachmentid=78365&thumb=1&d=1366459108

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

引用:
.so 文件是动态链接库文件,相当于 win下的 .dll 文件

于是操起IDA,ALT+T搜索bg_sysmsg

http://bbs.pediy.com/attachment.php?attachmentid=78367&thumb=1&d=1366460086

经过一番观察,根据函数名,来到了
引用:
ShopScene2::init(void)

出现在初始化里,然后在函数列表里找到ShopScene2::ShowSysMsg(int)。
引用:
.text:000E864A               MOVS    R0, 0x3F800000
.text:000E864E               BL      _ZN7cocos2d11CCDelayTime18actionWithDurationEf ; cocos2d::CCDelayTime::actionWithDuration(float)

用了延迟,第一张图的提示,也是显示一段时间就消失了了。猜测就是调用这个函数,显示信息。

再次查找引用
http://bbs.pediy.com/attachment.php?attachmentid=78368&thumb=1&d=1366460637

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

引用:
BL      _ZN12WRIntEncrypt3GetEv ; WRIntEncrypt::Get(void)

看一下这个类的所有函数,目测就是要找的了。
http://bbs.pediy.com/attachment.php?attachmentid=78369&thumb=1&d=1366460819

来到构造函数:
(PS:R0是this指针)
引用:
.text:000F1260               PUSH    {R4-R6,LR}
.text:000F1262               MOVS    R5, #0
.text:000F1264               STR   R5,
.text:000F1266               MOVS    R4, R0
.text:000F1268               BLX   lrand48
.text:000F126C               STR   R5,
.text:000F126E               STR   R0,
.text:000F1270               BLX   lrand48
.text:000F1274               STR   R0,
.text:000F1276               STR   R5,
.text:000F1278               MOVS    R0, R4
.text:000F127A               POP   {R4-R6,PC}

确定这个类成员有5个,初始化之后
+0   0
+4   随机数1
+8   0
+c   随机数2
+100

再看WRIntEncrypt::Set(int)
(PS:R1是参数,就是要设置的数值)
引用:
.text:000F1118               LDR   R3,
.text:000F111A               STR   R1,
.text:000F111C               EORS    R3, R1
.text:000F111E               STR   R3,
.text:000F1120               LDR   R3,
.text:000F1122               EORS    R1, R3
.text:000F1124               STR   R1,
.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,
.text:000F1210               LDR   R2,
.text:000F1212               LDR   R1,
.text:000F1214               MOVS    R4, R0
.text:000F1216               EORS    R2, R3
.text:000F1218               LDR   R3,
.text:000F121A               EORS    R3, R1
.text:000F121C               LDR   R1,
.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都不变。


http://bbs.pediy.com/attachment.php?attachmentid=78371&thumb=1&d=1366462198
http://bbs.pediy.com/attachment.php?attachmentid=78372&thumb=1&d=1366462198
http://bbs.pediy.com/attachment.php?attachmentid=78373&thumb=1&d=1366462275

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





流浪的猫眼石 发表于 2013-5-6 08:22

牛叉~~ 要是能提供详细的破解视频 多好啊 期待楼主奉献

chengshen33 发表于 2013-5-6 09:16

很好,长见识了,一直不晓得安卓的是怎么破解的~

altTab 发表于 2013-5-6 19:47

安卓平台的果断不懂。。

jdjr 发表于 2013-5-6 22:21

android上的也这么复杂啊?

xiix 发表于 2013-5-8 08:03

天文。。。看不懂,还得慢慢跟着你学

Janekingson 发表于 2013-6-5 17:14

看起来不错

小煮煮 发表于 2013-7-12 03:06

网游的怎么破解呢

zhangxiang5306 发表于 2013-7-12 06:54

八门神器一向牛叉

eagle021 发表于 2013-7-17 17:43

看不懂,还得慢慢跟着你学
页: [1] 2
查看完整版本: 记一次安卓游戏破解(分析代码全过程)