本帖最后由 Sarkozy 于 2014-11-22 19:28 编辑
跟着上一节:
【Android逆向教程】Unity3D付费逆向思路+实例(1)
http://www.pd521.com/forum.php?mod=viewthread&tid=56&fromuid=18
我们发现了唯一一个方法,点进去以后代码如下:
在阅读代码的过程中会发现,这里也没有任何判断,难道又找错了?你们觉得可能吗?
大家注意到这样一行代码了吗?
this.onBillFinish(pair.Value);有一个onbillfinish,我们点进去即得到如下代码:
这里我们终于找到判断了,如果这些代码是什么意思呢,待我花个十分钟百度一下····
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,如图所示:
http://img.blog.csdn.net/20140912105344062?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvU2Fya296eTIwMTQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
结合上面我们看到的代码,我们可以初步判断出 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中的支付验证模式。
|