安卓逆向系列教程 4.3 登山赛车内购破解
来源:互联网 发布:sybase数据库 for循环 编辑:程序博客网 时间:2024/06/10 09:19
4.3 登山赛车内购破解
作者:飞龙
首先在这里下载游戏:http://g.10086.cn/game/760000032287?spm=www.pdindex.android.addjgame.1
我们要破解的东西是这个,获得金币:
点击之后会有个弹出框,我们随便输入一些东西,然后点击“确认支付”:
出现了“短信验证码验证失败”的Toast
。
好,信息收集完毕,将程序拉进 Android Killer:
搜索“验证失败”四个字,我们可以找到刚才的内容:
我们发现它在strings.xml
里面,它的名称是gc_security_sms_err
。老方法,搜索这个名称:
我们在public.xml
中发现了它的 ID,0x7f0700a1
。我们搜索这个值。
然后就没下文了。我们没有找到任何使用这个值的地方。只能从其它方面入手。
我们从前面可以得知,付费用的是移动的接口,我们搜索onresult
,这是移动支付 API 的关键字(问我怎么知道的,这个 API 是有开发者文档的,大家可以搜索一下):
一下子就出现了,ChinaBillingPayCallback$1
。下面就是要好好分析这个类
这个类只有一个onResult
方法,也就是说只是一个闭包,而且也没有什么特别有用的信息:
public void onResult(int paramInt, String paramString, Object paramObject){ int i = paramInt; BillingResult localBillingResult = new BillingResult(); localBillingResult.setResultCode(i); localBillingResult.setBillingIndex(this.val$billingIndex); localBillingResult.setReturningObject(paramObject); localBillingResult.setCode(paramString); Log.i("MySDK Billing Java", "CMCC object toString(): " + paramObject.toString()); Log.i("MySDK Billing Java", "CMCC result: " + localBillingResult.toJSON()); this.this$0.launchResultReceived(localBillingResult);}
反正我是没看出来。再看一看,这个类所在的包是com.mygamez.common
,而软件的包是con.fingersoft.game
,等于说这个类是别人的 API,当然没有业务逻辑。
我们换个方式,搜索Billing
:
除了底下的两个资源类,有三个游戏包中的类出现了Billing
。第一个类是一个Applicaion
,只有如下代码:
public void onCreate(){ MyBilling.applicationHeater(this);}
再看看MainActivity$1
,它也是一个闭包,只有onChinaBillingResult
方法,这就非常重要了。由于它的 java 反编译结果不可读,我们直接看 Smali:
invoke-virtual {p1}, Lcom/mygamez/billing/BillingResult;->getResultCode()Imove-result v2packed-switch v2, :pswitch_data_0...
开头有这么一段代码,我们跳到:pswitch_data_0
处:
:pswitch_data_0.packed-switch 0x1 :pswitch_0 :pswitch_1.end packed-switch
由于判断的是某个 API 的返回代码,按照惯例,0
是正常,其余是异常。我们可以跳到:pswitch_1
分支:
:pswitch_1iget-object v2, p0, Lcom/fingersoft/game/MainActivity$1;->this$0:Lcom/fingersoft/game/MainActivity;invoke-virtual {v2}, Lcom/fingersoft/game/MainActivity;->getApplicationContext()Landroid/content/Context;move-result-object v2const-string v3, "\u4ed8\u6b3e\u5931\u8d25"const/4 v4, 0x1invoke-static {v2, v3, v4}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;move-result-object v1.line 301.local v1, "toast":Landroid/widget/Toast;invoke-virtual {v1}, Landroid/widget/Toast;->show()Vgoto :goto_0
那个字符串是“付款失败”,这么多代码其实就是Toast.makeText(this.this$0.getApplicationContext(), "付款失败", 1).show()
。这应该就是异常分支了。
至于接下来的修改,这个方法第二行move-result v2
,改成const v2, 0x0
,完事。
写到这里其实还有一个问题,就是代码中的字符串和实际实现的对不上。这个我也不知道为什么,但是既然有这种情况,就要想别的方法。
- 安卓逆向系列教程 4.3 登山赛车内购破解
- 安卓逆向系列教程 4.9 破解内购 II
- 飞龙的安卓逆向系列教程
- 安卓逆向系列教程 4.4 逆向云播 VIP
- 安卓逆向系列教程(一)Dalvik 指令集
- 安卓逆向系列教程(二)APK 和 DEX
- 安卓逆向系列教程(三)静态分析工具
- 安卓逆向系列教程 4.1 字符串资源
- 安卓逆向系列教程 4.2 分析锁机软件
- 安卓逆向系列教程 4.5 糖果星星达人
- 安卓逆向系列教程 4.6 去广告
- 安卓逆向系列教程 4.7 修改游戏金币
- 安卓逆向系列教程 4.8 去广告 II
- 安卓逆向系列教程 4.13 MagSearch 1.8 爆破
- 安卓逆向系列教程 4.10 玄奥八字
- 安卓逆向系列教程 4.11 优酷 APK 去广告
- 安卓使用教程:(八门神器)破解游戏内购方法及原理
- 吾爱破解安卓逆向入门教程
- platform设备驱动
- shell环境,执行*.py 提示 No such file or directory
- Springboot+Jpa
- 浅谈CPU 指令 内存 硬盘间的关系
- C
- 安卓逆向系列教程 4.3 登山赛车内购破解
- Redis底层数据结构之简单动态字符串
- C#中foreach的实现原理
- 计算机组成原理之汉明码
- 使用js代码制作H5页面的底部滑动面板。
- 递推递归专题总结
- LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- Linux的RCU锁机制
- 模仿qsort() 实现一个通用排序函数:msort()