Skip to content

FBro VIP资源篡改功能

概述

FBro VIP资源篡改功能允许开发者在运行时拦截并替换网络资源,包括API响应、静态文件等。这是FBro的高级功能,需要VIP会员权限才能使用。通过资源篡改,可以实现数据模拟、内容替换、本地化等高级功能。

功能特性

  • 实时拦截:拦截浏览器的网络请求
  • 双重模式:支持内容修改和整体替换两种方式
  • 精细控制:可以只修改资源中的特定文本,也可以完全替换整个资源
  • 格式支持:支持JSON、HTML、CSS、JavaScript等各种格式
  • 灵活匹配:支持多种URL匹配模式
  • 动态管理:支持运行时添加、删除篡改规则

资源篡改的两种方式

1. ResponseFilter(响应过滤器)- 内容修改

通过匹配目标文本对资源内容进行局部修改,支持插入和替换两种操作模式。

2. ResourceHandler(资源处理器)- 整体替换

用自定义数据或文件完全替换整个网络资源。

核心方法

一、ResponseFilter(响应过滤器)方法

1. 启用内容修改

csharp
/// <summary>
/// 启用响应内容修改功能
/// </summary>
/// <param name="browser">浏览器实例</param>
/// <param name="urlType">URL匹配类型</param>
/// <param name="targetUrl">目标URL</param>
/// <param name="changeType">修改类型(插入/替换)</param>
/// <param name="searchKey">要查找的文本</param>
/// <param name="changeData">要替换或插入的文本</param>
/// <returns>是否启用成功</returns>
public static bool EnableResponseFilter(
    IFBroSharpBrowser browser,
    FBroSharpResponseURLFindType urlType,
    string targetUrl,
    FBroSharpResponseFilterType changeType,
    string searchKey,
    string changeData)
{
    try
    {
        var vipControl = browser.GetVIPControl();
        if (vipControl?.IsValid == true)
        {
            vipControl.ResponseFilterAddChangeData(urlType, targetUrl, changeType, searchKey, changeData);
            Console.WriteLine($"响应过滤器启用成功: {targetUrl} - 查找[{searchKey}]");
            return true;
        }
        
        Console.WriteLine("无法启用响应过滤器,请检查VIP权限");
        return false;
    }
    catch (Exception ex)
    {
        Console.WriteLine($"启用响应过滤器失败: {ex.Message}");
        return false;
    }
}

2. 取消内容修改

csharp
/// <summary>
/// 取消指定URL的响应过滤规则
/// </summary>
/// <param name="browser">浏览器实例</param>
/// <param name="targetUrl">目标URL</param>
/// <returns>是否取消成功</returns>
public static bool DisableResponseFilter(IFBroSharpBrowser browser, string targetUrl)
{
    try
    {
        var vipControl = browser.GetVIPControl();
        if (vipControl?.IsValid == true)
        {
            vipControl.ResponseFilterDeleteChangeData(targetUrl);
            Console.WriteLine($"响应过滤规则已清除: {targetUrl}");
            return true;
        }
        
        return false;
    }
    catch (Exception ex)
    {
        Console.WriteLine($"取消响应过滤失败: {ex.Message}");
        return false;
    }
}

/// <summary>
/// 取消所有响应过滤规则
/// </summary>
/// <param name="browser">浏览器实例</param>
/// <returns>是否取消成功</returns>
public static bool DisableAllResponseFilters(IFBroSharpBrowser browser)
{
    try
    {
        var vipControl = browser.GetVIPControl();
        if (vipControl?.IsValid == true)
        {
            vipControl.ResponseFilterDeleteAllData();
            Console.WriteLine("所有响应过滤规则已清除");
            return true;
        }
        
        Console.WriteLine("无法取消响应过滤,请检查VIP权限");
        return false;
    }
    catch (Exception ex)
    {
        Console.WriteLine($"取消响应过滤失败: {ex.Message}");
        return false;
    }
}

二、ResourceHandler(资源处理器)方法

1. 启用资源替换(数据)

csharp
/// <summary>
/// 启用资源替换功能(使用数据)
/// </summary>
/// <param name="browser">浏览器实例</param>
/// <param name="urlType">URL匹配类型</param>
/// <param name="targetUrl">目标URL</param>
/// <param name="miniType">MIME类型</param>
/// <param name="headers">响应头(可选)</param>
/// <param name="data">替换数据</param>
/// <returns>是否启用成功</returns>
public static bool EnableResourceReplacement(
    IFBroSharpBrowser browser,
    FBroSharpResponseURLFindType urlType,
    string targetUrl,
    string miniType,
    FBroSharpStringMap[] headers,
    byte[] data)
{
    try
    {
        var vipControl = browser.GetVIPControl();
        if (vipControl?.IsValid == true)
        {
            vipControl.ResourceHandlerAddChangeData(urlType, targetUrl, miniType, headers, data);
            Console.WriteLine($"资源替换启用成功: {targetUrl}");
            return true;
        }
        
        Console.WriteLine("无法启用资源替换,请检查VIP权限");
        return false;
    }
    catch (Exception ex)
    {
        Console.WriteLine($"启用资源替换失败: {ex.Message}");
        return false;
    }
}

