安卓逆向的初步研究--x抢抢红包神器内购与网验pj和安卓代码分析(待续)

约定:
文中的所有不禾蟹的东西都拿xx抹除或拼音代替等
阅读本文我就默认你有java基础 安卓基础 逆xiang基础 smali基础
资源链接(包括源文件和修改好的app文件)如果失效请加群找群主
用到的工具有 mx管理器 hxxp canady或者fiddler 其他工具也行,并且熟练使用
本文教程的样本是一个球球网友提供的,没有壳没有so保护没有签名验证,只是简单的离线内购和网络验证,验证也是明文,直接就能看懂,拿来练手非常好,在这里感谢提供样本app的网友,让我们能深入分析dex中的smali代码。

免责声明,下面的pj方法仅仅是为了技术研究和分享,不能用于任何的商业用途或非法用途。本人不对此使用者的行为而产生的任何法律责任负责,同意就继续阅读,负责请离开,谢谢!!!

1.内购pj
  pj一般分两步,定位关键函数,修改关键代码
  打开原版app就会发现应用存在zhi付宝内购,此种内购pj在网上有教程,app不一样但原理相通。无非就是找到9000字符串代码到关键函数位置,在9000的下方就近处会发现一个判断,这里如果是if-eqz就改为相反逻辑if-neq,同理如果是if-neq 就改 if-eqz。
  这里我要提醒几点,一是如何定位到关键函数,二是为什么要这样改。我先说一,你要准确找到是有点小技巧的,在搜索dex时的代码时可以选择只搜索字符串,并且完全匹配,区分大小写,最最重要的是要有一眼能分辨出哪些是第三方jar包,哪些是安卓兼容包,哪些是真正作者写的程序。我这 里举个栗子你就明白了,像以android.xxxxx什么开头的是系统自带的包,com。alipay,com.umeng.xxxxx什么开头的是系统自带的包,com。alipay,的是第三方提供的包,前两个都是提供了个编程环境,真正的作者写代码的就是本app的自己的包名com.kqqhb.app下的文件,我们搜索的9000也应该在这里面找才对。这样就只有一个我们想要的结果了。不知道找到app自己的包名的请复习一下安卓逆x基础。第二个,9000是成功代码,我没记错的话应该是支付表内部定义的支付成功标志,当你支付失败或取消支付时产生的代码与9000比较,相等就执行支付成功代码片段,失败就执行其他。这时我们把相等就执行改为不相等就执行,支付失败自然而然就执行成功的代码段了。我把它称为逻辑判断修改。我再用smali伪代码讲解一遍,
const-string v0,=输入的值;理解为v0=输入的值6000
const-string v1,=9000
invoke-virtual {v0,v1} equals(string;string);调用字符串比较函数传入v0 v1,它们的类型是(string;string)
move-result v0;将结果返回到v0;如果相等返回1 不等返回0,这里返回0
if-eqz v0 :label_1;v0==0 就跳转到 label_1 标签出的代码执行;不知道你们注意到没有这里的if判断是负逻辑表达法,平时写的Java的if(成立) {}; else{};,判断成立执行接下的语句,而smali却刚好相反不成立跳到后面else处执行,这也是汇编语言的特点。虽然这样写不会影响代码的执行,但你们想想为什么要负逻辑表达法,相信你们的智力是可以理解的。
支付成功

:label_1
支付失败

此时把if-eqz v0 :label_1改为
if-neq v0 :label_1;这样在不相等返回0时,比较0不等于0吗?结果不成立继续向下执行成功代码段。

注:smali代码与java有着简单的一一对应的关系,相信你在懂java的,必然一看就会smali。我们修改的紧紧是判断逻辑,不是把支付流程取消了,这两个有着本质的区别,因此我们还是要在app中走一边支付流程,在将要支付时返回取消支付,产生6000代码,去比较。这样才能通过支付,实现成功支付的目的。

本以为pj结束,回编安装即可,但不幸的是toast提示支付成功但还是没有打开高级按钮功能。因此有了下文。

