Fiddler 抓包 Android

引言

准备

  • Fiddler
  • Android 模拟器
    • 我这里是 夜神模拟器,BlueStacks蓝叠 模拟器 没找到 WLAN 设置

Fiddler 基本配置

参考:

  • 使用Fiddler+安卓模拟器对app抓包,包含https_f_yunsheng_t的专栏-CSDN博客_fiddler安卓模拟器抓包

Fiddler 配置代理, 允许远程的计算机连接

Fiddler 抓包 Android_第1张图片 Fiddler 抓包 Android_第2张图片

点击 OK,保存确定后, 需要重启 Fiddler 才能生效

Fiddler 配置 HTTPS

Fiddler启用https:Options中勾选"Decrypt HTTPS traffic"和"Ignore server certificate errors(unsafe)",弹出的提示都选Yes

Fiddler 抓包 Android_第3张图片

Android 模拟器 配置

参考:

  • Fiddler 抓包逍遥安卓模拟器_架构师的成长之路的博客-CSDN博客_逍遥模拟器抓包

配置 Android 模拟器的网络代理

打开 设置, 选择 WLAN, 在显示已连接的WIFI上长按鼠标左键,选择 修改网络 ,

Fiddler 抓包 Android_第4张图片 Fiddler 抓包 Android_第5张图片

勾选 高级选项

Fiddler 抓包 Android_第6张图片

选择 手动,填写本机 ip 以及 端口 ( 8888 )

Fiddler 默认为 8888

查看本机端口, cmd 执行

1      
ipconfig      
Fiddler 抓包 Android_第7张图片

图中 192.168.0.103 即为本机 ip,

我这里是 WiFi 连接,因此才是 Wireless LAN adapter WLAN, 如果是 网线连接 ,则是最上面的 以太网

Fiddler 抓包 Android_第8张图片

PS: BlueStacks蓝叠 模拟器居然没找到 WLAN 设置, 于是这里用 夜神模拟器

应该说,到这里,就可以抓包 HTTP 了

针对 HTTPS 的请求,需要在Fiddler中启用 HTTPS,并把Fiddler的证书安装到模拟器中

配置 Fiddler 抓包 模拟器 的 HTTPS

模拟器 安装 来自 Fiddler 的 HTTPS 证书 有两种方式:

  1. Fiddler 导出证书,然后模拟器 导入电脑文件, 然后安装证书
  2. 在模拟器中通过浏览器访问 Fiddler 的 http://ip:8888 ,下载安装证书

这里选择第二种方式,方便

如果打开后浏览器提示证书错误,点击 继续 即可

Fiddler 抓包 Android_第9张图片

点击下载 Fiddler 证书,下载完成后,点击安装,这里给证书取名,随便取,

凭据用途有两个选项:

  • VPN和应用
  • WLAN

我这里只安装 VPN和应用 ,也可以两个都安装一遍

Fiddler 抓包 Android_第10张图片

这里需要设置密码,设置好后即可

Fiddler 抓包 Android_第11张图片 Fiddler 抓包 Android_第12张图片

确定安装完毕;在 设置 - 个人 - 安全 - 信任的凭据 中, 用户 标签页可以看到安装的证书

Fiddler 抓包 Android_第13张图片 Fiddler 抓包 Android_第14张图片 Fiddler 抓包 Android_第15张图片

点击证书,可以查看详情

Fiddler 抓包 Android_第16张图片

接下来就可以打开Fiddler,在模拟器中打开浏览器测试下https的数据包是否可以正常抓到和解析了,以百度为例

打开模拟器默认带的浏览器,输入 m.baidu.com,百度现在默认使用https,随便搜索一下,查看刚才的包

Fiddler 抓包 Android_第17张图片

成功

部分 APP 不走 系统代理

参考:

  • 部分APP无法代理抓包的原因及解决方法(flutter 抓包) - lulianqi15 - 博客园 - 重要参考: 原理, 详解
  • 部分App无法使用系统代理抓包的原因及解决办法(Fiddler+Drony) - BYTEGOING - 博客园
  • 如何让app不走系统代理?_阳光下的小树-CSDN博客_app不走代理 - 重要参考
  • app不走系统代理?如何抓包?_Zdelta-CSDN博客_app不走代理如何抓包 - 重要参考

