作者:菜鸟说
有时候我们想抓取一些app的数据用作商业用途,或者是获取到该app中某一个技术点的实现方式,或者是想获得其中的重要逻辑,目的的话不同人不一样。但是有些app就是不让你获取接口数据,搞了各种各样的加密,这里其实也是攻守关系,魔高一尺道高一丈,双方彼此在竞争中成长,推动着技术的进步。
今天给大家带来一个百万级日活的主流app-连尚读书的接口数据破解,这可是独家博客首更哈,网上不可能搜到的干货。看官大大们都系好安全带,扶好扶手,马上开车。如果有连尚官方的兄弟希望也别生气,我其实也不太想公开来着,但是后面想了想反编译的大佬多了去了,如果像我这种小菜鸟都能破解,那说明早就有很多其他人已经破解过了。下面贴出连尚读书的app截图,界面中规中矩,颜值还是不错的呢!
废话少说,看完了就开干。破解接口数据,首当其冲当然是抓包,我这里贴个图,抓到包了但是是加密后的字符串,完全看不出来这是什么东东啊,连尚的兄弟们也是够狠的。
由于是破解接口,当然是从url入手啊,首先复制host到反编译工具中进行搜索,结果如下图:
你觉得这些搜索结果里你对哪个更感兴趣?当然是最后两个,因为最后2个使用了Retrofit这网络框架明明白白地就摆在那里,坐等你上去点,你能不感兴趣嘛?OK,那应该点哪个方法呢?问得好,当然是点a()方法啊,首先一看混淆了的就知道有鬼,其次前面部分肯定是Retrofit的基本使用,无外乎就是根据url来获取数据,当然有空的话点进去学习一下也无所谓啦!这里我们直接点进去a()方法,结果如下图:
看到没,这段代码已经很明显了
String string = responseBody.string();
这百分百是从response里面获取到前面那串乱码啊,接下来将这串乱码调用了一个decryptN方法以后,获取到了一个值。这个值是什么呢,我们可以根据它的使用处来猜测一下。首先这个值是传给str,那str是给a.a()作为参数,重点是str的默认值,看到没,str默认值是一个json,那么既然string是赋值给str的,那string是不是应该也是个json呢?这是当然,所以string就是最终解码以后获得的json数据了。
现在形势就很明朗了,从服务端获取到了一个加密的responseBody,然后调用Rsa.decryptN方法进行了解密获取到了最终可供客户端使用的正常json数据。那么问题来了,这个解密算法是什么呢,我们迫不及待地点进去看:
点进去发现是调用了一个nativeDecryptAD方法获取到Byte[],最后将这个byte[]转换成的json,所以这里重点就是这个nativeDecryptAD方法了。点击这个方法,定位到上面定义处,发现是个native标识的方法,也就是jni的方法。这也是正常的,既然要做加密,使用c那再正常不过了。
俗话说得好,神挡杀神,佛挡杀佛,怎么能轻易被jni给挡住?碰到使用jni的地方,第一个想到的就应该是看下这个方法是放在哪个so下面。注意看上面的静态方法
static {
System.loadLibrary("ck");
}
这么直接地告诉你是在ck这个so下面,那我当然就得去拜访一下咯。修改apk的后缀后,很容易就获取到了这个so包,优哉游哉地打开,如下图
刚刚那个加密方法是在Rsa类中,叫做nativeDecryptAD方法。我们扫一眼所有的方法,一眼就找到了,当然得点开来好好研究一把,毕竟连尚的码农为了做加密肯定也是费了不少功夫的,不研究一把就对不住人家。程序员本身就已经很不容易了,要互相懂得尊重。废话少说,直接打开这个方法,实现如下:
我们看该方法是由v9赋值而成,而v9是由v8转成byte[],所以关键就是v8了。v8是调用了另一个c的方法,我们点进去看下
里面都是乱七八糟的代码,看到v1 v2一直到v20就头痛。不过这代码就不是让你看的,你有发现什么规律没,基本所有的变量都包含xxtea开头,这意味这个方法很可能就是第三方的一个叫xxtea的类库,不然如果你自己写代码你会都用xxtea开头不?
到这里我们去网上搜索一下xxtea,果然是一个加密框架,确认过眼神,你就是对的人。知道了加密框架以后你就可以去搜索解密方式了,这种百度操作网上一搜一大把,肯定难不倒大家吧。我这里就随便贴个百度搜索到的链接吧,解密算法图也贴一个:https://www.cnblogs.com/frogblog/p/8607392.html
OK,解密算法有了,我们可以看到这个算法是需要传入2个参数,我们再回头看看之前的c方法是不是有传入这些参数。首先从Java那边传入的数组是input,这个input转变成ret_len传入了算法,其次传入了一个pub_key_ad,看名字结合场景不用猜都知道这个肯定就是解密需要的Key了。
但是上面并没有对这个pub_key_ad赋值,所以这个肯定是在之前就赋值了的变量。我们点进去
看到没,果然一个复杂的key哇,可惜还是露出了它的真面目。这里打了个helloworld只是为了让它不那么害羞,给穿个三点衣吧,让它有点安全感。那么Key是不是就是这个,可以直接复制过去使用呢?答案是否定的,你需要注意的是在c的代码中对这个key进行过修改哦,粗心的同学不小心就会拜倒在这里,这应该是连尚的小心机吧,哈哈。
看到没,第6个数要改成48才可以,不然折腾了半天没看到这里也是白搭。把key复制出来,然后修改key中下标为6的数,也就是第7个数为十进制的48(因为这里没用0x所以不是16进制)。然后就可以收获成果了,这么有名的app中关键数据毫无保留地出现在你面前,是不是满满的成就感?
总结:本次表演结束,我给大家总结一下破解接口的方法。我之前还破解过手淘的接口,后面有空也给大家分享一下。当然,根据我的经验,破解接口数据的步骤总共分为以下几点:
1.是否有网页版或者网页客户端
如果某个软件有网页版,那么破解的难度的就降低很多,就算有js混淆,但是至少代码都是可见的,不像客户端各种混淆加密加固机制,动不动就是jni。可以这么说吧,如果有网页版,就优先对网页版进行破解。
2.使用抓包工具进行抓包
这一步没什么好说的,破解接口当然是得抓包了。当然这里需要注意看下抓到的数据有什么加密参数,或者是获得的数据是否是加密过的乱码,后面好针对性的进行破解
3.找到app中的网络框架
根据抓到的host搜索网络框架代码,里面无非就两种,加密的sign参数,或者是解密前的responseBody,反正你关心的一切在里面肯定有。
4.顺藤摸瓜,找到加密方法
找到加密数据的具体实现,其中有可能在Java中,也有可能在c中。不论在哪里,细心分析代码,哪怕它被混淆得面目全非也要保持有耐心。
5.认真研究加密方法,不要放过一丝一线
最后
破解app就像走钢丝,有时候前面走得都很顺利,一个不细心将前功尽弃一无所获,所以一定要细心,查了一个字母或者大小写不一样都不行。这肯定不是一件简单的事情,不然你当人家的架构师都是白搭的么。另外需要具备一定的联想能力,一般人家要加密,经常会出现聪明反被聪明误的情况,关键代码混淆一下,所以你就专找混淆后的代码看。另外,需要对常用的加密方式了解,以便看到代码就能联想到解密的方法。
最后,希望连尚的兄弟们不要记恨我哈,互联网就是这样,有攻防才能促进技术的进步。就算我不去破解,我不写博客,也会有其他人会去做,还不如早点让你看到这帖子早点对自己加密方式进行优化,哈哈是不是很有道理!
你们有破解什么app,其中用到了什么样的加密方式呢,欢迎小伙伴们一起来探讨,共同进步哦!
感谢大家能耐着性子看完
在这里小编也分享一份自己收录整理的Android学习PDF+架构视频+面试文档+源码笔记,还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习
如果你有需要的话,可以点赞+评论+转发,关注我,然后私信我【进阶】我发给你
(正文已结束)
推荐阅读:云南企业新闻网
免责声明及提醒:此文内容为本网所转载企业宣传资讯,该相关信息仅为宣传及传递更多信息之目的,不代表本网站观点,文章真实性请浏览者慎重核实!任何投资加盟均有风险,提醒广大民众投资需谨慎!