2. 启用资源替换(文件)

csharp
/// <summary>
/// 启用资源替换功能(使用文件)
/// </summary>
/// <param name="browser">浏览器实例</param>
/// <param name="urlType">URL匹配类型</param>
/// <param name="targetUrl">目标URL</param>
/// <param name="miniType">MIME类型</param>
/// <param name="headers">响应头(可选)</param>
/// <param name="filePath">本地文件路径</param>
/// <returns>是否启用成功</returns>
public static bool EnableResourceReplacementFromFile(
    IFBroSharpBrowser browser,
    FBroSharpResponseURLFindType urlType,
    string targetUrl,
    string miniType,
    FBroSharpStringMap[] headers,
    string filePath)
{
    try
    {
        var vipControl = browser.GetVIPControl();
        if (vipControl?.IsValid == true)
        {
            vipControl.ResourceHandlerAddChangeFile(urlType, targetUrl, miniType, headers, filePath);
            Console.WriteLine($"资源替换启用成功: {targetUrl} -> {filePath}");
            return true;
        }
        
        Console.WriteLine("无法启用资源替换,请检查VIP权限");
        return false;
    }
    catch (Exception ex)
    {
        Console.WriteLine($"启用资源替换失败: {ex.Message}");
        return false;
    }
}

3. 取消资源替换

csharp
/// <summary>
/// 取消指定URL的资源替换规则
/// </summary>
/// <param name="browser">浏览器实例</param>
/// <param name="targetUrl">目标URL</param>
/// <returns>是否取消成功</returns>
public static bool DisableResourceReplacement(IFBroSharpBrowser browser, string targetUrl)
{
    try
    {
        var vipControl = browser.GetVIPControl();
        if (vipControl?.IsValid == true)
        {
            vipControl.ResourceHandlerDeleteChangeData(targetUrl);
            Console.WriteLine($"资源替换规则已清除: {targetUrl}");
            return true;
        }
        
        return false;
    }
    catch (Exception ex)
    {
        Console.WriteLine($"取消资源替换失败: {ex.Message}");
        return false;
    }
}

/// <summary>
/// 取消所有资源替换规则
/// </summary>
/// <param name="browser">浏览器实例</param>
/// <returns>是否取消成功</returns>
public static bool DisableAllResourceReplacements(IFBroSharpBrowser browser)
{
    try
    {
        var vipControl = browser.GetVIPControl();
        if (vipControl?.IsValid == true)
        {
            vipControl.ResourceHandlerDeleteAllData();
            Console.WriteLine("所有资源替换规则已清除");
            return true;
        }
        
        Console.WriteLine("无法取消资源替换,请检查VIP权限");
        return false;
    }
    catch (Exception ex)
    {
        Console.WriteLine($"取消资源替换失败: {ex.Message}");
        return false;
    }
}

方法参数说明

修改类型 (FBroSharpResponseFilterType)

枚举值说明使用场景
Insert插入模式在找到的目标文本后面插入新内容
Replace替换模式将找到的目标文本替换为新内容

修改类型使用示例

插入模式示例

csharp
// 在 "user_id":123 后面插入新字段
EnableResponseFilter(
    browser,
    FBroSharpResponseURLFindType.FuzzyMatch,
    "/api/user/info",
    FBroSharpResponseFilterType.Insert,
    "\"user_id\":123",
    ",\"vip_level\":\"gold\",\"balance\":999.99"
);
// 结果:原本的 "user_id":123 变成 "user_id":123,"vip_level":"gold","balance":999.99

替换模式示例

csharp
// 将 "status":"normal" 替换为 "status":"vip"
EnableResponseFilter(
    browser,
    FBroSharpResponseURLFindType.FuzzyMatch,
    "/api/user/status",
    FBroSharpResponseFilterType.Replace,
    "\"status\":\"normal\"",
    "\"status\":\"vip\""
);

URL匹配类型 (FBroSharpResponseURLFindType)

枚举值说明使用场景示例
ALL匹配所有URL全局拦截所有资源所有网络请求都会被拦截
FuzzyMatch模糊匹配URL包含指定字符串"api/user" 匹配 https://example.com/api/user/info
FuzzyHead模糊头匹配URL以指定字符串开头"https://api" 匹配 https://api.example.com/data
FuzzyTail模糊尾匹配URL以指定字符串结尾".js" 匹配 https://cdn.com/app.js
RegexMatch正则表达式匹配复杂模式匹配".*\\.css$" 匹配所有CSS文件

匹配类型详细说明

1. ALL匹配

csharp
// 拦截所有资源请求
EnableResourceTampering(
    browser,
    FBroSharpResponseURLFindType.ALL,
    "", // URL参数可以为空
    "text/html",
    headers,
    data
);

2. FuzzyMatch(模糊匹配)

csharp
// 匹配包含 "api/product" 的所有URL
EnableResourceTampering(
    browser,
    FBroSharpResponseURLFindType.FuzzyMatch,
    "api/product",
    "application/json",
    headers,
    data
);
// 可以匹配:
// - https://shop.com/api/product/list
// - https://api.example.com/v1/api/product/details
// - http://localhost:8080/api/product/search