2.网验pj
定位关键函数
  此时我就判断这个app不仅是简单的内购验证,改改if就完事了的,还有其他验证,我们这里就要猜测了,一般很有可能是网络验证,为了验证猜测我们就抓包,我在支付取消是抓包我在支付取消是抓包我在支付取消是抓包,抓到一个包,提交给check-user.php 返回 status=0&wechatpay31=9,这是我确定十有八九是网络验证包,返回的值是关键。此时我就在dex中搜索wechatpay31定位处理返回值的代码,为什么要搜索wechatpay31,还是经验问题,特征搜索定位法要用最奇葩的字符串我觉得wechatpay31非常奇葩,就用了这个,而用了status返回的位置不下十个。但偏偏没有搜索出任何结果,我想这个app没有so文件且就一个dex文件,所有代码通通应该在这里面,怎么会没有呢,这时候就要转变思路搜索提交的链接,www.xxxx.com/chech-usr.php,搜索出了两个文件一个是安卓的R注册文件,显然不是这个,是另一个。打开后发现,里面是生成发送的链接并发送,没有接受处理的地方,但皇天不负有心人,有个类似这么样的伪代码

String sendPost = NetUtils.sendPost("http//www.xxxxx.xxxx");发送链接,返回值保存在sendPost中
Message m=new Message();
m.what=5;5表示的是一个自定义标志,就好像给一头猪耳朵定上个编码一样
m.obj=sendPost;OBJ就是返回的对象
handler.sendMessage(m);给handler去处理这个返回信息

  我们找的就是这个handler,定义在安卓中的。可以理解为一个管道,里面还有其他的打了标签的handler,这是其中一个
管子的另一头,识别接收处理方法用handleMessage(),因此搜索handleMessage,安卓自带的方法一搜索必然一堆类方法,怎么定位按我之前说的做,但过滤之后还有6个方法,这是只有一个个看了,运气好还第一个就是,如图所示,怎么知道这个就是你要找的,其实很简单扫一眼逻辑有很多判断语句并且以依据字符串和资源值(安卓逆xiang基础里的内容)就八九不离十了,在仔细一看 有如下伪代码
int i=m.what
if(i==5){}
elseif(i=1)
()
else
就确定是这里了。

修改关键代码
  还记得猪标签吗,这个m.what就是上面我们打上的猪标签,我们给上面打上的是优质猪,这些if判断就是在识别这是什么猪,如果是优质猪则这么处理,低质的猪则怎么处理。上面i=5这里就处理i=5后面的代码,接着又把status代码的值0拿了出来比较,执行了没有支付成功的代码,如果status==3就是成功了的代码,怎么知道是这里是支付成功的,还是和上面的方法一样。
重点来了!!!!
  我们要修改这里的if判断语句,如果还按之前的pj内购的方法改这里是不行的,改了之后不能达到我们想要的结果。因为这里不是一条if而是多条且最后一个else语句代码不是要执行的成功代码。这里我采用偷梁换柱法,就是把status==3后的成功代码,复制一份到status==0后的失败代码,替换原来的代码。这样即使返回失败的0,执行的也是成功的代码。具体smali代码怎么替换,就要你的基础支持了。
修改的方法还有很多,在修改逻辑时,一定要掌握三个原则,
1.修改后的代码要符合你的期望结果。这个很好理解,就是要满足预期结果
2.最小修改原则。这个意思是尽量带动较少的代码,达到预期结果,目的是减少出错率,好找出隐藏的bug
3.一定不能影响上下文原则。就是你所做的任何更改不能对原代码产生歧义。这个不好理解。比如有一堆的代码,在这个一堆代码的后文有一句v1=2,v1==1要用,你在v1==1前面v1=2后面加入了一条v1=0,这样你就破坏了v1=2的上文也破坏了v1==1的下文,使得程序运行在不可预料的执行。在比如你想插入一个函数调用,v0=hhh ;invoke-virtual {v0,v9} equal(string;string),发现这个代码的问题了吗v9在上文中没有定义,破坏了上文,这个调用就是无效的,app执行到这里会闪退。

这时在回编,安装就能运行vip功能了。

3.安卓代码分析

猜你喜欢

转载自www.cnblogs.com/GKLBB/p/12309471.html
今日推荐