首页 > 编程知识 正文

安卓数据加密,Android数据加密

时间:2023-05-03 12:09:20 阅读:158357 作者:12

目录

1 .实战背景

2 .问题分析

3 .实战记录

1 )空壳

2 )找到解密函数

3 )再现

4 .总结

在阅读本文之前,我建议您阅读Android的逆向实战篇(Https Brag )。

1 .实战背景是工作需要,为了获取某个APP的数据,APP的具体名字在这里不能透露。 要防止他们发现并修改加密逻辑,我必须再次解密。

攀登这个APP后,发现抓住数据包的数据是加密的。 如图1所示,原始数据很长,在图中被省略了。 可以看到这个长的data1字段,它是加密的。 很明显,对方不想让我们直接得到那个信息,所以选择了加密的字段交给了我们。 我们要做的是解密这个字段。

图1数据包截图

2 .既然问题分析服务返回了无法读取的加密数据,那么必然会在客户端解密该数据。 因此,为了解密加密的数据,需要找到并再现解密代码。

因此,我们应该做的是逆APP找到解密函数再现。 就这么简单。

3 .实战记录1 )脱颖而出拿到APK后,第一件事就是查壶。 如果你最先通过jadx、AndroidKiller、APKTool等各种工具恍惚,那你一定是心不在焉,铁头娃、石乐志。 如图2所示,可以看出,该APP通过腾讯进行了加强,在得到源代码之前很费工夫。

图2外壳

脱壳是比较麻烦的工作。 脱壳大神可以直接进入下一步。 像我这样的dldfy建议你去读《Android逆向基础篇(脱壳机)》。 如果你有一个开罐器,你可以很容易地在没有脑子的情况下脱去市面上几乎所有的壶。

2 )找到解码函数查找源代码是有技巧的,逐行阅读会导致秃脑袋未读完源代码,需要巧妙地使用搜索功能。

关于搜索功能,我个人推荐jadx。 虽然搜索功能非常强大,但随之而来的是对内存的巨大需求。 在图3中,您可以看到它占用了1600多个内存。

                          图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文件执行起来还是得费一番功夫的。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。