1.Fiddler安装、设置
1.1 首先安装Fiddler;下载地址 https://www.telerik.com/download/fiddler ,安装直接默认就行,安装完后打开Fiddler。
1.2 抓包设置 Tools –> Options



【HTTPS】–> “Decrpt HTTPS traffic”, Fiddler就可以截获HTTPS请求,第一次会弹出证书安装提示,若没有弹出提示,勾选Actions-> Trust Root Certificate 安装证书。
- 【HTTPS】–> “Ignore servercertificate errors” 勾选上 ,监听访问的 HTTPS 站点使用的可以是不可信的证书。
【HTTPS】–> 手机上设置代理后,这时候fiddler上抓到的是pc和app所有的请求,如果pc上打开网址,会很多,这时候就需要开启过滤功能了
- from all processes 抓所有的请求
- from browsers only 只抓浏览器的请求
- from non-browsers only 只抓非浏览器的请求
- from remote clients only 只抓远程客户端请求
【Connections】–> “Allow remote computers to connect” ,需要抓局域网内其他机器的包,设置允许远程连接
- 重启Fiddler生效。
- 1.3 注意:
- Fiddler 是以代理web服务器的形式工作的,它使用默认代理地址:127.0.0.1,端口:8888,也就是说默认监听在安装本机的127.0.0.1::8888,如果需要抓局域网内其他机器的包,需要勾选上 “Allow remote computersto connect” ,允许远程设备连接,会设置监听为0.0.0.0:8888
- 当Fiddler退出的时候它会自动注销,这样就不会影响别的 程序。不过如果Fiddler非正常退出,这时候因为Fiddler没有自动注销,会造成网页无法访问,解决的办法是重新启动下Fiddler。
2. android系统设置
- 2.1 查看安装Fiddler电脑的IP地址,控制台输入 ipconfig。

- 2.2 手机连接wifi,并设置代理

- 2.3 重启app,通过fiddler可以看到app的请求
3. https抓包(手机需要ROOT,安装Magisk)
3.1 导出代理程序证书到桌面 Tools –> Options –> HTTPS –> Actions –> Export Root Certificate to Desktop ,将证书拷贝到手机;
3.2 或手机直接连接fiddler代理后访问 ip:8888 直接下载证书,
3.3 手机 ——> 设置——>安全——>加密与凭据——>从设备存储空间安装——>找到证书,点击安装。(各种安卓系统路径可以稍有不同)
3.4 Android7以后,系统不再信任用户级的证书,只信任系统级的证书,所以要抓包就需要把我们的代理程序证书安装至Android的系统目录中。网上提供了一些方案,这里使用Magisk的模块 【Move Certificates】 插件地址 https://github.com/yochananmarqos/Move-Certificates
Move Certificates 原理是将用户目录的证书移动到系统目录证书上面
安装代理程序证书到用户上,安装Move Certificates模块,重启手机,证书被移动到了系统目录
3.5 重启app,通过fiddler可以看到app的https请求
4. 通过FiddlerScript修改请求参数
4.1 在Fiddler 中点击菜单“Rules > Customize Rules”打开FiddlerScript Editor 编辑器,在这里可以编写Fiddler Script 脚本 。
4.2 FiddlerScript Editor 编辑器 提供简单的api和语法提示,下载 fsesetup.exe
4.3 参考
4.4 例子
平时生产环境经常遇到一些账号有问题,但是如果想要复现bug,就需要登录对应的账号。因为没有短信验证码所以登录很麻烦。我们可以通过登录管理员账号,再修改每次请求中的token,来实现看到对应账号的问题。
缓存增加问题账号的登录token
script 1
2
3缓存增加登录token
hset h_session:CD50FA11508C438F974F0BFA878007EE f_id 1736392595984105980
hset at:CD50FA11508C438F974F0BFA878007EE at_id 1app登录开发使用的账号,通过Fiddler 拿到token
- 使用FiddlerScript修改token,OnBeforeRequest(oSession: Session)中增加逻辑
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35// 拦截host中包含 17house.com 的请求
if ( oSession.hostname.Contains("17house.com")) {
//原请求中的token
var oldToken = "408BE9A3DFDD40B498F225C08145719B";
//要替换的token
var newToken = "CD50FA11508C438F974F0BFA878007EE";
if(oSession.HTTPMethodIs("GET")){
//get请求,token在url的上,替换url上的token
FiddlerObject.log("======================fullUrl = "+ oSession.fullUrl);
oSession.fullUrl = oSession.fullUrl.Replace(oldToken,newToken);
FiddlerObject.log("======================new,fullUrl = "+ oSession.fullUrl);
}else if(oSession.HTTPMethodIs("POST")){
//post请求
if(oSession.RequestHeaders.AllValues("Content-Type").Contains("json")){
//token在 body 的json中
var jsonString = oSession.GetRequestBodyAsString();
FiddlerObject.log("======================jsonString = "+ jsonString);
jsonString = jsonString.Replace(oldToken,newToken);
FiddlerObject.log("======================new,jsonString = "+ jsonString);
oSession.utilSetRequestBody(jsonString);
}else{
//formdata方式提交,postParam的结构 a=1&b=2&c=3
var postParam = oSession.GetRequestBodyAsString();
FiddlerObject.log("======================postParam = "+ postParam);
postParam = postParam.Replace(oldToken,newToken);
FiddlerObject.log("======================new,postParam = "+ postParam);
oSession.utilSetRequestBody(postParam);
}
}
//FiddlerObject.log("======================end");
}
修改响应
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
static function OnBeforeResponse(oSession: Session) {
if (m_Hide304s && oSession.responseCode == 304) {
oSession["ui-hide"] = "true";
}
//下面为追加代码
if(oSession.fullUrl.Contains("/housekeep/getOrderInfo")){
//获取响应内容
var responseStr = oSession.GetResponseBodyAsString();
//解析JSON,如果需要改变的是Body内容,则不需要解析JSON这步
//var jsonStr = Fiddler.WebFormats.JSON.JsonDecode(responseStr);
//jsonStr.JSONObject["data"]["allotList"][0]["vendorName"] = "Jack";
//封装修改后的JSON,如果需要改变的是Body内容,则不需要封装JSON这步
//var mod_json = Fiddler.WebFormats.JSON.JsonEncode(jsonStr.JSONObject);
//将封装后的JSON放入Response中
//oSession.utilSetResponseBody(mod_json);
responseStr = responseStr.Replace("赵亚娟总监","赵亚娟123123总监");
//将封装后的responseStr放入Response中
oSession.utilSetResponseBody(responseStr);
}
}