如何在C#版Fiddler中实现Cookie头重写与URL重定向?
我朋友为我开发了一款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头改写逻辑:重定向后的请求没有携带目标服务器要求的
siCookie,导致服务器拒绝请求,出现红色停止标志 - 重定向处理不完整:未设置
bBufferResponse = true,可能导致Fiddler提前中断请求流程
4. 补充说明
如果需要完全模拟扩展的登录流程,可以在Fiddler中添加登录请求处理:
- 拦截登录请求,发送POST请求到扩展中的登录接口
- 解析返回的JSON,提取
cookie值并赋值给targetCookieValue变量
内容的提问来源于stack exchange,提问作者Ryan Ellis
相关产品推荐
相关产品推荐

