盒子
盒子
文章目录
  1. 1.Fiddler安装、设置
  2. 2. android系统设置
  3. 3. https抓包(手机需要ROOT,安装Magisk)
  4. 4. 通过FiddlerScript修改请求参数

用Fiddler在Android上抓包

1.Fiddler安装、设置

  • 1.1 首先安装Fiddler;下载地址 https://www.telerik.com/download/fiddler ,安装直接默认就行,安装完后打开Fiddler。

  • 1.2 抓包设置 Tools –> Options

    • 1
    • 1
    • 1

    • 【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。
    1
  • 2.2 手机连接wifi,并设置代理
    1
  • 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 1
      • app登录开发使用的账号,通过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);
      }

      }