3. FuzzyHead(头部匹配)

csharp
// 匹配以指定字符串开头的URL
EnableResourceTampering(
    browser,
    FBroSharpResponseURLFindType.FuzzyHead,
    "https://cdn.example.com",
    "application/javascript",
    headers,
    data
);
// 可以匹配:
// - https://cdn.example.com/js/app.js
// - https://cdn.example.com/css/style.css
// - https://cdn.example.com/images/logo.png

4. FuzzyTail(尾部匹配)

csharp
// 匹配以指定字符串结尾的URL
EnableResourceTampering(
    browser,
    FBroSharpResponseURLFindType.FuzzyTail,
    ".json",
    "application/json",
    headers,
    data
);
// 可以匹配:
// - https://api.com/config.json
// - https://data.com/users.json
// - http://localhost/settings.json

5. RegexMatch(正则匹配)

csharp
// 使用正则表达式进行复杂匹配
EnableResourceTampering(
    browser,
    FBroSharpResponseURLFindType.RegexMatch,
    @"^https://.*\.example\.com/api/v\d+/.*$",
    "application/json",
    headers,
    data
);
// 可以匹配:
// - https://api.example.com/api/v1/users
// - https://shop.example.com/api/v2/products
// - https://admin.example.com/api/v3/orders

常用MIME类型 (mini_type)

资源类型mini_type值说明
JSON数据application/jsonAPI响应数据
HTML页面text/html网页内容
JavaScriptapplication/javascript脚本文件
CSS样式text/css样式表
纯文本text/plain普通文本
XML数据application/xmlXML格式数据
图片PNGimage/pngPNG格式图片
图片JPEGimage/jpegJPEG格式图片

实际应用示例

一、ResponseFilter(内容修改)示例

1. API数据字段修改

csharp
/// <summary>
/// API响应字段修改示例
/// </summary>
public class ResponseFilterExample
{
    /// <summary>
    /// 修改用户余额信息
    /// </summary>
    /// <param name="browser">浏览器实例</param>
    public static void ModifyUserBalance(IFBroSharpBrowser browser)
    {
        try
        {
            // 示例1:替换用户余额
            EnableResponseFilter(
                browser,
                FBroSharpResponseURLFindType.FuzzyMatch,
                "/api/user/wallet",
                FBroSharpResponseFilterType.Replace,
                "\"balance\":0",
                "\"balance\":999999.99"
            );
            
            // 示例2:插入VIP标识
            EnableResponseFilter(
                browser,
                FBroSharpResponseURLFindType.FuzzyMatch,
                "/api/user/info",
                FBroSharpResponseFilterType.Insert,
                "\"username\":",
                "\"vip_status\":\"premium\","
            );
            
            Console.WriteLine("用户信息修改已启用");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"用户信息修改失败: {ex.Message}");
        }
    }
    
    /// <summary>
    /// 修改商品价格信息
    /// </summary>
    /// <param name="browser">浏览器实例</param>
    public static void ModifyProductPrice(IFBroSharpBrowser browser)
    {
        try
        {
            // 将所有商品价格改为1元
            EnableResponseFilter(
                browser,
                FBroSharpResponseURLFindType.FuzzyMatch,
                "/api/product/list",
                FBroSharpResponseFilterType.Replace,
                "\"price\":",
                "\"original_price\":\"price\",\"price\":1,"
            );
            
            Console.WriteLine("商品价格修改已启用");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"商品价格修改失败: {ex.Message}");
        }
    }
}

2. 网页内容修改

csharp
/// <summary>
/// 网页内容修改示例
/// </summary>
public class HtmlContentFilterExample
{
    /// <summary>
    /// 修改网页标题
    /// </summary>
    /// <param name="browser">浏览器实例</param>
    public static void ModifyPageTitle(IFBroSharpBrowser browser)
    {
        try
        {
            // 替换网页标题
            EnableResponseFilter(
                browser,
                FBroSharpResponseURLFindType.FuzzyTail,
                ".html",
                FBroSharpResponseFilterType.Replace,
                "<title>原始标题</title>",
                "<title>自定义标题 - VIP版本</title>"
            );
            
            Console.WriteLine("网页标题修改已启用");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"网页标题修改失败: {ex.Message}");
        }
    }
    
    /// <summary>
    /// 插入自定义CSS样式
    /// </summary>
    /// <param name="browser">浏览器实例</param>
    public static void InsertCustomCSS(IFBroSharpBrowser browser)
    {
        try
        {
            string customStyle = @"
                <style>
                    .vip-banner {
                        background: linear-gradient(45deg, #FF6B6B, #4ECDC4);
                        color: white;
                        padding: 10px;
                        text-align: center;
                        position: fixed;
                        top: 0;
                        left: 0;
                        right: 0;
                        z-index: 9999;
                    }
                </style>";
            
            // 在head标签后插入自定义样式
            EnableResponseFilter(
                browser,
                FBroSharpResponseURLFindType.FuzzyMatch,
                "example.com",
                FBroSharpResponseFilterType.Insert,
                "<head>",
                customStyle
            );
            
            Console.WriteLine("自定义CSS样式插入已启用");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"CSS样式插入失败: {ex.Message}");
        }
    }
}

