吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 11498|回复: 15
收起左侧

[Android 原创] 以TTX连萌来多层次分析游戏破解

  [复制链接]
听鬼哥说故事 发表于 2014-10-29 13:57
本帖最后由 淡然出尘 于 2015-2-3 18:39 编辑

最近工作太忙,没啥时间写文章,刚好今天遇到一个小游戏,简单分析下,趁着中午的时间写下此文。
移动MM的游戏,前面我们已经写过很多文章,没有看过的朋友,自行查找即可,今天我们继续分析一个类似的游戏,不过使用多种方式来分析,同时,欢迎同学们自己补充新方式来扩展思路。

0x1:游戏试玩
打开游戏玩了会儿,最近这类游戏非常多,也谈不上喜欢玩不喜欢玩,那么直接查看商城吧。

图片1.png


配合查看游戏反编译的目录结构:

图片2.png



可以简单猜测游戏的内购是否为移动MM的。
然后配合我们自己简单查看下smali代码,确定内购支付方式为移动MM .

0x2:分析破解



确定了游戏的支付方式,我们就有目的性的去分析如何来分析它的破解情况了。

在这里再次补充上:

移动MM的支付方式以及SDK的相关调用方法
http://wenku.it168.com/d_001271444.shtm
通过了解它的支付流程,来测试他在哪块地方存在被破解的可能,即欺骗支付。

在这篇文章中,已经有简单说明了,这里便不再重复:

然后,我们可以想到:
.我们直接修改支付结果,用支付成功的方法替换支付失败
.直接将判断支付是否成功的状态码锁定为支付成功
.直接修改游戏金币
.修改支付短信


0x3:第一种支付方式破解



还是上面说的,直接搜索寻找onBillingFinish。
这里所说按照第一种方式,有点牵强,不过,支付失败的话,这里的code也将改变,我们让他走订购成功的方法,即修改方法内的那个判断语句。
图片3.png


0x4:第二种锁定状态码破解

我们在追踪onBillingFinish方法上下文的时候,发现PurchaseCode.smali中的getStatusCode()I方法以及MessageInfo.smali中的getPurchasecode()I方法,应该是用于定义支付码状态,即支付成功,支付失败,取消支付的。
PurchaseCode.smali文件中,我们发现:
.field public static final WEAK_ORDER_OK:I = 0x3e9
这个是定义支付订单成功的状态码。一般在移动MM里面,多数都是这个。
所以,我们可以看到上面所说getStatusCode()I方法和getPurchasecode()I方法都是返回值为int类型的,那么我们直接将其返回值修改为0x3e9,即数字1001,即代表支付成功。
我们保存修改,回编译,查看到,点击购买按钮,直接提示下图:

图片4.png


在无卡模式下测试的,一切正常,所以肯定了我们的修改时正确的,也不会扣费。


0x5:直接修改金币

通过OnBillingFinish()方法


图片5.png


我们进入到这个PopStar查看:


图片6.png


当然,这个类里面还有很多方法,很多支持破解的方法,如:

图片7.png



定义购买金币数量的,即购买成功后增加的数量。等等。。。
长话短说,咱们看到PopStar.nativeAddCoin方法后,确定是一个native方法,那么我们找到上文System.loadLibrary("xinxin");
IDA加载libxinxin.so,然后定位到nativeAddCoin方法.
现在大家多数用的大佬的那个IDA,带F5的,那么我们直接f5


图片8.png



查看到这里的方法,useGameCoin方法。打开这个方法查看:


图片9.png



这里有我加的注释,很清晰的,看不明白的,F5一下也就知道了。
因为getIntegerForKey,返回值为R0,然后往下第二行代码,R0=R0+R6,所以我们关键是在这里修改R0,即金币数量
Hex查看一下二进制,这里为Thumb指令,那么我们可以操作局限性也很高了。

所以,这里提供一个思路,大家可以寻找更加简便的方法。
即,BL getIntegerForKey,我们直接复制R0一个数值,然后在下面Adds R0,R0,R6这里,直接对R0逻辑左移一下,即LSL一下,将其数值变大。
因为第一个BL4个字节,我们直接修改 00 00 09 20 ,即Movs R0,R0 代表没有任何操作,09 20是将数字9赋值给R0
然后ADDs那一行,有两个字节,直接改为 00 04,即 LSLS R0R0#0x10
这样,我们即完成了对金币数量的赋值,如下图:



图片10.png


然后,我们在16进制下修改,选用010EditorUEctrl + g,进行地址跳转,寻找到我们在IDA修改的地址,按照上文修改,保存,替换,回编译。
这里需要说明的是,这个方法何时被调用,即才能激活我们对金币的赋值呢?

图片11.png


直接在IDA里面对这个方法按下x键,查看调用,有5处。那么应该很容易被激活。


图片12.png



红色标注的,是使用金币的道具,按照我们看到方法被调用的地方,这里被调用了,然后金币数量即我们定义的。


0x6:修改短信


这里不多说了,根据系统发送短信函数进行查找修改,替换短信内容,替换短信发送人即可。
我直接使用hook的方式替换的,比较省事了。。

相关代码不难,看完我前面几篇hook java的文章的同学,应该很容易能够写出来代码,这里不再多写,有兴趣,自己动手去。

文档和相关附件:

http://pan.baidu.com/s/1kTLwwDL






免费评分

参与人数 3热心值 +3 收起 理由
统列 + 1 谢谢@Thanks!
阿萨德22 + 1 支持技术贴!
yousss + 1 送个评分,谢谢分享

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 听鬼哥说故事 发表于 2014-10-29 14:51
有朋友私聊问金币数值的计算:

                int a=9;
               
                a=a<<0x10;
               
                System.out.println("a-->"+a);

简单计算一下即可589824,即游戏金币锁定589824

gmh5225 发表于 2014-10-29 14:20
我必须_说谎 发表于 2014-10-29 14:21
wangzh 发表于 2014-10-29 14:32
支持鬼哥~!好文章
头像被屏蔽
yyz219 发表于 2014-10-29 14:44
提示: 作者被禁止或删除 内容自动屏蔽
katkat 发表于 2014-10-29 18:08
果然是大神,分析的很不错,支持。
L-DINK 发表于 2014-10-30 17:21 来自手机
一头雾水。。还要慢慢积累啊。
墨色点滴 发表于 2014-10-30 17:58 来自手机
个人还是喜欢直接改安装包。
战神坤坤 发表于 2014-11-1 08:46
没视频看的不是很清楚,不过还是很支持鬼哥
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-1 04:01

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表