现象

设置系统代理后,依然抓不到包 ( 没有相关请求的包 ),但是 app 却依旧正常返回数据,没有断网。

使用 Fiddler 或 Charles 这类代理抓包软件默认情况下无法抓取请求的,

但使用 Wireshark 这类网卡抓包软件可以看到这些 APP 的流量,

就表明这些 APP 使用的主要应用层协议仍然是 HTTP(HTTPS)

Fiddler 或 Charles 这类使用的代理的抓包软件与 Wireshark 是完全不同的(Wireshark 使用的网卡数据复制,只要是经过指定网卡都会被抓取),其只能对使用代理的应用层网络协议生效,比如常见的HTTP(https),Websocket 。

APP 不走系统代理 原因/实现

网络请求代理设置 NO_PROXY

在网络请求的时候,通过OkHttp可以设置一个选项,代理的类型。我们在这里直接设置成Proxy.NO_PROXY。这样话即使android设置了代理,我们的app也不会走代理。

  • android系统设置的代理并不是强制对所有app生效的
  • app可以在网络请求类库中通过自定义代理设置,选择是否要走系统代理
1     
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void run() {     
Looper.prepare();
OkHttpClient okHttpClient = new OkHttpClient.Builder().
proxy(Proxy.NO_PROXY).//okhttp不设置代理
build();
Request request = new Request.Builder()
.url("http://www.baidu.com")
.build();
Response response = null;
try {
response = okHttpClient.newCall(request).execute();
Toast.makeText(this, Objects.requireNonNull(response.body()).string(), Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
Looper.loop();
}

解决

TODO: 未完

Q&A

补充

Fiddler 默认端口

Fiddler 抓包 Android_第18张图片

Fiddler 导出 HTTPS 证书

Fiddler 抓包 Android_第19张图片

代理抓包原理

参考:

  • 部分APP无法代理抓包的原因及解决方法(flutter 抓包) - lulianqi15 - 博客园

下面内容 来自上面的参考内容,根据自己理解,修改简化

原理

为什么Fiddler 或 Charles对这些APP无效,我们有必要先了解代理抓包我原理

Fiddler 或 Charles 这类使用的代理的抓包软件与Wireshark是完全不同的(Wireshark 使用的网卡数据复制,只要是经过指定网卡都会被抓取),其只能对使用代理的应用层网络协议生效,比如常见的HTTP(https),Websocket 。

这里以HTTP为例简单说明下

Fiddler 抓包 Android_第20张图片

客户端需要完成一次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或其他支持代理的协议都会连接同一个端口)。然后代理服务器会与客户端建立连接,再然后代理服务器根据请求信息再去连接真正的服务器。

Fiddler 抓包 Android_第21张图片

这里还有个细节正常在 没有代理 的情况下客户端向服务器发送的请求行里 只包含部分URI (实际上是没有方案,主机名及端口的)

Fiddler 抓包 Android_第22张图片

有代理的情况下,应该是 黄色标记的那样 完整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: 未复制完

参考

感谢帮助!

  • Fiddler安卓手机APP抓包-杰米博客
  • 关于Android 9.0 FD抓包证书处理-逆猿码
  • fiddler-003-抓取app视频,抓取抖音、西瓜、快手视频,小小的七色花,想抓保存什么就保存什么_哔哩哔哩_bilibili
  • B站最新Fiddler抓包(抓APP的包)全套完整教程_哔哩哔哩_bilibili
  • Fiddler抓包工具实战全网最全最细教程,没有之一【柠檬班】_哔哩哔哩_bilibili
  • 【决清教程】FD抓包工具Fiddler基本抓包-可以抓电脑或者安卓苹果手机_哔哩哔哩_bilibili
  • frida抓不到包解决办法_哔哩哔哩_bilibili

你可能感兴趣的:(Fiddler,Android,网络)