3. JavaScript代码修改

csharp
/// <summary>
/// JavaScript代码修改示例
/// </summary>
public class JavaScriptFilterExample
{
    /// <summary>
    /// 修改JavaScript配置
    /// </summary>
    /// <param name="browser">浏览器实例</param>
    public static void ModifyJSConfig(IFBroSharpBrowser browser)
    {
        try
        {
            // 替换调试模式配置
            EnableResponseFilter(
                browser,
                FBroSharpResponseURLFindType.FuzzyTail,
                "config.js",
                FBroSharpResponseFilterType.Replace,
                "debug: false",
                "debug: true"
            );
            
            // 插入自定义配置
            EnableResponseFilter(
                browser,
                FBroSharpResponseURLFindType.FuzzyTail,
                "config.js",
                FBroSharpResponseFilterType.Insert,
                "var config = {",
                "\n    vipMode: true,\n    customFeatures: ['unlimited', 'premium'],"
            );
            
            Console.WriteLine("JavaScript配置修改已启用");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"JavaScript配置修改失败: {ex.Message}");
        }
    }
}

二、ResourceHandler(整体替换)示例

1. API数据完全替换

csharp
/// <summary>
/// API数据完全替换示例
/// </summary>
public class ApiReplacementExample
{
    /// <summary>
    /// 替换电商产品信息API
    /// </summary>
    /// <param name="browser">浏览器实例</param>
    /// <param name="customData">自定义产品数据</param>
    public static void ReplaceProductApi(IFBroSharpBrowser browser, string customData)
    {
        try
        {
            // 将自定义数据转换为字节数组
            byte[] responseData = Encoding.UTF8.GetBytes(customData);
            
            // 设置响应头
            var headers = new FBroSharpStringMap[]
            {
                new FBroSharpStringMap { key = "Content-Type", value = "application/json; charset=utf-8" },
                new FBroSharpStringMap { key = "Access-Control-Allow-Origin", value = "*" },
                new FBroSharpStringMap { key = "Cache-Control", value = "no-cache" }
            };
            
            // 启用API替换
            EnableResourceReplacement(
                browser,
                FBroSharpResponseURLFindType.FuzzyMatch,
                "fxg.jinritemai.com/product/tproduct/getSchema",
                "application/json",
                headers,
                responseData
            );
            
            Console.WriteLine("产品API替换已启用");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"API替换失败: {ex.Message}");
        }
    }
    
    /// <summary>
    /// 创建自定义产品数据
    /// </summary>
    /// <returns>JSON格式的产品数据</returns>
    public static string CreateCustomProductData()
    {
        var customProduct = new
        {
            code = 200,
            message = "success",
            data = new
            {
                product_id = "CUSTOM_001",
                name = "自定义商品",
                price = 99.99m,
                stock = 1000,
                description = "这是一个自定义的商品信息",
                images = new[]
                {
                    "https://example.com/image1.jpg",
                    "https://example.com/image2.jpg"
                },
                specifications = new
                {
                    color = "红色",
                    size = "XL",
                    material = "纯棉"
                },
                availability = true,
                created_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
            }
        };
        
        return Newtonsoft.Json.JsonConvert.SerializeObject(customProduct, Newtonsoft.Json.Formatting.Indented);
    }
}

2. 用户信息完全替换

csharp
/// <summary>
/// 用户信息完全替换示例
/// </summary>
public class UserInfoReplacementExample
{
    /// <summary>
    /// 替换用户信息API
    /// </summary>
    /// <param name="browser">浏览器实例</param>
    public static void ReplaceUserInfo(IFBroSharpBrowser browser)
    {
        // 创建自定义用户信息
        var customUserInfo = new
        {
            code = 200,
            message = "success",
            data = new
            {
                user_id = 88888,
                username = "VIP用户",
                email = "vip@example.com",
                role = "admin",
                level = "VIP",
                permissions = new[] { "read", "write", "admin", "super_admin" },
                profile = new
                {
                    avatar = "https://example.com/vip-avatar.jpg",
                    nickname = "超级管理员",
                    phone = "138****8888",
                    verified = true
                },
                balance = 999999.99m,
                points = 100000,
                membership = new
                {
                    type = "VIP",
                    expire_date = "2025-12-31",
                    benefits = new[] { "免费配送", "专属客服", "优先退换", "生日礼品" }
                }
            }
        };
        
        string jsonData = Newtonsoft.Json.JsonConvert.SerializeObject(customUserInfo, Newtonsoft.Json.Formatting.Indented);
        byte[] responseData = Encoding.UTF8.GetBytes(jsonData);
        
        var headers = new FBroSharpStringMap[]
        {
            new FBroSharpStringMap { key = "Content-Type", value = "application/json; charset=utf-8" }
        };
        
        // 替换用户信息API
        EnableResourceReplacement(
            browser,
            FBroSharpResponseURLFindType.FuzzyMatch,
            "/api/user/info",
            "application/json",
            headers,
            responseData
        );
        
        Console.WriteLine("用户信息替换已启用");
    }
}

