引用dll

FiddlerCore4.dll 下载地址
提取码:7g07

定义参数

1
2
3
4
5
6
7
8
9
10
11
//https代理
public static Proxy oSecureEndpoint;
//主机名
string sSecureEndpointHostname = "localhost";
//伪装https服务器(别人这么说,我也没搞明白这个技术细节)
int iSecureEndpointPort = 8877;
//代理端口
int iStartPort = 9898;
//FiddlerCore抓取到的会话不会缓存,所以,要自己维护一个会话列表,来保存所关心的请求
List<Session> oAllSessions = new List<Session>();
string cookies;

初始化Fiddler

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
private void InitFiddler()
{
//这个名字随便
FiddlerApplication.SetAppDisplayName("test");
//绑定事件处理————当发起请求之前
FiddlerApplication.BeforeRequest += On_BeforeRequest;
//绑定事件处理————当会话结束之后
FiddlerApplication.AfterSessionComplete += On_AfterSessionComplete;
//绑定事件处理————当会话请求中
FiddlerApplication.BeforeResponse += FiddlerApplication_BeforeResponse;
//-----------处理证书-----------
//伪造的证书
X509Certificate2 oRootCert;
//如果没有伪造过证书并把伪造的证书加入本机证书库中
if (null == CertMaker.GetRootCertificate())
{
//创建伪造证书
CertMaker.createRootCert();

//重新获取
oRootCert = CertMaker.GetRootCertificate();

//打开本地证书库
X509Store certStore = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
certStore.Open(OpenFlags.ReadWrite);
try
{
//将伪造的证书加入到本地的证书库
certStore.Add(oRootCert);
}
finally
{
certStore.Close();
}
var serviceRuntimeUserCertificateStore = new X509Store(StoreName.My);
serviceRuntimeUserCertificateStore.Open(OpenFlags.ReadWrite);


serviceRuntimeUserCertificateStore.Add(oRootCert);
serviceRuntimeUserCertificateStore.Close();
}
else
{
//以前伪造过证书,并且本地证书库中保存过伪造的证书
oRootCert = CertMaker.GetRootCertificate();
}

//-----------------------------

//指定伪造证书
FiddlerApplication.oDefaultClientCertificate = oRootCert;
//忽略服务器证书错误
CONFIG.IgnoreServerCertErrors = true;
//信任证书
CertMaker.trustRootCert();
//看字面意思知道是啥,但实际起到啥作用。。。鬼才知道,官方例程里有这句,加上吧,管它呢。
FiddlerApplication.Prefs.SetBoolPref("fiddler.network.streaming.abortifclientaborts", true);
//启动代理服务————启动参数1:捕捉https;启动参数2:允许局域网其他终端连入本代理
FiddlerApplication.Startup(iStartPort, FiddlerCoreStartupFlags.DecryptSSL | FiddlerCoreStartupFlags.AllowRemoteClients | FiddlerCoreStartupFlags.Default);
//创建https代理
oSecureEndpoint = FiddlerApplication.CreateProxyEndpoint(iSecureEndpointPort, true, oRootCert);
}

