zoukankan      html  css  js  c++  java
  • Android 逆向实战篇(加密数据包破解)

    1. 实战背景

    由于工作需要,要爬取某款App的数据,App的具体名称此处不便透露,避免他们发现并修改加密逻辑我就得重新破解了。

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

                                                    

                                                                              图1  数据包截图

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

    所以,我们要做的,就是逆向App→找到解密函数→重现。就这么简单。

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

                                                                     

                                                                                                图2  查壳

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

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

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

                                                   

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

    转载https://www.cnblogs.com/zhujiabin/p/10619871.html

  • 相关阅读:
    centos7.6 安装与配置 MongoDB yum方式
    MongoDB 介绍
    centos 关闭selinux
    前端 HTML标签属性
    前端 HTML 标签嵌套规则
    前端 HTML 标签分类
    前端 HTML body标签相关内容 常用标签 表单标签 form里面的 input标签介绍
    前端 HTML body标签相关内容 常用标签 表单标签 form 表单控件分类
    前端 HTML form表单标签 select标签 option 下拉框
    POJ 1426
  • 原文地址:https://www.cnblogs.com/wuxianyu/p/14172925.html
Copyright © 2011-2022 走看看