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/search3. 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.png4. 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.json5. 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/json | API响应数据 |
| HTML页面 | text/html | 网页内容 |
| JavaScript | application/javascript | 脚本文件 |
| CSS样式 | text/css | 样式表 |
| 纯文本 | text/plain | 普通文本 |
| XML数据 | application/xml | XML格式数据 |
| 图片PNG | image/png | PNG格式图片 |
| 图片JPEG | image/jpeg | JPEG格式图片 |
实际应用示例
一、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;
}最佳实践
- 权限检查:始终在使用前验证VIP权限
- 规则管理:建立规则管理机制,避免重复或冲突
- 数据验证:验证数据格式和大小
- 错误处理:完善的异常处理和日志记录
- 性能优化:缓存常用数据,避免重复计算
- 安全防护:验证输入参数,防止恶意数据
- 资源清理:程序退出前清理所有篡改规则
- 测试验证:充分测试篡改效果和稳定性