WLAN
设置参考:
Fiddler 配置代理, 允许远程的计算机连接
点击 OK
,保存确定后, 需要重启 Fiddler 才能生效
Fiddler启用https:Options中勾选"Decrypt HTTPS traffic"和"Ignore server certificate errors(unsafe)",弹出的提示都选Yes
参考:
打开
设置
, 选择WLAN
, 在显示已连接的WIFI上长按鼠标左键,选择修改网络
,
勾选
高级选项
选择
手动
,填写本机 ip 以及 端口 ( 8888 )Fiddler 默认为 8888
查看本机端口, cmd 执行
1 ipconfig图中
192.168.0.103
即为本机 ip,我这里是
WiFi 连接
,因此才是Wireless LAN adapter WLAN
, 如果是网线连接
,则是最上面的以太网
PS: BlueStacks蓝叠 模拟器居然没找到
WLAN
设置, 于是这里用 夜神模拟器
应该说,到这里,就可以抓包 HTTP 了
针对 HTTPS 的请求,需要在Fiddler中启用 HTTPS,并把Fiddler的证书安装到模拟器中
模拟器 安装 来自 Fiddler 的 HTTPS 证书 有两种方式:
- Fiddler 导出证书,然后模拟器 导入电脑文件, 然后安装证书
- 在模拟器中通过浏览器访问 Fiddler 的 http://ip:8888 ,下载安装证书
这里选择第二种方式,方便
如果打开后浏览器提示证书错误,点击
继续
即可
点击下载
Fiddler
证书,下载完成后,点击安装,这里给证书取名,随便取,凭据用途有两个选项:
- VPN和应用
- WLAN
我这里只安装
VPN和应用
,也可以两个都安装一遍
这里需要设置密码,设置好后即可
确定安装完毕;在
设置
-个人
-安全
-信任的凭据
中,用户
标签页可以看到安装的证书
点击证书,可以查看详情
接下来就可以打开Fiddler,在模拟器中打开浏览器测试下https的数据包是否可以正常抓到和解析了,以百度为例
打开模拟器默认带的浏览器,输入 m.baidu.com,百度现在默认使用https,随便搜索一下,查看刚才的包
成功
参考:
设置系统代理后,依然抓不到包 ( 没有相关请求的包 ),但是 app 却依旧正常返回数据,没有断网。
使用 Fiddler 或 Charles 这类代理抓包软件默认情况下无法抓取请求的,
但使用 Wireshark 这类网卡抓包软件可以看到这些 APP 的流量,
就表明这些 APP 使用的主要应用层协议仍然是 HTTP(HTTPS)
Fiddler 或 Charles 这类使用的代理的抓包软件与 Wireshark 是完全不同的(Wireshark 使用的网卡数据复制,只要是经过指定网卡都会被抓取),其只能对使用代理的应用层网络协议生效,比如常见的HTTP(https),Websocket 。
网络请求代理设置 NO_PROXY
在网络请求的时候,通过OkHttp可以设置一个选项,代理的类型。我们在这里直接设置成Proxy.NO_PROXY。这样话即使android设置了代理,我们的app也不会走代理。
- android系统设置的代理并不是强制对所有app生效的
- app可以在网络请求类库中通过自定义代理设置,选择是否要走系统代理
1 |
public void run() { |
TODO: 未完
参考:
下面内容 来自上面的参考内容,根据自己理解,修改简化
为什么Fiddler 或 Charles对这些APP无效,我们有必要先了解代理抓包我原理
Fiddler 或 Charles 这类使用的代理的抓包软件与Wireshark是完全不同的(Wireshark 使用的网卡数据复制,只要是经过指定网卡都会被抓取),其只能对使用代理的应用层网络协议生效,比如常见的HTTP(https),Websocket 。
这里以HTTP为例简单说明下
客户端需要完成一次HTTP请求,通常需要先找到服务器,客户端会根据http请求中url的主机名(实际会使用host中的主角名)及其端口与目标主机建立tcp连接,建立连接后会将http报文发送给目标服务器 (更多细节请参考https://tools.ietf.org/html/rfc7232)
接下来我来看下HTTP代理是如何运作的,我们启动Fiddler 或 Charles就是启动了一个HTTP代理服务器,这类工具会通知操作系统,“现在我在系统上创建了一个HTTP代理,IP为XXXXXX端口为XX。如果您使用的是linux您可以手动通知操作系统(export http_proxy=ip:port export https_proxy=$http_proxy),如果您使用的是手机等移动设备您可以在当前wifi设置处告诉系统你要使用http代理。 现在我们已经告诉系统我们想要使用代理,这个时候运行在系统上的http客户端再去发送请求的时候,他就不会再去进行DNS解析,去连接目标服务器,而是直接连接系统告诉他代理所在的地址(代理的ip及端口,注意无论是http或https或其他支持代理的协议都会连接同一个端口)。然后代理服务器会与客户端建立连接,再然后代理服务器根据请求信息再去连接真正的服务器。
这里还有个细节正常在 没有代理 的情况下客户端向服务器发送的请求行里 只包含部分URI (实际上是没有方案,主机名及端口的)
有代理的情况下,应该是 黄色标记的那样 完整URL
如上图如果在没有代理的情况下,对 www.baidu.com/index.html 的请求的请求行实际上是 GET /index.html HTTP/1.1 其实并不是我们常见的完整uri。因为在原始的HTTP设计中没有考虑中间服务器(即代理)的情况,客户端在发送报文前已经知道服务器的地址并与之建立了连接,没有必要再发送方案,主机名及端口。不过代理出现后这种做法就会有问题了,客户端连接了代理服务器,而代理服务器却没有办法连接正确的服务器。因此客户端发送给代理的请求其实稍有不同,客户端会在请求行里使用完整的uri,这样代理服务器才能解析真实的服务器的地址。
现在我们的请求实际上都是通过代理服务器(Fiddler 或 Charles)发送出去的,所以代理抓包软件不仅知道http请求及响应的所有报文,甚至还可以随时修改请求及响应。
代理抓包的关键就是需要HTTP客户端按照要求去连接代理服务器
一般情况下我们已经在系统层面上设置了代理,通常http客户端都是按要求去实现的,在进行http请求前会先检查系统代理,如果有设置代理,客户端会直接使用完整uri去连接代理服务器。不同的平台通常会实现自己的的http客户端的,虽然他们都按照协议要求实现了代理功能,但是并不一定在默认情况下会直接使用系统代理。
在现实中这种况下这种情况还不少,Flutter 就是这种情况,默认Flutter不会主动使用系统代理,需要单独设置。(当然个人认为这种策略也是有理由,虽然给测试及调试带来了不便不过也在一程度上提高了些许数据安全)
正是因为HTTP客户端没有使用我们设置的系统代理,他们自然也不会连接Fiddler 或 Charles创建的代理服务器,最终导致我们无法获取任何请求。
不过既然我们已经知道了Fiddler 和 Charles不能抓包的具体原因,前面也提到了代理抓包的原理,那我们就总有办法解决。
前面说到了我们APP使用的HTTP客户端没有连接到代理服务器,导致我们的代理抓包软件无法正常抓包,那我们只要想办法让客户端重新连接到代理服务器就好了(当然这一切都是以不修改客户端软件APP为前提的)
方法1:控制DNS解析,通过修改dns的方式让客户端以为我们的代理服务器就是目标服务器。
优势:
- 操作方便,通过修改设备的hosts可以十分方便的首先
劣势:
- 需要为每个需要操作的域名提前添加host
- 在手机等手持设备上难以修改hosts(即对移动APP这类应用很难实现)
方法2:在网络设备上直接做流量转发,将指定终端设备上发往80及443端口的数据直接转发到代理服务器的 目标端口上
优势:
- 可以针对连接到网络设备上的终端设备进行分别配置,而手机等终端设备不需要进行任何设备
劣势:
- 需要单独的硬件设备
方法3:使用VPN将终端设备的流量转发到代理服务器
优势:
- 使用VPN软件不用添加其他测试。
劣势:
- 终端上的VPN默认会直接对所有流量进行转发,要进行合理的配置可能需要额外的学习成本
TODO: 未复制完
感谢帮助!