Android 逆向实战篇(加密数据包破解)

1. 实战背景
因为工做须要,要爬取某款App的数据,App的具体名称此处不便透露,避免他们发现并修改加密逻辑我就得从新破解了。android

爬取这款App时发现,抓包抓到的数据是加密过的,如图1所示(原数据较长,图中有省略),能够看到这个超长的data1字段,并且是加密过的。显然,对方不想让咱们直接拿到它的信息,选择传过来一个加密的字段,而咱们要作的,就是解密这个字段。json

                                                

                                                                          图1  数据包截图服务器

2. 问题分析
既然服务器返回了一段没法阅读的加密数据,那么必然,这段数据是在客户端进行解密的。所以,咱们要作的就是找出解密代码,重现它,从而来破解这段加密数据。函数

因此,咱们要作的,就是逆向App→找到解密函数→重现。就这么简单。工具

3. 实战记录
1) 脱壳
拿到APK后,要作的第一件是就是查壳。若是你第一件事就是用jadx、AndroidKiller、APKTool等各类工具怼的话,那你必定是个愣头青,铁头娃,石乐志。如图2所示,能够看到这个App是通过腾讯加固的,须要费一番功夫才能拿到源码。网站

                                                                 

                                                                                            图2  查壳加密

脱壳是一项比较麻烦的工做,脱壳大神能够直接进入下一步,像我同样的小菜鸡建议转去阅读《Android逆向基础篇(脱壳机)》,拥有一部脱壳机能够助你轻松无脑的脱去市面上大多数的壳。3d

2) 找到解密函数
找源码是有技巧的,一行一行阅读的话头都秃了源码还没读完,所以须要巧用搜索功能。code

对于搜索功能,我的十分推荐jadx,它的搜索功能十分强大,但随之而来的是它对内存的巨大需求。能够看到图3中,它占了1600多MB内存。blog

                                               

                                                                                     图3  jadx占用内存

这里分享一下我对于代码搜索的一些拙见。想破解请求中的加密字段,首先确定是搜索加密的字段名,但有时候这些字段叫作“token”、“key”等随便搜搜几千个的名字,那就很难从几千个中找出来了。这种状况,能够搜索请求的URL,而后一步步findusage,找出用这个URL的代码,慢慢抽丝剥茧总能找到的,我的感受效率直接搜字段名要高。使用URL搜索时不建议输入整个URL,大多数状况下都会拼接的,找几个有特征的词去搜就好了。

对于返回的加密数据,上面这种搜URL的方法就很差使了。图1中能够看到加密字段叫data1,幸亏它不叫data,若是它叫data,那就得从5000多个data中把它挖出来。而源码中的data1,只有52个,瞬间筛掉了99%的无关代码。

搜索结果如图4所示。截全图的话看不清,所以这里只截取部分。相信有视力5.3英语16级的小伙伴已经发现了,几个闪亮的、引人注目的“Decode”,decode data1,那还有疑问吗?确定是它干的好事呀。

                   

                                                                                      图4  “data1”搜索结果

在上面随便找个decode双击,而后按住ctrl点击函数名,就能看到这个decode函数的源码了,如图5所示,这个名为eee3DecodeECB的函数,八成就是咱们想要找到的解密函数了。

                                           

                                                                                      图5  decode函数源码

3) 重现
直接把这段代码复制进Intellij中,效果如图6所示。

              

                                                                                  图6  Intellij截图(1)

图6红的仿佛梦中的A股,股市越红越好,而代码则是越红越很差。咱们须要处理这些cannot resolve的东西。

缺啥补啥,先看变量,须要ENCODING,f224IV,SECRET_KEY,不出所料,这几个都是类中定义的静态变量,顺便把开头的import也一块儿复制过来,如今的效果就好多了。

                                                                               图7  Intellij截图(2)

这里的Base64这个包本来是android.util.Base64,在开发安卓时,在Android Studio中直接import就能够了,但在Intellij中直接import是不行的,须要本身把这个包下载一下。

不报错了,那就写个main函数解密试试。把抓包抓到的巨长无比的data1复制到main中的data1,而后调用一下刚才重现的解密函数。由于data1实在是长,这里就不复制进去的,请自行脑补。还有,记得必定要写try。

                                                               

                                                                                       图8  main函数

从头至尾再看一遍咱们重现的解密代码,一切都很perfect,运行走起。看一下运行结果,是一段Json格式的数据,找一个json在线格式化的网站把运行结果复制进行,结果如图9所示,显然,完成了对加密数据包的解密

                                                                                         图9  运行结果

能够看到,通过上述操做,完成了对加密数据包的解密。

4. 总结
上述过程并不复杂,也几乎没有任何难点,所以这种加密方式能够说并不合格,甚至能够说有些自欺欺人。加密的本意显然是为了增长一点破解难度,但我这样的菜鸡也只花了不到半小时就完成了破解,况且专业的逆向大神呢。讲真,哪怕把data1这个名字改为data也能增长一些破解的时间成本。

单纯的Java代码加密太容易破解了,建议此类场景仍是用So加密更好,毕竟想要把so文件执行起来仍是得费一番功夫的。

相关文章
相关标签/搜索