有时候咱们想抓取一些app的数据用做商业用途,或者是获取到该app中某一个技术点的实现方式,或者是想得到其中的重要逻辑,目的的话不一样人不同。可是有些app就是不让你获取接口数据,搞了各类各样的加密,这里其实也是攻守关系,魔高一尺道高一丈,双方彼此在竞争中成长,推进着技术的进步。html
今天给你们带来一个百万级日活的主流app-连尚读书的接口数据破解,这但是独家博客首更哈,网上不可能搜到的干货。看官大大们都系好安全带,扶好扶手,立刻开车。若是有连尚官方的兄弟但愿也别生气,我其实也不太想公开来着,可是后面想了想反编译的大佬多了去了,若是像我这种小菜鸟都能破解,那说明早就有不少其余人已经破解过了。下面贴出连尚读书的app截图,界面中规中矩,颜值仍是不错的呢!程序员
废话少说,看完了就开干。破解接口数据,首当其冲固然是抓包,我这里贴个图,抓到包了可是是加密后的字符串,彻底看不出来这是什么东东啊,连尚的兄弟们也是够狠的。算法
因为是破解接口,固然是从url入手啊,首先复制host到反编译工具中进行搜索,结果以下图:json
你以为这些搜索结果里你对哪一个更感兴趣?固然是最后两个,由于最后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数据。那么问题来了,这个解密算法是什么呢,咱们火烧眉毛地点进去看:app
点进去发现是调用了一个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,果真是一个加密框架,确认过眼神,你就是对的人。知道了加密框架之后你就能够去搜索解密方式了,这种百度操做网上一搜一大把,确定难不倒你们吧。我这里就随便贴个百度搜索到的连接吧,解密算法图也贴一个:www.cnblogs.com/frogblog/p/…
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,其中用到了什么样的加密方式呢,欢迎小伙伴们一块儿来探讨,共同进步哦!