主流app破解你以为用C进行加密就可以高枕无忧了
今天给大家带来一个百万级日活的主流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.顺藤摸瓜,找到加密方法
版权声明:
作者:shadowrocket
链接:https://www.shadowrockets.wang/783.html
来源:Shadowrocket官网
文章版权归作者所有,未经允许请勿转载。



共有 0 条评论