问题:手机端或者模拟器设置了网络代理后,有些应用程序APK的数据包也抓不到。这是因为这些应用程序虽然可能实现了代理功能,但是在默认情况下并不一定会直接使用系统代理。
解决方案:使用VPN,将所有的流量都转发到代理服务器上,然后通过代理服务器再抓取需要的数据包。
0x01 代理抓包原理
Fiddler 或 Charles 这类使用的代理的抓包软件与Wireshark是完全不同的:
- Wireshark 使用的网卡数据复制,只要是经过指定网卡都会被抓取
- Fiddler 或 Charles 只能对使用代理的应用层网络协议生效,比如常见的HTTP(https),Websocket 。
代理过程:当设置了代理后,数据会先发送给代理服务器,然后再发给目标服务器。
没有设置代理时,请求会先DNS解析地址,然后根据解析地址去连接目标服务器。而设置了代理之后,请求就不会DNS解析了,而是直接连接系统告诉它的代理地址,再由代理根据请求信息去连接目标服务器。
根据这两种设置情况,可以推断出在这两种过程中传递请求数据内容会有点差异:
在没有设置代理的过程中,由于DNS已经解析出了目标服务器的地址,所以请求信息中只含有目标服务器的请求资源路径,并携带没有目标地址,所以是不完整的URL。而设置了代理后,发送给代理服务器的请求信息中是含有完整的URL信息,因为需要告知代理服务器,我们的目标是谁。

正常流程:

流程结构图:

0x02 解决思路
抓包软件不能抓到部分应用的数据包,是因为它默认没有走代理服务器,所以我们只需要将它连到代理服务器上就行了。
这边提供三种解决思路:
- 方法1:控制DNS解析,通过修改dns的方式让客户端以为我们的代理服务器就是目标服务器。
优势:操作方便,通过修改设备的hosts可以十分方便的首先
劣势:需要为每个需要操作的域名提前添加host
在手机等手持设备上难以修改hosts(即对移动APP这类应用很难实现)
- 方法2:在网络设备上直接做流量转发,将指定终端设备上发往80及443端口的数据直接转发到代理服务器的目标端口上
优势:可以针对连接到网络设备上的终端设备进行分别配置,而手机等终端设备不需要进行任何设备
劣势:需要单独的硬件设备
- 方法3:使用VPN将终端设备的流量转发到代理服务器
优势:使用VPN软件不用添加其他测试。
劣势:终端上的VPN默认会直接对所有流量进行转发,要进行合理的配置可能需要额外的学习成本
0x03 解决方案
为了抓到这些不直接使用系统代理的应用程序,我使用了VPN来流量转发。因为这种方法比较方便配置。
使用软件:
📎platform-tools-latest-windows.zip
配置的环境主要在模拟器上,所以需要一个模拟器,使用的MuMu模拟器

设置一下模拟器,打开Root权限以及可写系统盘(后需要放入证书文件)




接下来就是设置VPN,这里使用Drony。它会把手机所有流量都重定向到自身,而不是VPN服务器,所以我们就可以管理手机上的流量了,甚至是对单个APP进行配置。

打开软件,可以看到最下面就是开关按钮了(按钮状态体现当前状态)。

上述日志信息如下:
- addDnsServer add to vpn:添加DNS服务器地址,一般是网络的默认网关
- interfaceAddress:列出当前系统的网络接口及其 IP 地址配置(中括号内为广播地址)
- addRoute:向路由表中添加一个新路由 ,表示VPN将流量引导到该地址/网段
- addAddress:为网络接口分配一个 IP 地址,该地址为分配给 VPN 或网络接口的地址
- Proxy listening on: 设置代理服务器监听的地址和端口
8019 和 8020 是 Drony 的本地监听端口,手机的流量会先通过这些端口被 Drony 捕获,然后再转发到远程代理服务器或目标服务器。
上述配置其实也是手机的网络设置:

接下来配置Drony转发,右滑进入设置页面,找到所使用的网络类型

在网络列表中,选择所连接的网络

