逆向教程->游戏中的U3D付费模式分析

来源:互联网 发布:淘宝网2017女装秋装 编辑:程序博客网 时间:2024/05/22 15:34

转载请把我博客地址带上:http://blog.csdn.net/sarkozy2014。么么哒

今天xx游戏的时候发现一款在U3D中的支付验证

原软件地址:http://www.yxdown.com/shouji/82887.html

工具:apkide、reflector

开始了:


从smali文件夹中发现了一个MM文件夹,这是典型的移动支付接口。遇到这个直接搜onbillingfinish即可,搜索结果如下图:


箭头所指为本次搜索结果中唯一一个method。我们来查看他的java源码:


方框中我们看到了,这个onbillingfinish没有任何的判断,难道我们找错了吗?可是这个onbillingfinish就这一个方法啊!仔细看图中红色方框处,发现了一行命令:

sendMsgToUnity("onBillingFinish", arrayOfString);

也就是最后执行了这一行命令,根据命令的简单翻译,可得出这是一个像unity发送信息的命令。

翻译为smali代码就是这样:

aput-object v3, v1, v2

invoke-virtual {p0, v0, v1}, Lcom/juxiang/game01/mmIAPListener;->sendMsgToUnity(Ljava/lang/String;[Ljava/lang/String;)V

接下来,我们要用到reflector这个工具了。用这个工具打开assembly-csharp文件【不会的请查阅本博客中伊甸分析教程】,如图所示:


同样的,既然是移动的支付接口,上文中有说道,目前的MM接口支付判断就是在onbillingfinish,按下F3搜索,记得切换到方法搜索,如图所示:


我们发现了唯一一个方法,点进去以后代码如下:

private string arg){    Log(arg);    int, string, Parse(arg);    this.onBillFinish(pair.Value);}

private string arg){    Log(arg);    int, string, Parse(arg);    this.onBillFinish(pair.Value
在阅读代码的过程中会发现,这里也没有任何判断,难道又找错了?你们觉得可能吗?

大家注意到这样一行代码了吗?

this.onBillFinish(pair.Value);
有一个onbillfinish,我们点进去即得到如下代码:

public int code, string, string mmPaycode = map["Paycode"];    getPaycode(mmPaycode);    if (code == 0x66)    {        Instance.iapAPI.onBillFinish(false, code2);    }}
这里我们终于找到判断了,如果这些代码是什么意思呢,待我花个十分钟百度一下····

public int code, string, string mmPaycode = map["Paycode"];  //定义mmpaycode从map的paycode中获取,大概就是获取订单号的意思    getPaycode(mmPaycode);  //这是是将订单ID入读给code2    if (code == 0x66)  //从提交进来的参数int code中判断    {        Instance.iapAPI.onBillFinish(false, code2);  //如果code<>102就跳到不成功也就是本行代码    }}
我们怎么修改呢?老方法,打开tools-reflexilv1.6,如图所示:


结合上面我们看到的代码,我们可以初步判断出

23 bne.un ->(16)call iapAPI iapAPI::get_instance()   //如果不等于则跳到16行(最左边表示代码行数)

这是跳转的,同样下面的:

40 br ->(20)ret  //否则就跳到20行处

根据上面两行代码我们可以判断出来以下信息:

ldarg.1 //表示的是获取改方法的第一个参数也就是int code

ldc.i4.s//表示102也就是待比较的值。

那我们修改成这样既可

23 beq ->(16)call iapAPI iapAPI::get_instance()   //如果等于则跳到16行(最左边表示代码行数)

因为内购游戏都是支付失败的,所以code与102比较也就永远不会相等,那么只要有购买信息,他都返回成功

然后点击assembly-csharp右键-reflexilv1.6-save as 选择原来导入的文件覆盖既可。

最后:去内购重点的不扣费!,在smali中搜索《"1》书名号内的内购,将1开头的8位数以上的号码全部改为0000000(订单号除外)

小结:本节主要介绍一下unity3d中的支付验证模式。

                                                                                                                                                               2014.09.12 Sarkozy

0 0
原创粉丝点击