同TTX更可爱的层次分析法游戏破解
最近的工作太忙,没啥时间写文章,今天遇到一点点的游戏,浅析。以中午的优势写这篇文章。
移动MM的游戏。前面我们已经写过非常多文章,没有看过的朋友,自行查找就可以,今天我们继续分析一个类似的游戏,只是使用多种方式来分析,同一时候。欢迎同学们自己补充新方式来扩展思路。
0x1:游戏试玩
打开游戏玩了会儿。近期这类游戏许多,也谈不上喜欢玩不喜欢玩。那么直接查看商城吧。
配合查看游戏反编译的文件夹结构:
能够简单推測游戏的内购是否为移动MM的。
然后配合我们自己简单查看下smali代码,确定内购支付方式为移动MM .
0x2:分析破解
确定了游戏的支付方式。我们就有目的性的去分析怎样来分析它的破解情况了。
在这里再次补充上:
移动MM的支付方式以及SDK的相关调用方法
http://wenku.it168.com/d_001271444.shtm
通过了解它的支付流程。来測试他在哪块地方存在被破解的可能,即欺骗支付。
在这篇文章中,已经有简单说明了,这里便不再反复:
http://www.52pojie.cn/thread-259909-1-1.html
然后。我们能够想到:
①.我们直接改动支付结果。用支付成功的方法替换支付失败
②.直接将推断支付是否成功的状态码锁定为支付成功
③.直接改动游戏金币
④.改动支付短信
0x3:第一种支付方式破解
还是上面说的。直接搜索寻找onBillingFinish。
这里所说依照第一种方式,有点牵强,只是,支付失败的话,这里的code也将改变,我们让他走订购成功的方法。即改动方法内的那个推断语句。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3VpZ3V6aTExMTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
相应smali代码自行改动就可以。
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。即代表支付成功。
我们保存改动。回编译。查看到,点击购买button。直接提示下图:
在无卡模式下測试的,一切正常。所以肯定了我们的改动时正确的,也不会扣费。
0x5:直接改动金币
通过OnBillingFinish()方法
我们进入到这个PopStar查看:
当然。这个类里面还有非常多方法,非常多支持破解的方法。如:
定义购买金币数量的,即购买成功后添加的数量。等等。。。
长话短说,咱们看到PopStar.nativeAddCoin方法后,确定是一个native方法,那么我们找到上文
System.loadLibrary("xinxin");
用IDA载入libxinxin.so,然后定位到nativeAddCoin方法.
如今大家多数用的大佬的那个IDA,带F5的,那么我们直接f5
查看到这里的方法,useGameCoin方法。打开这种方法查看:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3VpZ3V6aTExMTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
这里有我加的凝视,非常清晰的,看不明确的,F5一下也就知道了。
由于getIntegerForKey,返回值为R0。然后往下第二行代码,R0=R0+R6,所以我们关键是在这里改动R0,即金币数量
Hex查看一下二进制。这里为Thumb指令,那么我们能够操作局限性也非常高了。
所以。这里提供一个思路。大家能够寻找更加简便的方法。
即。BL getIntegerForKey,我们直接复制R0一个数值。然后在以下Adds R0,R0,R6这里,直接对R0逻辑左移一下。即LSL一下,将其数值变大。
由于第一个BL是4个字节,我们直接改动 00 00 09 20 。即Movs R0,R0 代表没有不论什么操作,09 20是将数字9赋值给R0
然后ADDs那一行,有两个字节。直接改为 00 04,即 LSLS R0,R0,#0x10
这样,我们即完毕了对金币数量的赋值。例如以下图:
然后,我们在16进制下改动,选用010Editor或UE,ctrl + g。进行地址跳转,寻找到我们在IDA改动的地址。依照上文改动。保存,替换,回编译。
凝视::
这里须要说明的是。这种方法何时被调用,即才干激活我们对金币的赋值呢?
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3VpZ3V6aTExMTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
直接在IDA里面对这种方法按下x键,查看调用,有5处。那么应该非常easy被激活。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3VpZ3V6aTExMTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
红色标注的,是使用金币的道具。依照我们看到方法被调用的地方。这里被调用了。然后金币数量即我们定义的。
0x6:改动短信
这里不多说了,依据系统发送短信函数进行查找改动,替换短信内容,替换短信发送人就可以。
我直接使用hook的方式替换的,比較省事了。。
相关代码不难。看完我前面几篇hook java的文章的同学。应该非常easy可以写出来代码。这里不再多写。有兴趣,自己动手去。
文档和相关附件:
http://pan.baidu.com/s/1kTLwwDL
同TTX更可爱的层次分析法游戏破解的更多相关文章
- 从Elo Rating System谈到层次分析法
1. Elo Rating System Elo Rating System对于很多人来说比较陌生,根据wikipedia上的解释:Elo评分系统是一种用于计算对抗比赛(例如象棋对弈)中对手双方技能水 ...
- 层次分析法、模糊综合评测法实例分析(涵盖各个过程讲解、原创实例示范、MATLAB源码公布)
目录 一.先定个小目标 二.层次分析法部分 2.1 思路总括 2.2 构造两两比较矩阵 2.3 权重计算方法 2.3.1 算术平均法求权重 2.3.2 几何平均法求权重 2.3.3 特征值法求权重 2 ...
- 层次分析法(Analytic Hierarchy Process,AHP)
昨天晚上室友问我什么是层次分析法?我当时就大概给他介绍了一下,没有细讲. 今天我仔细讲讲这个. 层次分析法是运筹学里面的一种方法,是讲与决策总是有关的元素分解成目标.准则.方案等层次,在此基础上进行定 ...
- Maths | 层次分析法(Analytic Hierarchy Process)
目录 1. 概述 2. AHP算法 2.1. 建立层级 2.2. 构造 成对 比较 矩阵 2.3. 成对比较矩阵的 一致性检验 与 层次单排序 2.4. 层次总排序 参考: (中文)https://z ...
- ahp层次分析法软件
http://www.jz5u.com/Soft/trade/Other/58808.html 权重计算 归一化 本组当前数 - 本组最小 / 本组最大-本组最小 http://blog.csdn.n ...
- 层次分析法MATLAB
输入成对比较矩阵,输出权重值和一致性检验结果. disp('请输入判断矩阵A(n阶)'); A=input('A='); [n,n]=size(A); x=ones(n,100); y=ones(n, ...
- matlab-层次分析法
层次分析法(AHP)是把问题条理化.层次化,构造出一个有层次的结构模型的方法. 比如要选择旅游地,有3个选择方案,苏杭.北戴河和桂林.选择过程需要考虑多个因素,比如景色.费用.居住.饮食和旅途. 1. ...
- 2017人生总结(MECE分析法)
试着用MECE分析法对人生的整个规划做一下总结.作为技术人员,其实除了编码架构能力之外,分析问题的能力的重要程度也会随着职业发展越来越重要.<美团点评技术博客>说这几天要在黄金时段头版头条 ...
- MECE分析法(Mutually Exclusive Collectively Exhaustive)
什么是MECE分析法? MECE,是Mutually Exclusive Collectively Exhaustive,中文意思是“相互独立,完全穷尽”. 也就是对于一个重大的议题,能够做到不重叠. ...
随机推荐
- C#值传递和按引用传递
知识点: 值类型和引用类型 为值类型,,据 对于引用类型来说,栈中存储的是堆中对象的地址 值传递和引用传递 对于值传递,传递的是栈中保存的数据 对于引用传递.传递的是栈本 ...
- NSIS:判断程序是否运行并进行卸载
原文NSIS:判断程序是否运行并进行卸载 今天在评论里看到网友说要一个这样的功能,就简单写了一个,本来想做360杀手来着,但遗憾的是我从来不用360的东西,所在电脑上也没有360相关的软件进行测试,所 ...
- HDInsight HBase概观
HDInsight HBase概观 什么是HBase的? HBase它是基于HadoopApache开源NoSQL数据库.它提供了很多非结构化和半结构化数据一致性的随机存取能力的.它是仿照谷歌的Big ...
- NET MVC
NET MVC 1.为 Action 标注 Attribute 限制访问 public class HomeController : Controller { [HttpPost] public Ac ...
- Object-c中间initialize 与 辛格尔顿
简单说下initialize任务.在初始化过程中同样的类将被调用一次. 直接在代码解释initialize任务. 创建一个InitTest类 InitTest.m #import "Init ...
- ASP.NET MVC — 第 4 天
ASP.NET MVC — 第 4 天 目录 第 1 天 第 2 天 第 3 天 第 4 天 第 5 天 第 6 天 第 7 天 0. 前言 欢迎来到第四天的 MVC 系列学习中.如果你直接开始学习今 ...
- CentOS 7 下安装 LEMP 服务(nginx、MariaDB/MySQL 和 php)
原文 CentOS 7 下安装 LEMP 服务(nginx.MariaDB/MySQL 和 php) LEMP 组合包是一款日益流行的网站服务组合软件包,在许多生产环境中的核心网站服务上起着强有力的作 ...
- hdu 4445 Crazy Tank (暴力枚举)
Crazy Tank Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【超酷超实用】CSS3可滑动跳转的分页插件制作教程
原文:[超酷超实用]CSS3可滑动跳转的分页插件制作教程 今天我要向大家分享一款很特别的CSS3分页插件,这款分页插件不仅可以点击分页按钮来实现分页,而且可以滑动滑杆来实现任意页面的跳转,看看都非常酷 ...
- WeakReference and WeakHashMap
弱引用通过WeakReference类实现,弱引用和软引用很像,但弱引用的引用级别更低.对于只有弱引用的对象而言,当系统垃圾回收机制运行时,不管系统北村是否足够,总会回收该对象所占用的内存.当然,并不 ...