在网络细节中,将代理类型设置为手动,并填写代理服务器的IP地址和端口(代理入口),最后选择代理方式为普通http代理以及过滤器允许全部。


点击规则进入详情

点击添加进行编辑新规则

规则默认为空,只有符合规则的流量才会进行转发
网络ID选择当前使用的网络,行动选择本地代理链全部,应用程序选择为你所需要进行代理的目标应用程序。

主机名及端口不填则表示所有的都会被强制代理,因为APP可能会使用其他的网络协议不一定都是http。
当不希望把所有流量都引流到http代理服务器,就就使用这个配置指定ip及端口才进行转发
完成后保存即可,然后返回日志页面,点击下面按钮,使其处于开的状态(表示启用)

接下来就来配置我们的抓包软件,这里以 Charles 示例:
在Charles主页面点击顶部菜单栏— Proxy(代理)— Proxy Settings(代理设置),设置Port为8080


回到Charles主页面,点击顶部菜单栏— Proxy — SSL Proxying Settings,勾选启用SSL代理,添加主机和端口都为*,并保存。


返回Charles主页面,点击顶部菜单栏— Help— SSL Proxying — Install Charles Root Certificate,安装证书,完成后重启Charles即可。







因未模拟器ROM在访问本地api时使用的是虚拟网络ip,ip地址为10.0.2.2。在接入Charles代理后,10.0.2.2需要被映射为127.0.0.1,才可正常使用
模拟器使用 10.0.2.2 来访问宿主机的本地服务,但 Charles 作为代理工具,它拦截的是宿主机的网络流量。如果模拟器继续使用 10.0.2.2,Charles 可能无法正确地转发或捕获这个请求。
在Charles主页面点击顶部菜单栏— Tools — Rewrite。

在弹出的Rewrite Setting界面内,勾选Enable Rewrite,启用rewrite功能,并点击Untitled Set。

点击Untitled Set后,点击Rewrite Setting界面右上侧的Add,在弹出的Edit Location界面内,将protocol改为http,再将Host改为10.0.2.2,点击OK保存。

返回Rewrite Setting界面,点击界面右下侧的Add,在弹出的Rewirte Rule界面内,将Type更改为Host,Match—Value改为10.0.2.2(需要勾选Match whole value),之后将Replace—Value改为127.0.0.1(需要选择Replace all),点击OK保存后,再勾选Rewrite Setting界面右下侧的Host,保存即可。

总的映射配置如下:

至此,就可以抓到指定应用程序的流量了。

但是可以发现流量数据是未解密的,这是因为没有安装证书,无法进行加解密。
接下来,就进行证书的安装过程。
在Charles主页面点击顶部菜单栏—Help— Save Chales Certificate—保存到本地,如保存为Charles.pem。


使用cmd进入桌面(文件保存路径),使用openssl工具
openssl x509 -inform PEM -subject_hash_old -in charles.pem

OPenssl下载地址:Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions

根据显示输出结果第一行类似:2c8f9d86,则将Charles.pem更名为2c8f9d86.0
然后返回Charles主页面,点击顶部菜单栏Help —Local IP Address,获取到IP Address(IP 地址端口)

根据使用的IP地址,对模拟器进行网络代理配置。返回模拟器主页面,点击桌面系统应用—设置—网络与互联网—互联网,点击WiFi右侧设置,进入WiFi详情页面并点击右上角编辑,打开高级选项,将代理切换为手动,代理主机名填入Charles获取到的IP地址,代理端口填入8080之后保存。

启用需要配置抓包的模拟器,输入以下命令行导入证书,导入完成后重启模拟器即可进行抓包。
adb kill-server
adb connect 127.0.0.1:7555
adb root
adb connect 127.0.0.1:7555
adb push xxxx.0 /system/etc/security/cacerts
adb shell "chmod 664 /system/etc/security/cacerts/d0c556f7.0"

使用adb root命令时,模拟器会弹出一个请求,需要允许,不要放在后台忽略了。

注:7555为MuMu模拟器通用端口
参考文章:

4575

被折叠的 条评论
为什么被折叠?