封包发送中事件

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
private void FiddlerApplication_BeforeResponse(Session oS)
{
HTTPRequestHeaders headers = oS.oRequest.headers;
if (oS.fullUrl == "http://www.sufeinet.com/")
{
cookies = headers.AllValues("cookie");
}
if (oS.fullUrl == "https://www.sditds.gov.cn/sdvplatformserver/swProxy/deskserver/sw/deskIndex?menu_id=spl")
{
cookies = headers.AllValues("cookie");
}
#region 报关单
//添加报关单按钮
if (oS.fullUrl.Contains("https://www.sditds.gov.cn:443/sdvplatformserver/swProxy/decserver/sw/dec/cusCiqZhImport") || oS.fullUrl.Contains("https://www.sditds.gov.cn/sdvplatformserver/swProxy/decserver/sw/dec/cusCiqZhImport"))
{
bll_Home.AddDecHeadbtn(oS);
}
//添加报关单事件
if (oS.fullUrl.Contains("static/js/dec/cusCiqZh/dec.js"))
{
bll_Home.AddDecHeadevent(oS, AESEncryptHelperAuto.AESDecrypt(ConfigHelper.GetValue("Account")));
}
//解密手册对应的商品料号
if (oS.fullUrl.Contains("https://www.sditds.gov.cn/sdvplatformserver/swProxy/invtwebserver/sw/ems/pub/common/EmsListQuery/Npts/"))
{
cookies = headers.AllValues("cookie");
oS.utilDecodeResponse();
string requestText = System.Text.Encoding.UTF8.GetString(oS.ResponseBody);
string str2 = BGHelper.menuType2(cookies);
string fun = string.Format(@"loadMenuTypeStr('{0}')", requestText.Replace("\"", ""));
var data = JsHelper.ExecuteScript(fun, str2);
oS.utilSetResponseBody(data);
}
#endregion
#region 随附单据上传格式转换
if (oS.fullUrl.Contains("static/js/dec/cusCiqZh/docUpload.js"))
{
cookies = headers.AllValues("cookie");
oS.utilDecodeResponse();
string requestText = System.Text.Encoding.UTF8.GetString(oS.ResponseBody);
requestText = requestText.Replace("choosePdfFile();", "keepFile(1);") + "function keepFile(type) {" +
"\r\n var cusCiqNo = $(\"#cusCiqNo\").val();" +
"\r\n var attTypeCode = $(\"#attTypeCode\").val();" +
"\r\n var attTypeCodeName = $(\"#attTypeCodeName\").val();" +
"\r\n if (!cusCiqNo) {" +
"\r\n layerMsg('请先保存基本信息!', 2, 3000);" +
"\r\n return false;" +
"\r\n }" +
"\r\n if (!attTypeCode) {" +
"\r\n layerMsg('请选择随附单据文件类别!', 2, 3000);" +
"\r\n return false;" +
"\r\n }" +
"\r\n var attEdocNo = $(\"#dec_doc_form input[id=attEdocNo]\").val();" +
"\r\n var begin = attTypeCode.substring(0, 1); " +
"\r\n var attFmtTypeCode = \"US\";" +
"\r\n var docType = \"所有文件 | *.* \";" +
"\r\n var docSize = \"4M\";" +
"\r\n var attSeqNo = \"\";" +
"\r\n $(\"#i_select_files\").prop(\"disabled\", true);" +
"\r\n" +
"\r\n var ws = new WebSocket(\"ws://127.0.0.1:12581\");" +
"\r\n ws.onopen = function () {" +
"\r\n ws.send(\"1\");" +
"\r\n }" +
"\r\n ws.onmessage = function (evt) { " +
"\r\n if (evt.data.toString() == \"当前文件类型不可转换\") {" +
"\r\n }" +
"\r\n else if (evt.data.toString() == \"用户已取消\") {" +
"\r\n }" +
"\r\n else if (evt.data.toString() == \"图片压缩失败\") {" +
"\r\n layer.alert(\"图片压缩失败\");" +
"\r\n }" +
"\r\n else if (evt.data.toString() == \"文件压缩后大于4M\") {" +
"\r\n layer.alert(\"文件压缩后大于4M\");" +
"\r\n }" +
"\r\n else if (evt.data.toString() == \"文件单页超过400kb\") {" +
"\r\n layer.alert(\"文件单页超过400kb\");" +
"\r\n }" +
"\r\n else if (evt.data.toString() == \"文件名称含有不规则符号请修改,例如 = 和 &。\") {" +
"\r\n layer.alert(\"文件名称含有不规则符号请修改,例如 = 和 &。\");" +
"\r\n } else if (evt.data.toString() == \"文件转换出错!请联系管理员\") {" +
"\r\nlayer.alert(\"文件转换出错!请联系管理员\"); }" +
"\r\n else { var attEdocPath = evt.data.toString(); attEdocPath = attEdocPath.replace(/(\\\\)/g, '/'); var entOrigFileName = attEdocPath.substr(attEdocPath.lastIndexOf(\"/\") + 1);" +
"\r\n var docType = attEdocPath.substr(attEdocPath.lastIndexOf(\".\") + 1);" +
"\r\n var addRow = {" +
"\r\n \"attSeqNo\": attSeqNo," +
"\r\n \"cusCiqNo\": cusCiqNo," +
"\r\n \"attTypeCode\": attTypeCode," +
"\r\n \"attTypeCodeName\": attTypeCodeName," +
"\r\n \"attEdocNo\": attEdocNo," +
"\r\n \"entOrigFileName\": entOrigFileName," +
"\r\n \"attFmtTypeCode\": attFmtTypeCode," +
"\r\n \"attEdocId\": \"\"," +
"\r\n \"attEdocPath\": attEdocPath," +
"\r\n \"attEdocStatus\": \"\"," +
"\r\n \"docType\": docType" +
"\r\n };" +
"\r\n $(\"#decDocTable\").bootstrapTable(\"append\", [addRow]); decDocFormReset(); $('#attTypeCodeName').focus(); $(\"#i_select_files\").prop(\"disabled\", false);" +
"\r\n }" +
"\r\n ws.close();" +
"\r\n };" +
"\r\n ws.onerror = function (env) { if (env.target.readyState == 3) { choosePdfFile(type); } ws.close(); }" +
"\r\n}" +
"";
oS.utilSetResponseBody(requestText);
}
#endregion
}

封包发送之前事件

1
2
3
4
5
6
7
8
9
10
11
private void On_BeforeRequest(Session oS)
{
if (
oS.fullUrl.Contains("static/js/dec/cusCiqZh/docUpload.js")
|| oS.fullUrl.Contains("static/js/dec/cusCiqZh/dec.js")
|| oS.fullUrl.Contains("https://www.sditds.gov.cn:443/sdvplatformserver/swProxy/decserver/sw/dec/cusCiqZhImport")
|| oS.fullUrl.Contains("https://www.sditds.gov.cn/sdvplatformserver/swProxy/decserver/sw/dec/cusCiqZhImport")
|| oS.fullUrl.Contains("https://www.sditds.gov.cn/sdvplatformserver/swProxy/invtwebserver/sw/ems/pub/common/EmsListQuery/Npts/")
)
oS.bBufferResponse = true;
}

封包响应结束事件

1
2
3
4
private void On_AfterSessionComplete(Session oS)
{

}

几个关键的方法和变量

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
36
37
38
39
40
41
42
43
//获得Request体

oSession.GetRequestBodyAsString()

//获得Response内容

oSession.GetResponseBodyAsString()

// 修改session中的显示样式

oSession["ui-color"] = "orange";

// 移除http头部中的MQB-X5-Referer字段

oSession.oRequest.headers.Remove("MQB-X5-Referer");

// 修改http头部中的Cache-Control字段

oSession.oRequest["Cache-Control"] = "no-cache";

// 修改host

oSession.host = "example.domain";

// 修改Origin字段

oSession.oRequest["Origin"] = "http://domain";

// 删除所有的cookie

oSession.oRequest.headers.Remove("Cookie");

// 新建cookie

oSession.oRequest.headers.Add("Cookie", "username=cookiename;");

// 修改Referer字段

oSession.oRequest["Referer"] = "https://yoururl";

拦截websockets请求

FiddlerApplication_OnWebSocketMessage