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

Android 逆向实战篇(加密数据包破解)的更多相关文章

  1. Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)

    Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码) 来源 https://blog.csdn.net/jiangwei0910410003/article/details/51 ...

  2. 初探Android逆向:通过游戏APP破解引发的安全思考

    如今移动互联网已经完全融入到我们的生活中,各类APP也是层出不穷,因此对于安卓APP安全的研究也尤为重要.本文通过对一款安卓APP的破解实例,来引出对于APP安全的探讨.(本人纯小白,初次接触安卓逆向 ...

  3. Android之实战篇(三)

    先给出我们用到的工具类 1.发送请求的工具类 本实例采用HttpClient与服务器通信,用到了一个工具类对Httpclient进行封装:定义了两个方法来发送请求 getRequest:发送GET请求 ...

  4. Android apk逆向实战

    简介 逆向Android apk其实是一个分析Android apk的一个过程,必须了解Android程序开发的流程.结构.语句分支.解密原理等等. 功能 破解一个注册验证程序(自写一个简单的注册验证 ...

  5. Android逆向破解表单注册程序

    Android逆向破解表单注册程序 Android开发 ADT: android studio(as) 程序界面如下,注册码为6位随机数字,注册成功时弹出通知注册成功,注册失败时弹出通知注册失败. 布 ...

  6. Android逆向破解表单登录程序

    Android逆向破解表单登录程序 Android开发 ADT: android studio(as) 程序界面如下,登录成功时弹出通知登录成功,登录失败时弹出通知登录失败. 布局代码 <?xm ...

  7. Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(上)

    前言 Android中绘图离不开的就是Canvas了,Canvas是一个庞大的知识体系,有Java层的,也有jni层深入到Framework.Canvas有许多的知识内容,构建了一个武器库一般,所谓十 ...

  8. Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(下)

    LinearGradient 线性渐变渲染器 LinearGradient中文翻译过来就是线性渐变的意思.线性渐变通俗来讲就是给起点设置一个颜色值如#faf84d,终点设置一个颜色值如#CC423C, ...

  9. 史上最全面 Android逆向培训之__实战(hook微信)

    我的CSDN博客:https://blog.csdn.net/gfg156196   by--qihao 书接上文,上回说到了xposed,接下来就用一下,体验一下商业项目的赶脚…… 上一篇:史上最全 ...

随机推荐

  1. Python - 网络爬虫(Web Scraping)

    专栏 从零开始写Python爬虫:https://zhuanlan.zhihu.com/Ehco-python requests库的安装与使用:http://t.cn/RTuUuf7 BS4库的安装与 ...

  2. 浅谈模块系统与 ABP 框架初始化

    在 ABP 框架当中所有库以及项目都是以模块的形式存在,所有模块都是继承自AbpModule 这个抽象基类,每个模块都拥有四个生命周期.分别是: PreInitialze(); Initialize( ...

  3. Python快速学习04:循环 & 函数

    前言 系列文章:[传送门] 也就今天认识了 LC ,很开心. 本文目录 循环 for while 中断 函数 函数定义 函数调用 for循环 Python 中的for 循环象shell 脚本里的for ...

  4. MongoDB简单操作(java版)

    新建maven项目,添加依赖: <dependency> <groupId>org.mongodb</groupId> <artifactId>mong ...

  5. MongoDB高可用集群+MMS集群监控搭建

    备注: mongodb学习资料 http://www.runoob.com/mongodb/mongodb-tutorial.html 一. 集群的三个组件: mongos(query routers ...

  6. solr概况

    1.solr对比lucence lucence vs solr 类似于引擎 vs 汽车. 2. solr架构 3. 对应lucence/solr源码分析 RequestHandler 处理一个url请 ...

  7. maven 编译出现初始化异常:com/sun/tools/javac/code/TypeTags

    使用的式jdk11 lombok式1.16.4 错误原因:版本不匹配 升级lombok到1.18.4 问题解决

  8. 解读经典《C#高级编程》第七版 Page50-68.核心C#.Chapter2

    前言 本篇讲述Main方法,控制台,注释,预处理指令,编程规范等.这些概念比较琐碎,为避免长篇大论,主要以列举要点的方式来说明. 01 Main方法 Main方法并不是所有应用类型的入口方法,它只是控 ...

  9. 关于 Cortex-M3 的双堆栈机制

    CM3 的堆栈分为两个:主堆栈和进程堆栈. 那么,这两个栈分别在什么情况下使用呢? 我们看一下CM3的控制寄存器(CONTROL):控制寄存器用于定义特权级别,还用于选择当前使用哪个堆栈指针. CON ...

  10. HttpClient+Jsoup模拟登陆贺州学院教务系统,获取学生个人信息

    前言 注:可能学校的教务系统已经做了升级,当前的程序不知道还能不能成功获取信息,加上已经毕业,我的账户已经被注销,试不了,在这里做下思路跟过程的记录. 在我的毕业设计中”基于SSM框架贺州学院校园二手 ...