抓包工具
抓包就是在客户端和服务端之间,再加上一个代理服务器,这个代理服务器可以拦截发送的数据包,对数据包进行查看、操作、放行
抓包工具的分类
工具 | 工具 |
---|---|
全局抓包工具 | ==Http v7==、Http debugger pro |
代理抓包工具 | ==Charles==、Fiddler |
VPN抓包工具 | ==HttpCanary== |
网卡抓包工具 | ==WireShark== |
手机抓包工具 | tcpdump |
Hook抓包工具 | ==r0Capture== |
Charles
下载安装激活
Charles免费激活:https://zzzmode.com/mytools/charles/
抓包手机
Charles如何抓包手机呢,Charles安装在电脑上,抓包手机就相当于抓包另一台电脑,需要一些配置
设置一个端口,找到IP地址
将SOCKS代理打开
IP地址
使用VPN软件链接主机的IP的指定端口,将IP地址和端口配置给SocksDroid然后打开,成功之后会有一个VPN样式
还可以更改模拟器WiFi的IP地址和端口,手动更改WiFi的代理服务器主机和端口,让主机Charles监听的端口作为代理端口,这个时候就不能使用SOCKS协议端口了,需要配置http端口
关闭对Windows电脑的抓包
现在不能抓到https,所以还需要一些配置
打开 Proxy
-> SSL Proxying Setting
为了方便可以给第一个配置两个*。Exclude是设置排除的不用管
在模拟器中访问:http://chls.pro/ssl
证书不安全问题
一般来说这就已经成功了,但我测试的时候没有数据,而且还提示证书不安全
因为在安卓7之后系统只信任系统证书,需要把用户证书移动到系统证书目录
这些解析的https数据也是错误
这个时候需要找到证书的目录了,将安装的证书,放到受信任证书的目录下
模拟器就设置可以写入和开启root
如果是真机的话就需要Magisk中的模块来移动证书了,没有真机不做演示了
找到 /data/misc/user/0/cacerts-added 这个目录,如果安装了证书这里会有一共 .0 文件,将这个文件移动/复制到 /system/etc/security/cacerts 目录下
这个名字是根据哈希计算的,后面加 .0 如果是哈希值存在一样的就是 .0 .1
现在再进行抓包即可获取到解密后的数据
如此如此这般这般,Charles抓包手机就完成了
HttpCanary
这是一个VPN抓包工具相当于上面Charles和socksdroid的组合,而且他比Charles和socksdroid的组合好用,抓包更多,解析更多
HttpCanary可以按照引导直接将证书移动到安全目录下,如果不能移动的话,参考上方的方法
配置完成就可以使用了
r0capture
一个Hook抓包脚本,主要原理就是Hook了一些SSL相关的系统函数,直接抓取系统发送的一些明文数据
这个东西是开源的,可以抓取大部分按照框架写的app,如果有魔改的就需要有一定的逆向能力了
GitHup地址:https://github.com/r0ysue/r0capture
配置hook
下载frida
因为r0capture是一个python脚本,需要python3.6以上的环境,下载几个python库
1 | pip install frida-tools |
配置好本地Frida之后,查看frida版本,查看手机cpu类型
1 | frida --version |
配置frida-server
去下载对应版本的对应类型的frida-server
https://github.com/frida/frida/releases
下载对应版本下载到手机的 /data/local/tmp/
目录下
1 | 进入手机端命令:adb shell |
执行 frida-ps-U
成功效果如下
执行上方语法出现一下情况
attach模式是选择app在你感兴趣的地方开始抓包。
apawn模式是系统开始抓包,从打开app开始
使用r0capture抓取的是明文内容,因此并不需要证书
END
使用方式
r0capture有两种使用方式
1 | attach模式,抓包内容可以保存为pacp文件供后续分析 |
抓包原理
1 | 1、为什么Charles要配合socksdroid使用 |

访问一个链接之后就会返回一个证书,包含RSA的公钥
这个时候在加上抓包工具的代理服务端考虑一下
未安装证书之前也能够抓包,但是是加密后的数据,这样一看是不是可以理解一些了
代理服务端,作为客户端和服务端的中间人,这个中间人要获取抓包数据的话需要先安装一个证书。
先伪造一个公钥发送给客户端,客户端将加密后的对称密钥返回给代理抓包服务端,这个服务端获取到密钥之后,就可以读取到后续客户端和服务端之间的通讯
浏览器是不能辨别真实的服务端和代理服务端的
但是之前配置证书时,还需要信任证书,提示不安全什么的。
浏览器检验的是证书路径/证书链
最后找到这个根证书,就是自己给自己颁发的一个证书。那么为什么这个证书安全呢
就是因为在受信任的根证书颁发机构下,如果这个系统库有的证书,浏览器就认为是安全的,就不会有提示
但是呢,如果APP端和服务端是同一个团队开发的,开发过程中一般会设置双向验证来验证证书
为什么不直接替换证书信息呢
这个就涉及到证书的签名信息了
数字证书包含信息:使用者、颁发者、有效期、公钥、指纹、==签名信息==
用户发送信息的时候会使用数字签名算法 如:md5withrsa、sha1withrsa、sha256withrsa
,在是把两个算法组合在一起
1 | 使用: |
在服务端的视角上,因为服务端签发的证书嘛。
这个会输出一个值,这个值是字符串先进行sha256的一个加密,然后进行的RSA私钥加密。发送数据的时候发送的是明文+数字签名加密后的数据。如果更改了明文,使用公钥解密后,在对明文sha256比对结果,会比对失败。
因此,证书是不能够伪造的,不能改变,否则sha256的值也变,校验就会失败,无法正常通信
这个的重点在于,RSA的加密签名信息无法更改,这就断绝了更改证书的可行性,除非你能拿到服务端的私钥
HTTP协议
常规协议头
协议头有请求头和响应头两种
协议头包含起始行、首部字段、包体
1 | //访问方式资源路径和GET参数 协议/版本号 |
GET /v2/getpublickey?x=100&y=200 HTTP/1.1
:就是起始行包含了一个GET传参方式和HTTP协议以及版本号,中间的资源路径是相对路径,要和下方的Host拼接成完整的路径
Accept: */*
:如果是 */*
表示所有的数据都能接收
Accept-Language
:这个包含的q值越大表示比重越大
User-Agent: Mozilla/5.0 (Windows NT 6.1; w0W64; rv:48.0) Gecko/20100101 Firefox/48.0
:以下的表示为浏览器的返回,和apk返回不太一样,如果apk返回了这样的代理可能是app是个H5app,内置了html页面。这也是一个判断小技巧
上面是GET,POST比GET多几个东西
1 | //提交的数据包的长度不能多也不能少一个字节winhttp自动生成可以不附加 |
自定义协议头
这里的sign、t、qyid都是自定义的协议头,如果要更改的话,不要更改他的位置。有些网站会在协议头里传递重要数据,并且一般是会变化的。如果网站监测,就要找到来源,附加协议头提交

cookie
这个简单了解一下进行,因为安卓中cookie使用不多。了解即可,最后没办法再考虑这个
1 | 1、cookie的分类 |