You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#版Fiddler中实现Cookie头重写与URL重定向?

问题:在Fiddler中复现Chrome扩展的URL重定向与Cookie头改写功能

我朋友为我开发了一款Chrome扩展,可将网络中的指定文件重定向至目标文件,同时能改写请求的Cookie头。以下是该Chrome扩展的代码:

if (typeof browser !== 'undefined') {
    chrome = browser
}

var cookievalue = "0"

function createRedirect(target, redirect) {
    
    let rewriteCookieHeader = (e) => {
        for (var header of e.requestHeaders) {
          if (header.name.toLowerCase() === "cookie") {
            header.value = "si=" + cookievalue;
          }
        }
        return {requestHeaders: e.requestHeaders};
    }

    chrome.webRequest.onBeforeSendHeaders.addListener(
        rewriteCookieHeader,
        {urls: [redirect]},
        ["blocking", "requestHeaders"]
    )  
    
    chrome.webRequest.onBeforeRequest.addListener((details) => {
        return { redirectUrl: redirect }
    }, { urls: [ target ] }, ["blocking"])
}

function postJson(url, json) {
    return new Promise(function(resolve, reject) {
        var xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function() {
            if (this.readyState == 4 && this.status == 200) {
                resolve(this.responseText);
            }
        };
        xhttp.onerror = function() {
            reject()
        }
        xhttp.open("POST", url, true);
        xhttp.setRequestHeader("Content-Type", "application/json");
        xhttp.send(JSON.stringify(json));
    })
}

function Tulc(info)
{
    this.trainerId = info.trainerId
    this.url = {}
    this.url.login = info.baseURL + "/login/signin"
    
    this.user = null
    this.setUser = user => this.user = user
    this.getUser = () => this.user
    this.login = password => {
        this.setUser(null)

        var requestInfo = {}
        requestInfo.trainerId = this.trainerId
        requestInfo.password = password

        return new Promise((resolve, reject) => {
            postJson(this.url.login, requestInfo).then((response) => {
                try {
                    response = JSON.parse(response)
                    if (response.status == "success") {
                        this.setUser({name: response.name})
                        cookievalue = response.cookie
                        resolve(this.getUser());
                    } else { reject() }
                } catch (e) {console.log(e); reject()}
            }, () => {
                reject()
            })
        })
    }
}

chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
    if (request.command == "LoginPassword" && request.message) {
        tulc.login(request.message).then((user) => {
            sendResponse(user)
            pocoyo(tulc.getUser())
        }, () => {
            sendResponse()
        })
        return true
    }
    return false
});

function pocoyo(user)
{
    chrome.browserAction.setPopup({popup: "popup/options.html"})
                                                                                                       
   
    
     createRedirect("https://wc-fb-cdn7.kixeye.com/game/game-v7.v59902/WarCommander.js*", "https://www.warcommander.cheatenginebrasil.com.br/scripts/ryan.js")  
                     

}

var tulc = new Tulc({baseURL: "https://www.warcommander.cheatenginebrasil.com.br/tulc/ext"});
chrome.browserAction.setPopup({popup: "popup/login.html"})

我尝试在C#版Fiddler中复现该功能,编写了以下代码:

public void AutoTamperRequestBefore(Session oSession)
{
    if (oSession.uriContains("WarCommander.js"))
    {
        oSession.fullUrl = "https://nextgenerationhackers.com/uploads/wc/WarCommander.js";
        //oSession.url = "https://nextgenerationhackers.com/uploads/wc/WarCommander.js";
    }
}
if (oSession.uriContains("WarCommander.js"))
{
    oSession.utilDecodeResponse();
    oSession.oResponse.headers.Remove("Set-Cookie");
}

当前实现出现问题:Fiddler会话列表中该请求显示红色停止标志,且文件无法正常加载。我认为问题源于Cookie头重写未正确实现,请问如何在C#版Fiddler中正确实现该功能?


解决方案

1. 核心逻辑梳理

原Chrome扩展的核心逻辑是:

  • 拦截匹配https://wc-fb-cdn7.kixeye.com/game/game-v7.v59902/WarCommander.js*的请求,重定向到目标JS文件
  • 对重定向后的目标JS请求,强制改写Cookie头为si=[登录获取的cookie值]

2. 完整Fiddler实现代码

在Fiddler的脚本编辑器中,替换AutoTamperRequestBefore方法为以下代码(注意替换targetCookieValue为你登录后获取的实际Cookie值,或者扩展中cookievalue的内容):

// 全局变量存储登录后获取的Cookie值,模拟扩展中的cookievalue
private string targetCookieValue = "0"; // 替换为实际登录得到的Cookie值

public void AutoTamperRequestBefore(Session oSession)
{
    // 1. 处理URL重定向:匹配原扩展中的目标URL
    string originalTargetPattern = "wc-fb-cdn7.kixeye.com/game/game-v7.v59902/WarCommander.js";
    string redirectTargetUrl = "https://nextgenerationhackers.com/uploads/wc/WarCommander.js";
    
    if (oSession.uriContains(originalTargetPattern))
    {
        // 修改请求URL为目标地址
        oSession.fullUrl = redirectTargetUrl;
        // 确保Fiddler完整缓冲并处理请求,避免提前中断
        oSession.bBufferResponse = true;
    }
    
    // 2. 处理Cookie头改写:匹配重定向后的目标URL
    if (oSession.fullUrl.Equals(redirectTargetUrl, StringComparison.OrdinalIgnoreCase))
    {
        // 移除原有Cookie头
        oSession.oRequest.headers.Remove("Cookie");
        // 添加指定格式的新Cookie头
        oSession.oRequest.headers.Add("Cookie", $"si={targetCookieValue}");
    }
}

3. 问题原因分析

你之前的代码存在两个关键问题:

  • 缺少Cookie头改写逻辑:重定向后的请求没有携带目标服务器要求的si Cookie,导致服务器拒绝请求,出现红色停止标志
  • 重定向处理不完整:未设置bBufferResponse = true,可能导致Fiddler提前中断请求流程

4. 补充说明

如果需要完全模拟扩展的登录流程,可以在Fiddler中添加登录请求处理:

  • 拦截登录请求,发送POST请求到扩展中的登录接口
  • 解析返回的JSON,提取cookie值并赋值给targetCookieValue变量

内容的提问来源于stack exchange,提问作者Ryan Ellis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 05:25:02