3. 静态资源完全替换

csharp
/// <summary>
/// 静态资源完全替换示例
/// </summary>
public class StaticResourceReplacementExample
{
    /// <summary>
    /// 替换JavaScript文件
    /// </summary>
    /// <param name="browser">浏览器实例</param>
    public static void ReplaceJavaScript(IFBroSharpBrowser browser)
    {
        string customJS = @"
            // 自定义JavaScript代码
            console.log('资源已被完全替换');
            
            // 修改页面行为
            document.addEventListener('DOMContentLoaded', function() {
                console.log('DOM加载完成 - 自定义脚本');
                
                // 添加自定义样式
                var style = document.createElement('style');
                style.textContent = `
                    .custom-banner {
                        background: linear-gradient(45deg, #ff6b6b, #4ecdc4);
                        color: white;
                        padding: 10px;
                        text-align: center;
                        position: fixed;
                        top: 0;
                        left: 0;
                        right: 0;
                        z-index: 9999;
                    }
                `;
                document.head.appendChild(style);
                
                // 添加自定义横幅
                var banner = document.createElement('div');
                banner.className = 'custom-banner';
                banner.textContent = '🎉 VIP用户专享 - 资源已优化 🎉';
                document.body.insertBefore(banner, document.body.firstChild);
            });
            
            // 拦截并修改fetch请求
            const originalFetch = window.fetch;
            window.fetch = function(...args) {
                console.log('拦截到fetch请求:', args[0]);
                return originalFetch.apply(this, args);
            };
        ";
        
        byte[] jsData = Encoding.UTF8.GetBytes(customJS);
        
        var headers = new FBroSharpStringMap[]
        {
            new FBroSharpStringMap { key = "Content-Type", value = "application/javascript; charset=utf-8" }
        };
        
        // 替换JavaScript文件
        EnableResourceReplacement(
            browser,
            FBroSharpResponseURLFindType.FuzzyTail,
            "main.js",
            "application/javascript",
            headers,
            jsData
        );
        
        Console.WriteLine("JavaScript文件替换已启用");
    }
    
