Android逆向之旅---爆破一款资讯类应用「最右」防抓包策略原理分析
一、逆向分析
首先感谢王同学提供的样本,因为王同学那天找到我咨询我说有一个应用Fiddler抓包失败,其实对于这类问题,我一般都会这么回答:第一你是否安装Fiddler证书了,他说他安装了。第二你是否用了我之前说的那个Xposed框架JustTrustMe,不了解这个框架的同学可以查看这里:Python爬取应用「英语流利说」的配音视频数据;他说了也用了。到这里我就没理由不帮他看了,自己下载了应用安装之后,的确有这个问题:
看到了,这里就是这样的提示,也没看到具体的请求参数啥的,所以这个就引发了我的兴趣,那么不多说了直接爆破吧,突破口很简单,直接全局搜这个接口api.izuiyou.com即可:
搜索结果很多,主要看纯接口那个,通过两三次的点击浏览最后定位到这一处:
到这里就看到了,其实他内部用的是okhttp进行网络请求的,使用AsyncTask类进行操作,但是在构建okhttp的时候他做了很多设置操作,首先是参数设置:
看到这个c类其实是设置okhttp的拦截器,这里简单看一下应该是post方式请求会把参数进行加密处理,我们看看那个加密代码:
这个不多说了,依然采用底层加密操作,到这里我们就直接hook它:
然后安装模块运行即可,然后我们手机不挂代理访问,这样就能正常拉取数据了,看看加密的都是啥信息,我们在首页进行下拉刷新操作:
看到了下拉数据接口是recommend的,然后参数就是请求参数信息,看到最后加密之后的只有一个sign字段了,应该是把参数放到so层进行加密处理了,那么这个加密逻辑不是本文的介绍重点,后续会继续单独介绍如何动态调试so来弄出加密算法。继续回到刚才设置了okhttp的拦截器之后,就设置okhttp的SSLSocketFactory和X509TrustManager值就是和证书相关的:
然后这里他自定义了一个SSLSocketFactory类,这个类中可以自定义的Socket信息:
一般都是在回调方法createSocket中处理通信的Socket信息:
然后就是okhttp的设置证书的方法调用了,后面的解决方案就是hook这个方法来
当然还有设置域名检查的方法HostnameVerifier,这里不多介绍了。那么现在可以看到抓包失败可能就是这三个值引起的,这个大家一定要熟悉okhttp框架的大致用法和原理,而且现在几乎很多应用都在用这个okhttp框架了,并且google官方已经把这个框架集成到系统中替换原来的apache的http框架了。所以后续如果抓包失败都可以直接分析应用中的这个框架即可。
到这里我们大致找到关键点了,不过这里需要说明一个现象就是抓包失败,在应用界面会看到有一个loading一直在转圈圈也就是这里有一个超时时间,诡异的是如果超时了,数据可以正常加载。但是这个超时太长了几乎几分钟。虽然最终可以看到数据也可以抓到包(文章开始说抓不到包是因为太慢了没心等待)。但是得解决这个问题不然等几分钟没法进行后面操作了。所以还得继续看这个问题吧。上面已经定位到问题大致就是okhttp设置了证书那些值导致的问题,那么是哪些值呢?我们先看看SSLSocketFactory这个类:
这个类的createSocket方法中处理了很多逻辑,那么我们在hook这个方法打印参数信息:
我们在方法调用前打印参数信息,方法调用结束之后打印结束信息,然后运行模块看日志信息:
我们挂了Fiddler代理之后看到打印的参数值信息了,不过可惜的是结束日志没有打印出来,那么问题就出在这个方法了,但是上面有好几处代码怎么定位到是哪个代码等待呢?这个我们可以选择对每个方法调用进行hook然后查看日志,但是这样太费劲了,这时候就需要一个技巧就是如果想定位到哪个方法等待,那么可以进行插入日志代码,看打印信息,但是我们加入很多日志,所以要区分是哪行日志打印了,所以这里有一个技巧就是通过获取当前方法被调用的行数来作为打印的信息,代码大致如下:
这样我们只需要调用log这个方法即可,因为这个方法是无参数的,在插入smali代码的时候有一条基本原则就是尽量把功能模块弄到一个static无参函数中,这样对于插入非常高效便捷也不会出错。有了这个java代码,然后用我之前写的java2smali工具直接运行即可,不了解这个工具的同学可以查看这里:Android中一键转化java2smali工具原理解析;然后就得到了对应的smali代码,然后我们对于这个app呢?不要去直接apktools反编译,因为反编译失败的,我们可以直接操作dex转化成smali即可,这个要用到baksmali和smali这两个工具,我们直接解压apk获取到classes.dex文件,然后执行命令:java -jar baksmali.jar -o classes classes.dex 其中classes是反编译dex之后的smali文件夹目录。然后把我们上面的MyLog.smali放到指定目录下,记住一定要有全路径,比如这里是cn.wjdiankong.log.MyLog,那么就要放到cn/wjdiankong/log/MyLog.smali,没有目录就自己手动新建即可。然后在上面想要插入代码的地方直接插入代码:invoke-static {}, Lcn/wjdiankong/log/MyLog;->log()V 这里我放了好几个:
记住放的地方别瞎乱放入,一般都在move-result...www.huarenyl.cn/ 语句之后也就是方法调用结束之后插入,不然回编译dex会报错的。插入之后就在用smali进行回编译:java -jar smali.jar classes -o classes.dex 其中classes是反编译的smali目录,classes.dex是回编译之后的dex。成功回编译得到新的dex之后,为了验证插入成功,可以用Jadx打开进行查看:
我们看到好几处都插入日志了,并且日志是携带行号的,这样就能区分是哪里的日志打印结果了,好了把这个插入代码的dex在塞到原来的apk中,然后二次签名即可,因为这个应用没有签名校验,所以直接看打印日志:
然后在回过头看看代码:
但是这个createSocket方法是系统的了?得去看源码查看为何等待那么久?对到这里我没去深入看了,因为不是本文研究的重点了,不过可以告诉大家如果感兴趣可以自己写个demo然后用okhttp访问一下接口也是这个createSocket方法等待很久。
二、解决方案
我们问题找到了,解决办法就简单了,为了能够正常抓包,直接把这个okhttp的证书hook修改成系统默认的即可:
然后拦截之前分析的那个设置okhttp的证书代码方法:
然后运行模块之后就可以愉快的抓包啦:
看到了这里就可以愉快的抓到数据包了,其实这里虽然我们知道了解决办法,但是其实内部的原因还是没弄清楚,就是知道原因是okhttp内部的问题,其实这个搜索可以发现内部实现机制的原因,不过这个对于我们不是重点,www.baohuayule.com 那么通过这个样本我们又可以总结一个www.wanmeiyuele.cn 遇到抓不到包的问题解决方案了,那就是全局搜SSLSocketFactory,然后看看应用是否设置了证书信息。如果有就拦截替换成系统默认的证书即可。
三、抓包失败解决方案
通过以往知道的知识以及本文的案例,那么我们就可以总结一下app中抓包失败的解决方案大致如下:
- 第一、确认Fiddler证书安装正确
- 第二、是否安装Xposed模块www.leyou1178.cn JustTrustMe信任所有证书
- 第三、查看应用中使用的okhttp中是否设置了SSLSocketFactory
其实除了这三个还有其他方式,还有其他方式,不过不在本文介绍了,后面会详细介绍如何防止自己的应用被被人恶意抓包,因为如果应用被人抓包其实很多破解操作就变的很简单了。把这个入口做的安全会对后面的防护有一定效果。
Android逆向之旅---爆破一款资讯类应用「最右」防抓包策略原理分析的更多相关文章
- Android逆向之旅---带你爆破一款应用的签名验证问题
一.前言 在之前的文章中说过Android中的安全和破解是相辅相成的,为了防止被破解.非常多应用做了一些防护策略.可是防护策略也是分等级.一般简单的策略就是混淆代码和签名校验.而对于签名校验非常多应用 ...
- Android逆向之旅---反编译利器Apktool和Jadx源码分析以及错误纠正
Android逆向之旅---反编译利器Apktool和Jadx源码分析以及错误纠正 http://blog.csdn.net/jiangwei0910410003/article/details/51 ...
- Android逆向之旅---SO(ELF)文件格式详解(转)
第一.前言 从今天开始我们正式开始Android的逆向之旅,关于逆向的相关知识,想必大家都不陌生了,逆向领域是一个充满挑战和神秘的领域.作为一名Android开发者,每个人都想去探索这个领域,因为一旦 ...
- Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)
Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码) 来源 https://blog.csdn.net/jiangwei0910410003/article/details/51 ...
- android黑科技系列——爆破一款应用的签名验证问题
一.前言 在之前的文章中说过Android中的安全和破解是相辅相成的,为了防止被破解,很多应用做了一些防护策略,但是防护策略也是分等级,一般简单的策略就是混淆代码和签名校验,而对于签名校验很多应用都是 ...
- Android逆向之旅---静态方式分析破解视频编辑应用「Vue」水印问题
一.故事背景 现在很多人都喜欢玩文艺,特别是我身边的UI们,拍照一分钟修图半小时.就是为了能够在朋友圈显得逼格高,不过的确是挺好看的,修图的软件太多了就不多说了,而且一般都没有水印啥的.相比较短视频有 ...
- [置顶] 我的Android进阶之旅------>介绍一款集录制与剪辑为一体的屏幕GIF 动画制作工具 GifCam
由于上一篇文章:我的Android进阶之旅------>Android之动画之Frame Animation实例 中展示的是Frame动画效果,但是之前我是将图片截取下来,不好说明确切的动画过程 ...
- 我的Android进阶之旅------>介绍一款集录制与剪辑为一体的屏幕GIF 动画制作工具 GifCam
由于上一篇文章:我的Android进阶之旅------>Android之动画之Frame Animation实例 中展示的是Frame动画效果,但是之前我是将图片截取下来,不好说明确切的动画过程 ...
- Android逆向之旅---基于对so中的section加密技术实现so加固
一.前言 好长时间没有更新文章了,主要还是工作上的事,连续加班一个月,没有时间研究了,只有周末有时间,来看一下,不过我还是延续之前的文章,继续我们的逆向之旅,今天我们要来看一下如何通过对so加密,在介 ...
随机推荐
- 吐血分享:QQ群霸屏技术教程(利润篇)
QQ群技术,不论日进几百,空隙时间多的可以尝试,日进100问题不大. QQ群技术,如何赚钱,能赚多少钱?不同行业,不同关键词,不同力度,不一样的产出. 群费 群费,这个和付费群是有区别的,群费在手机端 ...
- spark-day1
#!/usr/bin/python # -*- coding: utf_8 -*- from pyspark import SparkConf, SparkContext import os, tim ...
- 基于GTID的MySQL主从复制#从原理到配置
GTID是一个基于原始mysql服务器生成的一个已经被成功执行的全局事务ID,它由服务器ID以及事务ID组合而成.这个全局事务ID不仅仅在原始服务器器上唯一,在所有存在主从关系 的mysql服务器上也 ...
- linux实现DNS轮询实现负载平衡
DNS 轮询机制会受到多方面的影响,如:A记录的TTL时间长短的影响:别的 DNS 服务器 Cache 的影响:windows 客户端也有一个DNS Cache.这些都会影响 DNS 轮询的效果.因此 ...
- node 动态页面渲染
代码: 'use strict' const express = require('express'); const consoldiate = require('consolidate'); con ...
- Python3爬虫(八) 数据存储之TXT、JSON、CSV
Infi-chu: http://www.cnblogs.com/Infi-chu/ TXT文本存储 TXT文本存储,方便,简单,几乎适用于任何平台.但是不利于检索. 1.举例: 使用requests ...
- (数据科学学习手札02)Python与R在循环语句与条件语句上的异同
循环是任何一种编程语言的基本设置,是进行批量操作的基础,而条件语句是进行分支运算的基础,Python与R有着各自不同的循环语句与条件语句语法,也存在着一些相同的地方. Python 1.for循环 ' ...
- SKIP(插入空行)
WRITE 'This is the 1st line'. SKIP. WRITE 'This is the 2nd line'. 跳转至某一行 SKIP TO LINE line_number. 插 ...
- MVC4+EF 列表数据不能绑定
最新准备使用.net 的mvc+Ef来写个项目,开始一切顺利,到了数据绑定时出现了问题. 我的mvc视图引擎是Razor,后台提取数据的是Linq来处理,发现不管怎么样都不能绑定列表数据,可以将后台的 ...
- 深度学习:激活函数的比较和优缺点,sigmoid,tanh,relu
https://blog.csdn.net/u011684265/article/details/78039280