发新帖

【逆向破解】逆向手机支付架构核心

[复制链接]
24291 19
     大家好,我是七少月,好像还没有什么有关逆向,有质量的帖子,现在就来发一个自感觉还行的,文章为本人原创,转载请说明作者,谢谢!
     这次为大家带来的是《逆向手机支付架构核心》教程贴,适用于大部分,无论中国移动、联通还是电信支付。

    希望大家可以支持,推精喔!!!!

    由于本人比较懒,图的话就不贴了

核心:逆向手机支付两层,三层及多层架构核心
  
  在讲述之前,我们一定要先明白一个基础知识,有时函数名相同的函数,并非同一个函数,因为参数不同。如果上层函数要调用下层函数,且两个函数意义一样,如都是表示成功,则极有可能函数名相同,当然这也是开发者在增加分析难度。
(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:onbillingsuccess(1个参数),onbillingfail(1个参数),onbillingconcel(1个参数)这三个函数是分散独立存在的,三个函数分别执行不同的程序功能和提示信息框
|--b.smali调用b$1.smali
b$1.smali:onbillingsuccess(2个参数),onbillingfail(1个参数),onbillingconcel(2个参数),这三个函数是集合存在于一个判断函数中的,我们假定为onbilling(),是关键的if判断函数
|--b$1.smali调用iapi.smali
api.smali:onbillingsuccess(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:onbillingsuccess(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 :onbillingfinish(2) 关键if判断函数
IAPIInstance:onbillingfinish(3)


已有1人评分 NB 荣获致谢 理由
B6B6B6 + 1 + 1 很给力!

查看全部评分 总评分: NB +1  荣获致谢 +1 

举报 使用道具

回复

精彩评论19

vVv一    发表于 2015-5-3 20:50:06 | 显示全部楼层
依旧是32个赞~学习了!期待那一个多小时的教程~

举报 使用道具

回复 支持 反对
sndncel    发表于 2015-5-3 20:58:03 | 显示全部楼层
终于看完了呀。。。。。。楼主的文字表达意思不是很清楚呀。。。。新手肯定不太容易理解呀。

举报 使用道具

回复 支持 反对
vickis    发表于 2015-5-4 09:32:07 | 显示全部楼层
一会来看看,马克

举报 使用道具

回复 支持 反对
ctp518    发表于 2015-5-4 13:55:25 | 显示全部楼层
七大来给你点个钻咯,嘿嘿

举报 使用道具

回复 支持 反对
bjhrwzh    发表于 2015-5-4 13:58:04 | 显示全部楼层
思路还是可以的。最好把游戏破解那写分析一起放上来,就明白了

点评

嘿嘿,多谢意见,主要是我比较懒,其实文中有两个例子,一个是诸神之剑,一个是森林泡泡龙,也对论点是个代表性的例子。不过文中有几处手误,纯手打,难免出错,见谅。明白就可以呢!  详情 回复 发表于 2015-5-5 01:38

举报 使用道具

回复 支持 反对
xin    发表于 2015-5-4 18:35:19 来自手机  | 显示全部楼层
顶一个  有时间再慢慢看

举报 使用道具

回复 支持 反对
七少月    发表于 2015-5-5 01:38:26 | 显示全部楼层
bjhrwzh 发表于 2015-5-4 13:58
思路还是可以的。最好把游戏破解那写分析一起放上来,就明白了

嘿嘿,多谢意见,主要是我比较懒,其实文中有两个例子,一个是诸神之剑,一个是森林泡泡龙,也对论点是个代表性的例子。不过文中有几处手误,纯手打,难免出错,见谅。明白就可以呢!

举报 使用道具

回复 支持 反对
ceshi999    发表于 2015-5-5 09:44:38 | 显示全部楼层
单机游戏修改教程,以前只知道搜索失败,改成成功,这里详细介绍还有上中下三层。

举报 使用道具

回复 支持 反对
听鬼哥说故事    发表于 2015-5-5 09:45:15 | 显示全部楼层
支持一下,挺详细的文字,挺好的分析思路,赞,精华了~

点评

谢谢老鬼的支持!  详情 回复 发表于 2015-5-7 01:21

举报 使用道具

回复 支持 反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表