    /// <summary>
    /// 替换CSS样式文件
    /// </summary>
    /// <param name="browser">浏览器实例</param>
    public static void ReplaceCSS(IFBroSharpBrowser browser)
    {
        string customCSS = @"
            /* 自定义CSS样式 */
            body {
                font-family: 'Microsoft YaHei', '微软雅黑', sans-serif !important;
                line-height: 1.6 !important;
            }
            
            /* 美化按钮 */
            button, .btn {
                background: linear-gradient(45deg, #667eea 0%, #764ba2 100%) !important;
                border: none !important;
                border-radius: 25px !important;
                color: white !important;
                padding: 12px 24px !important;
                cursor: pointer !important;
                transition: all 0.3s ease !important;
            }
            
            button:hover, .btn:hover {
                transform: translateY(-2px) !important;
                box-shadow: 0 8px 25px rgba(0,0,0,0.2) !important;
            }
            
            /* 美化输入框 */
            input[type=""text""], input[type=""password""], textarea {
                border: 2px solid #e1e5e9 !important;
                border-radius: 10px !important;
                padding: 12px 16px !important;
                transition: border-color 0.3s ease !important;
            }
            
            input[type=""text""]:focus, input[type=""password""]:focus, textarea:focus {
                border-color: #667eea !important;
                outline: none !important;
                box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1) !important;
            }
            
            /* 自定义滚动条 */
            ::-webkit-scrollbar {
                width: 12px;
            }
            
            ::-webkit-scrollbar-track {
                background: #f1f1f1;
                border-radius: 6px;
            }
            
            ::-webkit-scrollbar-thumb {
                background: linear-gradient(45deg, #667eea, #764ba2);
                border-radius: 6px;
            }
            
            ::-webkit-scrollbar-thumb:hover {
                background: linear-gradient(45deg, #5a6fd8, #6a4190);
            }
        ";
        
        byte[] cssData = Encoding.UTF8.GetBytes(customCSS);
        
        var headers = new FBroSharpStringMap[]
        {
            new FBroSharpStringMap { key = "Content-Type", value = "text/css; charset=utf-8" }
        };
        
        // 替换CSS文件
        EnableResourceReplacement(
            browser,
            FBroSharpResponseURLFindType.FuzzyMatch,
            "style.css",
            "text/css",
            headers,
            cssData
        );
        
        Console.WriteLine("CSS文件替换已启用");
    }
    
    /// <summary>
    /// 从文件替换资源
    /// </summary>
    /// <param name="browser">浏览器实例</param>
    public static void ReplaceResourceFromFile(IFBroSharpBrowser browser)
    {
        try
        {
            string localFilePath = @"C:\CustomResources\custom-script.js";
            
                         var headers = new FBroSharpStringMap[]
             {
                 new FBroSharpStringMap { key = "Content-Type", value = "application/javascript; charset=utf-8" }
             };
            
            // 从本地文件替换JavaScript资源
            EnableResourceReplacementFromFile(
                browser,
                FBroSharpResponseURLFindType.FuzzyTail,
                "app.js",
                "application/javascript",
                headers,
                localFilePath
            );
            
            Console.WriteLine($"从文件替换资源已启用: {localFilePath}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"从文件替换资源失败: {ex.Message}");
        }
    }
}

4. 响应状态完全替换

csharp
/// <summary>
/// 响应状态完全替换示例
/// </summary>
public class ResponseStatusReplacementExample
{
    /// <summary>
    /// 替换错误响应为成功响应
    /// </summary>
    /// <param name="browser">浏览器实例</param>
    public static void ReplaceErrorToSuccess(IFBroSharpBrowser browser)
    {
        // 创建成功响应数据
        var successResponse = new
        {
            code = 200,
            message = "操作成功",
            data = new
            {
                success = true,
                timestamp = DateTimeOffset.Now.ToUnixTimeSeconds(),
                result = "处理完成"
            }
        };
        
        string jsonData = Newtonsoft.Json.JsonConvert.SerializeObject(successResponse);
        byte[] responseData = Encoding.UTF8.GetBytes(jsonData);
        
        var headers = new FBroSharpStringMap[]
        {
            new FBroSharpStringMap { key = "Content-Type", value = "application/json; charset=utf-8" },
            new FBroSharpStringMap { key = "Status", value = "200 OK" }
        };
        
        // 替换可能返回错误的API
        EnableResourceReplacement(
            browser,
            FBroSharpResponseURLFindType.FuzzyMatch,
            "/api/operation/execute",
            "application/json",
            headers,
            responseData
        );
        
        Console.WriteLine("错误响应替换已启用");
    }
}

资源篡改管理类

csharp
/// <summary>
/// 资源篡改管理类(支持ResponseFilter和ResourceHandler两种模式)
/// </summary>
public class ResourceTamperingManager
{
    private readonly IFBroSharpBrowser _browser;
    private readonly IFBroSharpVIPControl _vipControl;
    private readonly Dictionary<string, TamperingRule> _activeRules;
    
    /// <summary>
    /// 篡改规则类型
    /// </summary>
    public enum RuleType
    {
        ResponseFilter,    // 响应过滤器
        ResourceHandler    // 资源处理器
    }
    
    /// <summary>
    /// 篡改规则信息
    /// </summary>
    public class TamperingRule
    {
        public string Url { get; set; }
        public FBroSharpResponseURLFindType UrlType { get; set; }
        public RuleType Type { get; set; }
        public string MiniType { get; set; }
        public DateTime CreatedTime { get; set; }
        public string Description { get; set; }
        
        // ResponseFilter专用属性
        public FBroSharpResponseFilterType? ChangeType { get; set; }
        public string SearchKey { get; set; }
        public string ChangeData { get; set; }
        
        // ResourceHandler专用属性
        public string FilePath { get; set; }
        public bool IsFromFile { get; set; }
    }
    
    public ResourceTamperingManager(IFBroSharpBrowser browser)
    {
        _browser = browser ?? throw new ArgumentNullException(nameof(browser));
        _vipControl = browser.GetVIPControl();
        _activeRules = new Dictionary<string, TamperingRule>();
        
        if (_vipControl?.IsValid != true)
        {
            throw new InvalidOperationException("无法获取VIP控制器,请检查VIP权限");
        }
    }
    
    /// <summary>
    /// 添加响应过滤规则
    /// </summary>
    /// <param name="url">目标URL</param>
    /// <param name="urlType">URL匹配类型</param>
    /// <param name="changeType">修改类型</param>
    /// <param name="searchKey">要查找的文本</param>
    /// <param name="changeData">要替换或插入的文本</param>
    /// <param name="description">规则描述</param>
    /// <returns>是否添加成功</returns>
    public bool AddResponseFilterRule(
        string url,
        FBroSharpResponseURLFindType urlType,
        FBroSharpResponseFilterType changeType,
        string searchKey,
        string changeData,
        string description = "")
    {
        try
        {
            _vipControl.ResponseFilterAddChangeData(urlType, url, changeType, searchKey, changeData);
            
            // 记录规则信息
            _activeRules[url + "_filter"] = new TamperingRule
            {
                Url = url,
                UrlType = urlType,
                Type = RuleType.ResponseFilter,
                ChangeType = changeType,
                SearchKey = searchKey,
                ChangeData = changeData,
                CreatedTime = DateTime.Now,
                Description = description
            };
            
            Console.WriteLine($"响应过滤规则添加成功: {url} - {description}");
            return true;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"添加响应过滤规则失败: {ex.Message}");
            return false;
        }
    }
    
    /// <summary>
    /// 添加资源替换规则(数据)
    /// </summary>
    /// <param name="url">目标URL</param>
    /// <param name="urlType">URL匹配类型</param>
    /// <param name="miniType">MIME类型</param>
    /// <param name="headers">响应头</param>
    /// <param name="data">替换数据</param>
    /// <param name="description">规则描述</param>
    /// <returns>是否添加成功</returns>
    public bool AddResourceReplacementRule(
        string url,
        FBroSharpResponseURLFindType urlType,
        string miniType,
        FBroSharpStringMap[] headers,
        byte[] data,
        string description = "")
    {
        try
        {
            _vipControl.ResourceHandlerAddChangeData(urlType, url, miniType, headers, data);
            
            // 记录规则信息
            _activeRules[url + "_handler"] = new TamperingRule
            {
                Url = url,
                UrlType = urlType,
                Type = RuleType.ResourceHandler,
                MiniType = miniType,
                IsFromFile = false,
                CreatedTime = DateTime.Now,
                Description = description
            };
            
            Console.WriteLine($"资源替换规则添加成功: {url} - {description}");
            return true;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"添加资源替换规则失败: {ex.Message}");
            return false;
        }
    }
    
    /// <summary>
    /// 添加资源替换规则(文件)
    /// </summary>
    /// <param name="url">目标URL</param>
    /// <param name="urlType">URL匹配类型</param>
    /// <param name="miniType">MIME类型</param>
    /// <param name="headers">响应头</param>
    /// <param name="filePath">本地文件路径</param>
    /// <param name="description">规则描述</param>
    /// <returns>是否添加成功</returns>
    public bool AddResourceReplacementRuleFromFile(
        string url,
        FBroSharpResponseURLFindType urlType,
        string miniType,
        FBroSharpStringMap[] headers,
        string filePath,
        string description = "")
    {
        try
        {
            _vipControl.ResourceHandlerAddChangeFile(urlType, url, miniType, headers, filePath);
            
            // 记录规则信息
            _activeRules[url + "_handler_file"] = new TamperingRule
            {
                Url = url,
                UrlType = urlType,
                Type = RuleType.ResourceHandler,
                MiniType = miniType,
                FilePath = filePath,
                IsFromFile = true,
                CreatedTime = DateTime.Now,
                Description = description
            };
            
            Console.WriteLine($"资源替换规则添加成功: {url} -> {filePath} - {description}");
            return true;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"添加资源替换规则失败: {ex.Message}");
            return false;
        }
    }
    
