| {:5_117:}大家好,我是七少月,好像还没有什么有关逆向,有质量的帖子,现在就来发一个自感觉还行的,文章为本人原创,转载请说明作者,谢谢! 这次为大家带来的是《逆向手机支付架构核心》教程贴,适用于大部分,无论中国移动、联通还是电信支付。
 
 希望大家可以支持,推精喔!!!!
 
 {:5_125:}由于本人比较懒,图的话就不贴了
 
 核心:逆向手机支付两层,三层及多层架构核心
 
 在讲述之前,我们一定要先明白一个基础知识,有时函数名相同的函数,并非同一个函数,因为参数不同。如果上层函数要调用下层函数,且两个函数意义一样,如都是表示成功,则极有可能函数名相同,当然这也是开发者在增加分析难度。
 (1)首先,我们来看简单的手机支付两层架构核心,这种机制一般用于单机小游戏,范围用的较小,过于简单,太容易被分析。
 实现部分:
 这种比较容易理解,我们只看实现的大概的原理
 例子:
 上层函数:只有一个函数,该函数整体就是一个if判断语句,用于判断支付是成功,失败,还是取消,然后在对应的判断语句后面就是对应的功能开放代码
 |--上层函数调用下层函数
 下层函数:真实支付功能的技术实现,为支付操作真实发生时,程序如何响应
 我们知道,这个肯定是修改上层函数的if跳转。
 
 (2)对于三层架构核心,软件中最为常用,一来代码逻辑性好,易于维护,也给逆向分析带来一定难度。它比较复杂,为了更进一步让大家快速明白,手机支付的原理及逆向技巧和方法,我们先来看实现原理
 实现部分:
 首先,我们假定为onbillingsuccess,假想只有成功的情况。
 下面的函数名一样,但参数不同,参数的数量只是我们假定而已,仅为了表示函数实际是不同的。
 例子:
 上层函数:onbillingsuccess(1个参数)当成功后开放什么样的功能,以及信息提示框
 |--上层函数调用中层函数
 中层函数:onbillingsuccess(2个参数)判断支付是否是成功
 |--中层函数调用下层函数
 下层函数:onbillingsuccess(3个参数)真实支付成功的技术实现,如采用API支付,SENDSMS发短信支付,网络支付等等
 我们来解释一下意思,如果onbillingsuccess(3个参数)成立,那么onbillingsuccess(2个参数)成立;如果onbillingsuccess(2个参数)成立,那么onbillingsuccess(1个参数)成立。
 如果还是不太容易懂,我们写个大概伪源代码:
 
 上层函数:
 onbillingsuccess(1个参数)
 {
 if(onbillingsuccess(2个参数))
 #连升三级,此处为功能开放代码
 #信息框(支付成功!)
 }
 
 中层函数:
 onbilling() #关键的判断支付函数
 {
 if(onbillingsuccess(3个参数))
 onbillingsuccess(2个参数)
 }
 
 下层函数:
 onbillingsuccess(3个参数)
 {
 #支付了短信2元话费并成功处理
 onbillingsuccess(3个参数)
 }
 当然以上只是假想情况,软件中不可能只有成功,特别是中层关键的判断支付函数,更不可能只有成功,只是用这个例子来让大家明白,三层架构核心原理。
 看了上述,在这种最简单三层模型下,我们分析可知,实际上,手机支付破解我们要修改的就是中层函数。上层函数决定的是成功之后,有什么样功能开放,如连升三级,经验加倍等,如果我们需要修改成更强的功能,比如连升100级就要从上层函数突破。而下层函数对于我们来说,根本毫无作用,也是无法更改的,因为是真实情况,以发短信付费为例,我们不可能真的去购买,如花那2块钱话费去买个金币,这种真实行为是不存在的。我们最需要关注的就是中层函数,此处往往就是一个if判断函数,我们目地就是要通过修改判断成功。我们就得出一条重要原则:
 *******************************************************************************
 逆向手机支付三层架构核心原则:
 只修改中间层关键if判断函数
 ******************************************************************************
 看完上面后,大概明白了手机支付三层架构核心原理,但上面只是一种理想情况,我们先转移到逆向中,从简单的smali逆向来分析这个问题。
 smali逆向部分:
 我们这次把问题放在smali逆向中,并且同时加入成功,失败和取消。参数的数量依然只是为了表示上下两层的函数名相同,但为不同的函数
 例子:
 b.smali
  nbillingsuccess(1个参数),onbillingfail(1个参数),onbillingconcel(1个参数)这三个函数是分散独立存在的,三个函数分别执行不同的程序功能和提示信息框 |--b.smali调用b$1.smali
 b$1.smali
  nbillingsuccess(2个参数),onbillingfail(1个参数),onbillingconcel(2个参数),这三个函数是集合存在于一个判断函数中的,我们假定为onbilling(),是关键的if判断函数 |--b$1.smali调用iapi.smali
 api.smali
  nbillingsuccess(3个参数),onbillingfail(3个参数),onbillingconcel(3个参数),这三个函数也是分散独立存在于api.smali中的,是真实支付情况的处理 这个smali例子的手机支付破解关键点也是中层函数,即b$1.smali。此处给出伪源代码,便于理解:
 
 b.smali:
 onbillingsuccess(1个参数)
 {
 if(onbillingsuccess(2个参数))
 #连升三级,此处为功能开放代码
 #信息框(支付成功!)
 }
 
 onbillingfail(1个参数)
 {
 if(onbillingfail(2个参数))
 #普通经验模式,此处为功能开放代码
 #信息框(支付失败!)
 }
 
 onbillingconcel(1个参数)
 {
 if(onbillingconcel(2个参数))
 #普通经验模式,此处为功能开放代码
 #信息框(支付取消!)
 }
 实际上,上面代码之所以把 onbillingsuccess(1个参数)onbillingfail(1个参数)
 onbillingconcel(1个参数)这三个函数独立分散写开,一方面这是软件常用的开发方法,另一方面这样写比较清晰,大家容易理解,而真实情况可能不把这三个函数分别写开,只写一个函数代替这三个函数。如下面是另一种情况:
 b.smali:
 onbillingfinish()#由于这里判断逻辑比较多,只写一个可能的
 {
 if(onbillingsuccess(2个参数))
 #连升三级,此处为功能开放代码
 #信息框(支付成功!)
 Else if(onbillingfail(2个参数))
 #普通经验模式,此处为功能开放代码
 #信息框(支付失败!)
 Else if(onbillingconcel(2个参数))
 #普通经验模式,此处为功能开放代码
 #信息框(支付取消!)
 }
 之所以我一直强调三层架构中只有中层间关键if判断函数可以改,是为了让大家目标更加明确,破解更加迅速。这种说法是不正确的,如果从b.smali也可以修改,如把 #普通经验模式,此处为功能开放代码 直接改为 #连升三级,此处为功能开放代码。但是,这样修改前提是拥有很强的程序分析能力,不然很容易出错。如果b.smali是第二种形式,那么改法更多,直接修改if跳转也可以达到目地。假如你是新手,或对编程没那么强的分析和掌控能力,那么就记住我的三层架构核心原则:只改中间层关键if判断函数。
 b$1.smali:
 onbilling() #关键的判断支付函数,由于这里判断逻辑比较多,只写一个可能的
 {
 if(onbillingsuccess(3个参数))
 onbillingsuccess(2个参数)
 Else if (onbillingfail(3个参数))
 onbillingfail(2个参数)
 Else if (onbillingconcel(3个参数))
 onbillingconcel(2个参数)
 }
 
 api.smali:
 onbillingsuccess(3个参数)
 {
 #支付了短信2元话费并成功处理
 onbillingsuccess(3个参数)
 }
 
 onbillingfail(3个参数)
 {
 #支付了短信2元话费但出现异常
 onbillingfail(3个参数)
 }
 onbillingconcel(3个参数)
 {
 #支付了短信2元话费但被取消
 onbillingconcel(3个参数)
 }
 我们对森林泡泡龙这个纯JAVA安卓开放的游戏,来一次具体三层架构核心的运用,以下是本人亲自实现的逆向方法。本游戏支付后,没有支付失败提示,只有不购买这个按钮,我们就要从支付取消入手,将支付取消改为支付成功即成功:
 1.把“不购买”转为unicode,搜索无结果;
 2.直接搜索“不购买”,发现string.xml中存在,name名称为gt_onbilling_reject;
 3.搜索gt_onbilling_reject,发现存在于b.smali中,利用java源码看整体代码,有onbillingsuccess,onbillingfail,onbillingconcel三个函数分散独立存在,并发现onbillingsuccess中有gt_onbilling_ok;
 4.搜索gt_onbilling_ok,发现存在于b$1.smali,并且有一个函数c(),其为关键if判断函数,同时存在onbillingsuccess,onbillingfail,onbillingconcel,将onbillingconcel改为
 onbillingsuccess;
 5.破解手机支付成功!
 (3)我们再把问题稍微提高点,加入更多架构可能的情况考虑,这里我要说一下,支付完成的作用实际也是非常大的,当发现支付完成onbillingfinish()这样函数时,也意味着离核心的成功和失败部分不远了,之后会展示出来。我们继续回到例子,
 
 稍复杂的四层架构例子:(其中1,2,3依然只是假设,为了标明相同函数名,参数不同)
 b.smali
  nbillingsuccess(1),onbillingfail(1),onbillingconcel(1)这三个函数独立分散存在。然而,onbillingsuccess(1),onbillingfail(1),onbillingconcel(1)调用下面b&1.smali的a(),a(v),b()。我们可以知道,a(),a(v),b()这三个就是开放功能的代码,而onbillingsuccess(1),onbillingfail(1),onbillingconcel(1)就是调用对应的a(),a(v),b()加上信息提示框“支付成功”、“支付失败”、“支付取消”。 |--b.smali调用b$1.smali
 b$1.smali:a(),a(v),b()。这三个函数分别对应的意思也是成功,失败,取消,不过a()和a(v)哪一个成功,哪一个失败,具体软件是不同的。这三个函数也是独立分散存在。这三个函数就是程序开放功能的代码。
 |--b$1.smali调用b$1$1.smali
 b$1$1.smali:onbillingsuccess(2),onbillingfail(2),onbillingconcel(2)。这三个函数集合存在于一个关键判断函数中,假定为onbilling()。该函数就是关键if判断函数
 |b$1$1.smali调用api.smali
 api.smali:onbillingsuccess(3),onbillingfail(3),onbillingconcel(3)。这三个函数也是独立分散存在,用于真实的支付情况处理。
 由于时间关系,我们就不写伪源代码了,大家可以留着当作业或思考题,看看能不能自己独立写出来。在这里要说的话,如果是这种情况,我们的破解方法就多了,可以从b$2.smali中的关键if判断函数入手,这是我们的老套路了。其实还有一种更为简单的破解方法,从
 最高处b.smali入手,好像不符合上面的三层架构理论,但我们想想,以失败为例,onbillingfail(1)失败本来是调用a(v),a(v)意思也是失败,如果让onbillingfail(1)
 调用的不是a(v),而直接是a()成功,是不是就达到目地了。如果不理解,,可以看上面的函数说明,其实真正程序开放功能的代码在a(),a(v),b()!我们也还可以从b$1.smali入手,本来a(),a(v),b()三个函数代码肯定是不同的,如果我们把a(v)和b()两个函数原本的功能开放代码删掉,全部换成成功a()的功能开放代码,是不是也能够达到目地。可能这种方法,很多人不是太理解,我写下伪源代码:
 b$1.smali:
 a()
 {
 if(onbillingsuccess(2))
 #连升三级,此处为功能开放代码
 }
 a(v)
 {
 if(onbillingfail(2))
 #普通经验模式,此处为功能开放代码 '将此处代码修改为#连升三级,此处为功能开放代码
 }
 b()
 {
 if(onbillingconcel(2))
 #普通经验模式,此处为功能开放代码 '将此处代码修改为#连升三级,此处为功能开放代码
 }
 
 可以看成,在四层架构核心里,我们除了真实情况的最底层函数api.smali不能改之外,其他三层都可以改,达到破解的目地。这就与三层架构中的,仅能修改中间层的关键if判断函数才能达到修改目地,是不同的。
 ********************************************************************************
 最终梳理总结:
 实际上,以两层架构为基础,我们能改的就是两层架构的上层函数,该上层函数包括:关键if判断、功能开放代码、信息框提示。
 1.三层架构是把两层架构中的上层函数一分为二,将关键if判断单独分开;
 2.四层架构是把两层架构中的上层函数一个分为逐层累加功能的三个:关键if判断、功能开放代码、信息框提示。
 ********************************************************************************
 对于更复杂的情况,在这里,我就不进行推理演算了,(感觉好像数学家。。。嘿嘿)
 
 诸神之剑中手机支付分析
 先感谢法总一下,首先搜索smali,查到与Unity3d接壤的地方,
 
 smali---交互信息(sendMsgToUnity)----Unity3d
 诸神之剑的手机支付三层架构:
 MMlistener:onbillingfinish(1)
 MMAPI
  nbillingfinish(2) 关键if判断函数 IAPIInstance:onbillingfinish(3)
 
 
 
 |