    /// <summary>
    /// 移除响应过滤规则
    /// </summary>
    /// <param name="url">目标URL</param>
    /// <returns>是否移除成功</returns>
    public bool RemoveResponseFilterRule(string url)
    {
        try
        {
            _vipControl.ResponseFilterDeleteChangeData(url);
            _activeRules.Remove(url + "_filter");
            
            Console.WriteLine($"响应过滤规则移除成功: {url}");
            return true;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"移除响应过滤规则失败: {ex.Message}");
            return false;
        }
    }
    
    /// <summary>
    /// 移除资源替换规则
    /// </summary>
    /// <param name="url">目标URL</param>
    /// <returns>是否移除成功</returns>
    public bool RemoveResourceReplacementRule(string url)
    {
        try
        {
            _vipControl.ResourceHandlerDeleteChangeData(url);
            _activeRules.Remove(url + "_handler");
            _activeRules.Remove(url + "_handler_file");
            
            Console.WriteLine($"资源替换规则移除成功: {url}");
            return true;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"移除资源替换规则失败: {ex.Message}");
            return false;
        }
    }
    
    /// <summary>
    /// 清除所有规则
    /// </summary>
    /// <returns>是否清除成功</returns>
    public bool ClearAllRules()
    {
        try
        {
            _vipControl.ResponseFilterDeleteAllData();
            _vipControl.ResourceHandlerDeleteAllData();
            _activeRules.Clear();
            
            Console.WriteLine("所有篡改规则已清除");
            return true;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"清除篡改规则失败: {ex.Message}");
            return false;
        }
    }
    
    /// <summary>
    /// 获取活跃规则列表
    /// </summary>
    /// <returns>规则列表</returns>
    public IReadOnlyDictionary<string, TamperingRule> GetActiveRules()
    {
        return _activeRules;
    }
    
    /// <summary>
    /// 导出规则配置
    /// </summary>
    /// <param name="filePath">导出文件路径</param>
    public void ExportRules(string filePath)
    {
        try
        {
            var rulesJson = Newtonsoft.Json.JsonConvert.SerializeObject(_activeRules, Newtonsoft.Json.Formatting.Indented);
            File.WriteAllText(filePath, rulesJson, Encoding.UTF8);
            Console.WriteLine($"规则配置已导出: {filePath}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"导出规则配置失败: {ex.Message}");
        }
    }
    
    /// <summary>
    /// 释放资源
    /// </summary>
    public void Dispose()
    {
        ClearAllRules();
        _vipControl?.Dispose();
    }
}

完整使用示例

csharp
/// <summary>
/// 资源篡改功能完整示例
/// </summary>
public class ResourceTamperingDemo
{
    public static void Main()
    {
        IFBroSharpBrowser browser = null;
        ResourceTamperingManager tamperingManager = null;
        
        try
        {
            // 创建浏览器实例(这里假设browser已经创建)
            // browser = CreateBrowser();
            
            // 初始化篡改管理器
            tamperingManager = new ResourceTamperingManager(browser);
            
            // 示例1:篡改API响应
            string customApiData = ApiTamperingExample.CreateCustomProductData();
            byte[] apiResponseData = Encoding.UTF8.GetBytes(customApiData);
            
            var apiHeaders = new FBroSharpStringMap[]
            {
                new FBroSharpStringMap { key = "Content-Type", value = "application/json; charset=utf-8" }
            };
            
            // 添加资源替换规则
            tamperingManager.AddResourceReplacementRule(
                "fxg.jinritemai.com/product/tproduct/getSchema",
                FBroSharpResponseURLFindType.FuzzyMatch,
                "application/json",
                apiHeaders,
                apiResponseData,
                "电商产品API数据替换"
            );
            
            // 添加响应过滤规则
            tamperingManager.AddResponseFilterRule(
                "/api/user/balance",
                FBroSharpResponseURLFindType.FuzzyMatch,
                FBroSharpResponseFilterType.Replace,
                "\"balance\":0",
                "\"balance\":999999.99",
                "用户余额修改"
            );
            
            // 示例2:用户信息替换
            UserInfoReplacementExample.ReplaceUserInfo(browser);
            
            // 示例3:静态资源替换
            StaticResourceReplacementExample.ReplaceJavaScript(browser);
            StaticResourceReplacementExample.ReplaceCSS(browser);
            
            // 示例4:错误响应替换
            ResponseStatusReplacementExample.ReplaceErrorToSuccess(browser);
            
            Console.WriteLine("所有篡改规则已设置完成");
            
            // 显示活跃规则
            var activeRules = tamperingManager.GetActiveRules();
            Console.WriteLine($"\n当前活跃规则数量: {activeRules.Count}");
            foreach (var rule in activeRules)
            {
                Console.WriteLine($"- {rule.Key}: {rule.Value.Description}");
            }
            
            // 导出规则配置
            string configPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tampering_rules.json");
            tamperingManager.ExportRules(configPath);
            
            // 模拟运行一段时间
            Console.WriteLine("\n篡改功能运行中,按任意键停止...");
            Console.ReadKey();
            
        }
        catch (Exception ex)
        {
            Console.WriteLine($"程序执行出错: {ex.Message}");
        }
        finally
        {
            // 清理资源
            tamperingManager?.Dispose();
            browser?.Dispose();
            Console.WriteLine("资源已清理");
        }
    }
}

使用注意事项

1. VIP权限验证

csharp
// 使用前检查VIP权限
var vipControl = browser.GetVIPControl();
if (vipControl?.IsValid != true)
{
    throw new UnauthorizedAccessException("需要VIP会员权限才能使用资源篡改功能");
}

2. 数据格式处理

csharp
// 确保数据编码正确
byte[] data = Encoding.UTF8.GetBytes(jsonString);

// 验证JSON格式
try
{
    JObject.Parse(jsonString);  // 使用Newtonsoft.Json验证
}
catch (JsonException ex)
{
    Console.WriteLine($"JSON格式错误: {ex.Message}");
}

3. 错误处理和日志

csharp
try
{
    // 篡改操作
    tamperingManager.AddTamperingRule(...);
}
catch (UnauthorizedAccessException)
{
    Console.WriteLine("权限不足,无法执行篡改操作");
}
catch (ArgumentException ex)
{
    Console.WriteLine($"参数错误: {ex.Message}");
}
catch (Exception ex)
{
    Console.WriteLine($"未知错误: {ex.Message}");
    // 记录详细日志
    LogError(ex);
}

4. 性能优化

csharp
// 避免频繁添加删除规则
private readonly Dictionary<string, byte[]> _cachedData = new Dictionary<string, byte[]>();

// 缓存常用数据
private byte[] GetOrCreateResponseData(string key, Func<string> dataFactory)
{
    if (!_cachedData.ContainsKey(key))
    {
        _cachedData[key] = Encoding.UTF8.GetBytes(dataFactory());
    }
    return _cachedData[key];
}

5. 安全考虑

csharp
// 验证URL格式
private bool IsValidUrl(string url)
{
    return Uri.TryCreate(url, UriKind.Absolute, out Uri result) 
           && (result.Scheme == Uri.UriSchemeHttp || result.Scheme == Uri.UriSchemeHttps);
}

// 限制文件大小
private const int MAX_DATA_SIZE = 10 * 1024 * 1024; // 10MB

private bool ValidateDataSize(byte[] data)
{
    if (data?.Length > MAX_DATA_SIZE)
    {
        Console.WriteLine($"数据过大,超过限制: {data.Length} > {MAX_DATA_SIZE}");
        return false;
    }
    return true;
}

最佳实践

  1. 权限检查:始终在使用前验证VIP权限
  2. 规则管理:建立规则管理机制,避免重复或冲突
  3. 数据验证:验证数据格式和大小
  4. 错误处理:完善的异常处理和日志记录
  5. 性能优化:缓存常用数据,避免重复计算
  6. 安全防护:验证输入参数,防止恶意数据
  7. 资源清理:程序退出前清理所有篡改规则
  8. 测试验证:充分测试篡改效果和稳定性

相关文档

如果文档对您有帮助,欢迎 请喝咖啡 ☕ | 软件发布 | 源码购买