/// <summary> /// Replace the http response in oSession with your rule /// </summary> /// <param name="oSession">oSession</param> /// <param name="nowFiddlerResponseChange">FiddlerResponseChange</param> public static void ReplaceSessionResponse(Session oSession, FiddlerResponseChange nowFiddlerResponseChange, Action <string> ShowError, Action <string> ShowMes) { bool isClosePipeWhenReplace = false; byte[] tempResponseBytes; string errMes; NameValueCollection nameValueCollection; HttpResponse tempHttpResponse; try { tempHttpResponse = nowFiddlerResponseChange.HttpRawResponse.UpdateHttpResponse(out errMes, out nameValueCollection); tempResponseBytes = tempHttpResponse.GetRawHttpResponse(); } catch (Exception ex) { ShowError(string.Format("Fail to ReplaceSessionResponse :{0}", ex.Message)); return; } if (errMes != null) { ShowError(errMes); } if (nameValueCollection != null && nameValueCollection.Count > 0) { ShowMes(string.Format("[ParameterizationContent]:{0}", nameValueCollection.MyToFormatString())); } using (MemoryStream ms = new MemoryStream(tempResponseBytes)) { if (isClosePipeWhenReplace) { oSession.PoisonClientPipe(); //关闭客户端与代理的连接(Ensures that, after the response is complete, the client socket is closed and not reused. Does NOT (and must not) close the pipe. ) oSession.PoisonServerPipe(); //关闭代理与服务器的连接 } if (!oSession.LoadResponseFromStream(ms, null)) { ShowError("error to oSession.LoadResponseFromStream"); ShowError("try to modific the response"); //modific the response oSession.oResponse.headers = new HTTPResponseHeaders(); oSession.oResponse.headers.HTTPResponseCode = tempHttpResponse.ResponseCode; oSession.ResponseHeaders.StatusDescription = tempHttpResponse.ResponseStatusDescription; ((Fiddler.HTTPHeaders)(oSession.ResponseHeaders)).HTTPVersion = tempHttpResponse.ResponseVersion; if (tempHttpResponse.ResponseHeads != null && tempHttpResponse.ResponseHeads.Count > 0) { foreach (var tempHead in tempHttpResponse.ResponseHeads) { oSession.oResponse.headers.Add(tempHead.Key, tempHead.Value); } } oSession.responseBodyBytes = tempHttpResponse.ResponseEntity; } } }
/// <summary> /// Modific the websocket message with your rule /// </summary> /// <param name="oSession"></param> /// <param name="webSocketMessage"></param> /// <param name="nowFiddlerRequsetChange"></param> /// <param name="ShowError"></param> /// <param name="ShowMes"></param> public static void ModificWebSocketMessage(Session oSession, WebSocketMessage webSocketMessage, IFiddlerHttpTamper nowFiddlerChange, bool isRequest, Action <string> ShowError, Action <string> ShowMes) { if (nowFiddlerChange.ParameterPickList != null) { PickSessionParameter(oSession, nowFiddlerChange, ShowError, ShowMes, webSocketMessage.IsOutbound, webSocketMessage); } ContentModific payLoadModific = null; if (isRequest) { FiddlerRequestChange nowFiddlerRequsetChange = (FiddlerRequestChange)nowFiddlerChange; payLoadModific = nowFiddlerRequsetChange.BodyModific; } else { FiddlerResponseChange nowFiddlerResponseChange = (FiddlerResponseChange)nowFiddlerChange; payLoadModific = nowFiddlerResponseChange.BodyModific; } //Modific body if (payLoadModific != null && payLoadModific.ModificMode != ContentModificMode.NoChange) { if (payLoadModific.ModificMode == ContentModificMode.HexReplace) { try { webSocketMessage.SetPayload(payLoadModific.GetFinalContent(webSocketMessage.PayloadAsBytes())); } catch (Exception ex) { ShowError(string.Format("error in GetFinalContent in HexReplace with [{0}]", ex.Message)); } } else { string sourcePayload = webSocketMessage.PayloadAsString(); if (payLoadModific.ModificMode == ContentModificMode.ReCode) { try { webSocketMessage.SetPayload(payLoadModific.GetRecodeContent(sourcePayload)); } catch (Exception ex) { ShowError(string.Format("error in GetRecodeContent in ReCode with [{0}]", ex.Message)); } } else { webSocketMessage.SetPayload(payLoadModific.GetFinalContent(sourcePayload)); } } } }
private FiddlerResponseChange GetResponseReplaceInfo() { FiddlerResponseChange responseChange = new FiddlerResponseChange(); responseChange.ActuatorStaticDataController = new FiddlerActuatorStaticDataCollectionController(StaticDataCollection); responseChange.HttpFilter = GetHttpFilter(); responseChange.ParameterPickList = GetParameterPick(); responseChange.LesponseLatency = GetResponseLatency(); responseChange.HttpRawResponse = rawResponseEdit.GetHttpResponse(StaticDataCollection); responseChange.IsIsDirectRespons = rawResponseEdit.IsDirectRespons; return(responseChange); }
private FiddlerResponseChange GetResponseReplaceInfo() { FiddlerResponseChange responseChange = new FiddlerResponseChange(); responseChange.TamperProtocol = NowProtocalMode; //responseChange.ActuatorStaticDataController = new FiddlerActuatorStaticDataCollectionController(StaticDataCollection); responseChange.HttpFilter = GetHttpFilter(); responseChange.ParameterPickList = GetParameterPick(); responseChange.LesponseLatency = GetResponseLatency(); responseChange.HttpRawResponse = rawResponseEdit.GetHttpResponse(StaticDataCollection); responseChange.IsIsDirectRespons = rawResponseEdit.IsDirectRespons; responseChange.SetHasParameter(pb_parameterSwitch.SwitchState, StaticDataCollection); return(responseChange); }
private void SetResponseModificInfo(FiddlerResponseChange fiddlerResponseChange) { SetHttpMatch(fiddlerResponseChange.HttpFilter); SetResponseLatency(fiddlerResponseChange.LesponseLatency); SetHttpParameterPick(fiddlerResponseChange.ParameterPickList); pb_parameterSwitch.SwitchState = fiddlerResponseChange.IsHasParameter; if (fiddlerResponseChange.HttpRawResponse == null) { tabControl_Modific.SelectedTab = tabPage_responseModific; if (fiddlerResponseChange.HeadDelList != null) { foreach (string tempHead in fiddlerResponseChange.HeadDelList) { responseRemoveHeads.ListDataView.Items.Add(tempHead); } } if (fiddlerResponseChange.HeadAddList != null) { foreach (string tempHead in fiddlerResponseChange.HeadAddList) { responseAddHeads.ListDataView.Items.Add(tempHead); } } if (fiddlerResponseChange.BodyModific != null && fiddlerResponseChange.BodyModific.ModificMode != ContentModificMode.NoChange) { tb_responseModific_body.Text = fiddlerResponseChange.BodyModific.ParameterTargetKey.ToString(); if (!string.IsNullOrEmpty(fiddlerResponseChange.BodyModific.ParameterReplaceContent.ToString())) { rtb_respenseModific_body.AppendText(fiddlerResponseChange.BodyModific.ParameterReplaceContent.ToString()); } } } else { tabControl_Modific.SelectedTab = tabPage_responseReplace; rawResponseEdit.IsDirectRespons = fiddlerResponseChange.IsIsDirectRespons; rawResponseEdit.IsUseParameterData = fiddlerResponseChange.HttpRawResponse.ParameterizationContent.hasParameter; if (fiddlerResponseChange.HttpRawResponse.OriginSting != null) { rawResponseEdit.SetText(fiddlerResponseChange.HttpRawResponse.OriginSting); } pb_parameterSwitch.SwitchState = fiddlerResponseChange.HttpRawResponse.ParameterizationContent.hasParameter; } }
public void AutoTamperResponseAfter(Session oSession) { if (!isOnLoad) { return; } if (myFreeHttpWindow.IsResponseRuleEnable) { if (isSkipUiHide && oSession["ui-hide"] == "true") { return; } if (myFreeHttpWindow.ModificSettingInfo.IsSkipConnectTunnels && oSession.RequestMethod == "CONNECT") { return; } List <IFiddlerHttpTamper> matchItems = FiddlerSessionHelper.FindMatchTanperRule(oSession, myFreeHttpWindow.FiddlerResponseChangeList, false); if (matchItems != null && matchItems.Count > 0) { foreach (var matchItem in matchItems) { FiddlerResponseChange nowFiddlerResponseChange = ((FiddlerResponseChange)matchItem); ListViewItem tempListViewItem = myFreeHttpWindow.FindListViewItemFromRule(matchItem); if (!(nowFiddlerResponseChange.IsRawReplace && nowFiddlerResponseChange.IsIsDirectRespons)) { FreeHttpWindow.MarkMatchRule(tempListViewItem); MarkSession(oSession); ShowMes(string.Format("macth the [reponse rule {0}] with {1}", tempListViewItem.SubItems[0].Text, oSession.fullUrl)); FiddlerSessionTamper.ModificSessionResponse(oSession, nowFiddlerResponseChange, ShowError, ShowMes); } if (nowFiddlerResponseChange.LesponseLatency > 0) { ShowMes(string.Format("[reponse rule {0}] is modified , now delay {1} ms", tempListViewItem.SubItems[0].Text, nowFiddlerResponseChange.LesponseLatency)); System.Threading.Thread.Sleep(nowFiddlerResponseChange.LesponseLatency); } if (myFreeHttpWindow.ModificSettingInfo.IsOnlyMatchFistTamperRule) { break; } } } } }
/// <summary> /// Modific the websocket message with your rule /// </summary> /// <param name="oSession"></param> /// <param name="webSocketMessage"></param> /// <param name="nowFiddlerRequsetChange"></param> /// <param name="ShowError"></param> /// <param name="ShowMes"></param> public static void ModificWebSocketMessage(Session oSession, WebSocketMessage webSocketMessage, IFiddlerHttpTamper nowFiddlerChange, bool isRequest, Action <string> ShowError, Action <string> ShowMes) { if (nowFiddlerChange.ParameterPickList != null) { PickSessionParameter(oSession, nowFiddlerChange, ShowError, ShowMes, webSocketMessage.IsOutbound, webSocketMessage); } ParameterContentModific payLoadModific = null; if (isRequest) { FiddlerRequestChange nowFiddlerRequsetChange = (FiddlerRequestChange)nowFiddlerChange; payLoadModific = nowFiddlerRequsetChange.BodyModific; } else { FiddlerResponseChange nowFiddlerResponseChange = (FiddlerResponseChange)nowFiddlerChange; payLoadModific = nowFiddlerResponseChange.BodyModific; } //Modific body if (payLoadModific != null && payLoadModific.ModificMode != ContentModificMode.NoChange) { if (payLoadModific.ModificMode == ContentModificMode.HexReplace) { try { webSocketMessage.SetPayload(payLoadModific.GetFinalContent(webSocketMessage.PayloadAsBytes())); } catch (Exception ex) { ShowError(string.Format("error in GetFinalContent in HexReplace with [{0}]", ex.Message)); } } else { if (webSocketMessage.FrameType == WebSocketFrameTypes.Binary) { ShowError("error in GetFinalContent that WebSocketFrameTypes is Binary ,just use <hex> mode"); } else if (webSocketMessage.FrameType == WebSocketFrameTypes.Ping || webSocketMessage.FrameType == WebSocketFrameTypes.Pong || webSocketMessage.FrameType == WebSocketFrameTypes.Close) { // do nothing } else { string sourcePayload = webSocketMessage.PayloadAsString(); if (payLoadModific.ModificMode == ContentModificMode.ReCode) { try { webSocketMessage.SetPayload(payLoadModific.GetRecodeContent(sourcePayload)); } catch (Exception ex) { ShowError(string.Format("error in GetRecodeContent in ReCode with [{0}]", ex.Message)); } } else { string errMes; NameValueCollection nameValueCollection = new NameValueCollection(); //webSocketMessage.SetPayload(payLoadModific.GetFinalContent(sourcePayload)); string tempPayload = payLoadModific.GetFinalContent(sourcePayload, nameValueCollection, out errMes); if (errMes != null) { ShowError(string.Format("error in GetFinalContent in PayLoadModific that [{0}]", errMes)); } if (tempPayload != sourcePayload) //非标准协议的实现,或没有实现的压缩会导致PayloadAsString()使数据不可逆 { webSocketMessage.SetPayload(tempPayload); } if (nameValueCollection != null && nameValueCollection.Count > 0) { ShowMes(string.Format("[ParameterizationContent]:{0}", nameValueCollection.MyToFormatString())); } } } } } }
/// <summary> /// Modific the http response in oSession with your rule (if IsRawReplace and IsIsDirectRespons it will not call ReplaceSessionResponse) /// </summary> /// <param name="oSession">oSession</param> /// <param name="nowFiddlerResponseChange">FiddlerResponseChange</param> public static void ModificSessionResponse(Session oSession, FiddlerResponseChange nowFiddlerResponseChange, Action <string> ShowError, Action <string> ShowMes) { if (nowFiddlerResponseChange.ParameterPickList != null && nowFiddlerResponseChange.ParameterPickList.Count > 0) { PickSessionParameter(oSession, nowFiddlerResponseChange, ShowError, ShowMes, false); } if (nowFiddlerResponseChange.IsRawReplace) { //if IsIsDirectRespons do nothing if (!nowFiddlerResponseChange.IsIsDirectRespons) { ReplaceSessionResponse(oSession, nowFiddlerResponseChange, ShowError, ShowMes); } } else { string errMes; NameValueCollection nameValueCollection = new NameValueCollection(); //modific body if (nowFiddlerResponseChange.BodyModific != null && nowFiddlerResponseChange.BodyModific.ModificMode != ContentModificMode.NoChange) { if (nowFiddlerResponseChange.BodyModific.ModificMode == ContentModificMode.HexReplace) { try { oSession.ResponseBody = nowFiddlerResponseChange.BodyModific.GetFinalContent(oSession.responseBodyBytes); } catch (Exception ex) { ShowError(string.Format("error in GetFinalContent in HexReplace with [{0}]", ex.Message)); } } else { //you should not change the media data as string string sourceResponseBody = null; try { sourceResponseBody = oSession.GetResponseBodyAsString(); //if the head encode is change ,GetResponseBodyAsString maybe fail if (nowFiddlerResponseChange.BodyModific.ParameterTargetKey.ToString().Contains('\n')) { sourceResponseBody = sourceResponseBody.Replace("\r\n", "\n"); } } catch (Exception ex) { ShowError(string.Format("error in GetResponseBodyAsString [{0}]", ex.Message)); oSession.utilDecodeResponse(); sourceResponseBody = oSession.GetResponseBodyEncoding().GetString(oSession.ResponseBody); } finally { if (nowFiddlerResponseChange.BodyModific.ModificMode == ContentModificMode.ReCode) { try { oSession.ResponseBody = nowFiddlerResponseChange.BodyModific.GetRecodeContent(sourceResponseBody); } catch (Exception ex) { ShowError(string.Format("error in GetRecodeContent in ReCode with [{0}]", ex.Message)); } } else { //oSession.utilSetResponseBody(nowFiddlerResponseChange.BodyModific.GetFinalContent(sourceResponseBody)); string tempResponseBody = nowFiddlerResponseChange.BodyModific.GetFinalContent(sourceResponseBody, nameValueCollection, out errMes); if (errMes != null) { ShowError(string.Format("error in GetFinalContent in BodyModific that [{0}]", errMes)); } if (tempResponseBody != sourceResponseBody) { oSession.utilSetResponseBody(tempResponseBody); } } } //you can use below code to modific the body //oSession.utilDecodeResponse(); //oSession.utilReplaceInResponse("",""); //oSession.utilDeflateResponse(); } } //modific heads if (nowFiddlerResponseChange.HeadDelList != null && nowFiddlerResponseChange.HeadDelList.Count > 0) { foreach (var tempDelHead in nowFiddlerResponseChange.HeadDelList) { oSession.ResponseHeaders.Remove(tempDelHead); } } if (nowFiddlerResponseChange.HeadAddList != null && nowFiddlerResponseChange.HeadAddList.Count > 0) { foreach (var tempAddHead in nowFiddlerResponseChange.HeadAddList) { if (tempAddHead.Contains(": ")) { oSession.ResponseHeaders.Add(tempAddHead.Remove(tempAddHead.IndexOf(": ")), tempAddHead.Substring(tempAddHead.IndexOf(": ") + 2)); } else { ShowError(string.Format("error to deal add head string with [{0}]", tempAddHead)); } } } //other action if (nameValueCollection != null && nameValueCollection.Count > 0) { ShowMes(string.Format("[ParameterizationContent]:{0}", nameValueCollection.MyToFormatString())); } } }
public void AutoTamperRequestBefore(Session oSession) { //if (oSession.HTTPMethodIs("CONNECT") && oSession.HostnameIs("api.map.baidu.com")) //{ // oSession["x-OverrideSslProtocols"] = "ssl3.0"; //} //oSession.oRequest["AddOrigin"] = "from lijie PC"; if (!isOnLoad) { return; } if (myFreeHttpWindow.IsRequestRuleEnable) { //IsRequestRuleEnable is more efficient then string comparison (so if not IsRequestRuleEnable the string comparison will not execute) if (isSkipUiHide && oSession["ui-hide"] == "true") { return; } if (myFreeHttpWindow.ModificSettingInfo.IsSkipConnectTunnels && oSession.RequestMethod == "CONNECT") { return; } List <IFiddlerHttpTamper> matchItems = FiddlerSessionHelper.FindMatchTanperRule(oSession, myFreeHttpWindow.FiddlerRequestChangeList, true); if (matchItems != null && matchItems.Count > 0) { foreach (var matchItem in matchItems) { FiddlerRequestChange nowFiddlerRequsetChange = ((FiddlerRequestChange)matchItem); ListViewItem tempListViewItem = myFreeHttpWindow.FindListViewItemFromRule(matchItem); FreeHttpWindow.MarkMatchRule(tempListViewItem); MarkSession(oSession); ShowMes(string.Format("macth the [requst rule {0}] with {1}", tempListViewItem.SubItems[0].Text, oSession.fullUrl)); FiddlerSessionTamper.ModificSessionRequest(oSession, nowFiddlerRequsetChange, ShowError, ShowMes); if (myFreeHttpWindow.ModificSettingInfo.IsOnlyMatchFistTamperRule) { break; } } } } if (myFreeHttpWindow.IsResponseRuleEnable) { if (myFreeHttpWindow.ModificSettingInfo.IsSkipConnectTunnels && oSession.RequestMethod == "CONNECT") { return; } List <IFiddlerHttpTamper> matchItems = FiddlerSessionHelper.FindMatchTanperRule(oSession, myFreeHttpWindow.FiddlerResponseChangeList, false); if (matchItems != null && matchItems.Count > 0) { oSession.bBufferResponse = true;// if any response rule may match the Session, we should set bBufferResponse true (When streaming is enabled for a response, each block of data read from the server is immediately passed to the client application. ) foreach (var matchItem in matchItems) { FiddlerResponseChange nowFiddlerResponseChange = ((FiddlerResponseChange)matchItem); ListViewItem tempListViewItem = myFreeHttpWindow.FindListViewItemFromRule(matchItem); if (nowFiddlerResponseChange.IsIsDirectRespons) { FreeHttpWindow.MarkMatchRule(tempListViewItem); MarkSession(oSession); ShowMes(string.Format("macth the [reponse rule {0}] with {1}", tempListViewItem.SubItems[0].Text, oSession.fullUrl)); FiddlerSessionTamper.ReplaceSessionResponse(oSession, nowFiddlerResponseChange, ShowError, ShowMes); //oSession.state = SessionStates.Done; if (myFreeHttpWindow.ModificSettingInfo.IsOnlyMatchFistTamperRule) { break; } } } } } }
private void FiddlerApplication_OnWebSocketMessage(object sender, WebSocketMessageEventArgs e) { //((Bitmap)((Fiddler.Session)sender).ViewItem.ImageList.Images[34]).Save(@"D:\A1.ico", System.Drawing.Imaging.ImageFormat.Icon); Session oSession = (Session)sender; WebSocketMessage webSocketMessage = e.oWSM; if (!isOnLoad) { return; } if (webSocketMessage == null) { AddFiddlerObjectLog("get null WebSocketMessage"); return; } if (webSocketMessage.FrameType == WebSocketFrameTypes.Close || webSocketMessage.FrameType == WebSocketFrameTypes.Ping || webSocketMessage.FrameType == WebSocketFrameTypes.Pong || webSocketMessage.FrameType == WebSocketFrameTypes.Reservedx3 || webSocketMessage.FrameType == WebSocketFrameTypes.Reservedx4 || webSocketMessage.FrameType == WebSocketFrameTypes.Reservedx5 || webSocketMessage.FrameType == WebSocketFrameTypes.Reservedx6 || webSocketMessage.FrameType == WebSocketFrameTypes.Reservedx7 || webSocketMessage.FrameType == WebSocketFrameTypes.ReservedxB || webSocketMessage.FrameType == WebSocketFrameTypes.ReservedxC || webSocketMessage.FrameType == WebSocketFrameTypes.ReservedxD || webSocketMessage.FrameType == WebSocketFrameTypes.ReservedxE || webSocketMessage.FrameType == WebSocketFrameTypes.ReservedxF) { return; } if ((myFreeHttpWindow.IsRequestRuleEnable && webSocketMessage.IsOutbound) || (myFreeHttpWindow.IsResponseRuleEnable && !webSocketMessage.IsOutbound)) { if (isSkipUiHide && oSession["ui-hide"] == "true") { return; } if (myFreeHttpWindow.ModificSettingInfo.IsSkipConnectTunnels && oSession.RequestMethod == "CONNECT") { return; } bool isRequest = webSocketMessage.IsOutbound; List <IFiddlerHttpTamper> matchItems = null; if (isRequest) { matchItems = FiddlerSessionHelper.FindMatchTanperRule(oSession, myFreeHttpWindow.FiddlerRequestChangeList, isRequest, webSocketMessage); } else { //oSession.WriteResponseToStream(new MemoryStream(new Byte[] { 0x81,0x81,0x01,0x41 }), false); //WebSocket ws = oSession.__oTunnel as WebSocket; //ws.listMessages.Add(webSocketMessage); matchItems = FiddlerSessionHelper.FindMatchTanperRule(oSession, myFreeHttpWindow.FiddlerResponseChangeList, isRequest, webSocketMessage); } if (matchItems != null && matchItems.Count > 0) { foreach (var matchItem in matchItems) { ListViewItem tempListViewItem = myFreeHttpWindow.FindListViewItemFromRule(matchItem); FreeHttpWindow.MarkMatchRule(tempListViewItem); MarkSession(oSession); ShowMes(string.Format("macth the [requst rule {0}] with {1}", tempListViewItem.SubItems[0].Text, oSession.fullUrl)); FiddlerSessionTamper.ModificWebSocketMessage(oSession, webSocketMessage, matchItem, isRequest, ShowError, ShowMes); if (!isRequest) { FiddlerResponseChange nowFiddlerResponseChange = ((FiddlerResponseChange)matchItem); if (nowFiddlerResponseChange.LesponseLatency > 0) { ShowMes(string.Format("[reponse rule {0}] is modified , now delay {1} ms", tempListViewItem.SubItems[0].Text, nowFiddlerResponseChange.LesponseLatency)); System.Threading.Thread.Sleep(nowFiddlerResponseChange.LesponseLatency); } if (myFreeHttpWindow.ModificSettingInfo.IsOnlyMatchFistTamperRule) { break; } } } } } }
private void LoadRuleInfo(IFiddlerHttpTamper ruleInfo) { Action <FiddlerRequestChange> GetFiddlerRequestChangeAddition = (nowFiddlerRequestChange) => { if ((nowFiddlerRequestChange.ParameterPickList != null && nowFiddlerRequestChange.ParameterPickList.Count > 0) || nowFiddlerRequestChange.IsHasParameter) { rtb_ruleInfo.AddRtbStr("Addition ", Color.Red, true, new Font(FontFamily.GenericMonospace, 14)); if (nowFiddlerRequestChange.IsHasParameter) { rtb_ruleInfo.AddRtbStr("Has Parameter: ", Color.Blue, false); rtb_ruleInfo.AppendText("true"); rtb_ruleInfo.AppendText("\r\n"); } if (nowFiddlerRequestChange.ParameterPickList != null && nowFiddlerRequestChange.ParameterPickList.Count > 0) { foreach (var tempRequest in nowFiddlerRequestChange.ParameterPickList) { rtb_ruleInfo.AddRtbStr("Request Parameter Pick: ", Color.Blue, false); rtb_ruleInfo.AppendText(tempRequest.ToString()); rtb_ruleInfo.AppendText("\r\n"); } } } }; Action <FiddlerResponseChange> GetFiddlerResponseChangeAddition = (nowFiddlerResponseChange) => { if ((nowFiddlerResponseChange.ParameterPickList != null && nowFiddlerResponseChange.ParameterPickList.Count > 0) || nowFiddlerResponseChange.IsHasParameter || nowFiddlerResponseChange.ResponseLatency > 0) { rtb_ruleInfo.AddRtbStr("Addition ", Color.Red, true, new Font(FontFamily.GenericMonospace, 14)); if (nowFiddlerResponseChange.IsHasParameter) { rtb_ruleInfo.AddRtbStr("Has Parameter: ", Color.Blue, false); rtb_ruleInfo.AppendText("true"); rtb_ruleInfo.AppendText("\r\n"); } if (nowFiddlerResponseChange.ResponseLatency > 0) { rtb_ruleInfo.AddRtbStr("ResponseLatency: ", Color.Blue, false); rtb_ruleInfo.AppendText(nowFiddlerResponseChange.ResponseLatency + "ms"); rtb_ruleInfo.AppendText("\r\n"); } if (nowFiddlerResponseChange.ParameterPickList != null && nowFiddlerResponseChange.ParameterPickList.Count > 0) { foreach (var tempResponse in nowFiddlerResponseChange.ParameterPickList) { rtb_ruleInfo.AddRtbStr("Response Parameter Pick: ", Color.Blue, false); rtb_ruleInfo.AppendText(tempResponse.ToString()); rtb_ruleInfo.AppendText("\r\n"); } } } }; isLoadRuleComplete = false; MyControlHelper.SetControlFreeze(rtb_ruleInfo); MyControlHelper.SetControlFreeze(this); pb_ruleIcon.Image = InnerListViewItem.ImageList.Images[InnerListViewItem.ImageIndex]; rtb_ruleInfo.Clear(); rtb_ruleInfo.AddRtbStr("Filter ", Color.Red, true, new Font(FontFamily.GenericMonospace, 14)); if (ruleInfo.HttpFilter.UriMatch != null) { rtb_ruleInfo.AddRtbStr("Uri: ", Color.Blue, false); rtb_ruleInfo.AppendText(ruleInfo.HttpFilter.UriMatch.ToString()); rtb_ruleInfo.AppendText("\r\n"); } if (ruleInfo.HttpFilter.HeadMatch != null && ruleInfo.HttpFilter.HeadMatch.HeadsFilter.Count > 0) { foreach (var tempHeaderFilter in ruleInfo.HttpFilter.HeadMatch.HeadsFilter) { rtb_ruleInfo.AddRtbStr("Header: ", Color.Blue, false); rtb_ruleInfo.AppendText(string.Format("{0} [contain] {1}", tempHeaderFilter.Key, tempHeaderFilter.Value)); rtb_ruleInfo.AppendText("\r\n"); } } if (ruleInfo.HttpFilter.BodyMatch != null) { rtb_ruleInfo.AddRtbStr("Entity: ", Color.Blue, false); rtb_ruleInfo.AppendText(ruleInfo.HttpFilter.BodyMatch.ToString()); rtb_ruleInfo.AppendText("\r\n"); } rtb_ruleInfo.AddRtbStr("Action ", Color.Red, true, new Font(FontFamily.GenericMonospace, 14)); switch (ruleInfo.TamperProtocol) { case TamperProtocalType.Http: if (ruleInfo is FiddlerRequestChange) { lb_ruleId.Text = string.Format("Http Request Tamper Rule {0}", InnerListViewItem.SubItems[0].Text); FiddlerRequestChange nowFiddlerRequestChange = ruleInfo as FiddlerRequestChange; if (nowFiddlerRequestChange.IsRawReplace) { rtb_ruleInfo.AddRtbStr("Request Replace", Color.Blue, true); rtb_ruleInfo.AppendText(nowFiddlerRequestChange.HttpRawRequest.OriginSting); rtb_ruleInfo.AppendText("\r\n"); } else { if (nowFiddlerRequestChange.UriModific != null && nowFiddlerRequestChange.UriModific.ModificMode != HttpHelper.ContentModificMode.NoChange) { rtb_ruleInfo.AddRtbStr("Request Uri Modific: ", Color.Blue, false); rtb_ruleInfo.AppendText(nowFiddlerRequestChange.UriModific.ToString()); rtb_ruleInfo.AppendText("\r\n"); } if (nowFiddlerRequestChange.HeadDelList != null && nowFiddlerRequestChange.HeadDelList.Count > 0) { foreach (var tempHeaderDel in nowFiddlerRequestChange.HeadDelList) { rtb_ruleInfo.AddRtbStr("Request Head Delete: ", Color.Blue, false); rtb_ruleInfo.AppendText(tempHeaderDel); } } if (nowFiddlerRequestChange.HeadAddList != null && nowFiddlerRequestChange.HeadAddList.Count > 0) { foreach (var tempHeaderAdd in nowFiddlerRequestChange.HeadAddList) { rtb_ruleInfo.AddRtbStr("Request Head Add: ", Color.Blue, false); rtb_ruleInfo.AppendText(tempHeaderAdd); rtb_ruleInfo.AppendText("\r\n"); } } if (nowFiddlerRequestChange.BodyModific != null && nowFiddlerRequestChange.BodyModific.ModificMode != HttpHelper.ContentModificMode.NoChange) { rtb_ruleInfo.AddRtbStr("Request Entity Modific: ", Color.Blue, false); rtb_ruleInfo.AppendText(nowFiddlerRequestChange.BodyModific.ToString()); rtb_ruleInfo.AppendText("\r\n"); } } GetFiddlerRequestChangeAddition(nowFiddlerRequestChange); } else if (ruleInfo is FiddlerResponseChange) { lb_ruleId.Text = string.Format("Http Response Tamper Rule {0}", InnerListViewItem.SubItems[0].Text); FiddlerResponseChange nowFiddlerResponseChange = ruleInfo as FiddlerResponseChange; if (nowFiddlerResponseChange.IsRawReplace) { rtb_ruleInfo.AddRtbStr("Request Replace", Color.Blue, true); rtb_ruleInfo.AppendText(nowFiddlerResponseChange.HttpRawResponse.OriginSting); rtb_ruleInfo.AppendText("\r\n"); } else { if (nowFiddlerResponseChange.HeadDelList != null && nowFiddlerResponseChange.HeadDelList.Count > 0) { foreach (var tempHeaderDel in nowFiddlerResponseChange.HeadDelList) { rtb_ruleInfo.AddRtbStr("Response Head Delete: ", Color.Blue, false); rtb_ruleInfo.AppendText(tempHeaderDel); rtb_ruleInfo.AppendText("\r\n"); } } if (nowFiddlerResponseChange.HeadAddList != null && nowFiddlerResponseChange.HeadAddList.Count > 0) { foreach (var tempHeaderAdd in nowFiddlerResponseChange.HeadAddList) { rtb_ruleInfo.AddRtbStr("Response Head Add: ", Color.Blue, false); rtb_ruleInfo.AppendText(tempHeaderAdd); rtb_ruleInfo.AppendText("\r\n"); } } if (nowFiddlerResponseChange.BodyModific != null && nowFiddlerResponseChange.BodyModific.ModificMode != HttpHelper.ContentModificMode.NoChange) { rtb_ruleInfo.AddRtbStr("Response Entity Modific: ", Color.Blue, false); rtb_ruleInfo.AppendText(nowFiddlerResponseChange.BodyModific.ToString()); rtb_ruleInfo.AppendText("\r\n"); } } GetFiddlerResponseChangeAddition(nowFiddlerResponseChange); } break; case TamperProtocalType.WebSocket: if (ruleInfo is FiddlerRequestChange) { lb_ruleId.Text = string.Format("Websocket Send Tamper Rule {0}", InnerListViewItem.SubItems[0].Text); FiddlerRequestChange nowFiddlerWebSocketRequestChange = ruleInfo as FiddlerRequestChange; if (nowFiddlerWebSocketRequestChange.BodyModific != null && nowFiddlerWebSocketRequestChange.BodyModific.ModificMode != HttpHelper.ContentModificMode.NoChange) { rtb_ruleInfo.AddRtbStr("Socket Payload Modific: ", Color.Blue, false); rtb_ruleInfo.AppendText(nowFiddlerWebSocketRequestChange.BodyModific.ToString()); rtb_ruleInfo.AppendText("\r\n"); } GetFiddlerRequestChangeAddition(nowFiddlerWebSocketRequestChange); } else if (ruleInfo is FiddlerResponseChange) { lb_ruleId.Text = string.Format("Websocket Receive Tamper Rule {0}", InnerListViewItem.SubItems[0].Text); FiddlerResponseChange nowFiddlerWebSocketResponseChange = ruleInfo as FiddlerResponseChange; if (nowFiddlerWebSocketResponseChange.BodyModific != null && nowFiddlerWebSocketResponseChange.BodyModific.ModificMode != HttpHelper.ContentModificMode.NoChange) { rtb_ruleInfo.AddRtbStr("Socket Payload Modific: ", Color.Blue, false); rtb_ruleInfo.AppendText(nowFiddlerWebSocketResponseChange.BodyModific.ToString()); rtb_ruleInfo.AppendText("\r\n"); } GetFiddlerResponseChangeAddition(nowFiddlerWebSocketResponseChange); } break; default: break; } if (!string.IsNullOrEmpty(ruleInfo.HttpFilter.Name)) { lb_ruleId.Text += string.Format(" ({0})", ruleInfo.HttpFilter.Name); } isLoadRuleComplete = true; MyControlHelper.SetControlUnfreeze(rtb_ruleInfo); MyControlHelper.SetControlUnfreeze(this); if (rtb_ruleInfo.Rtf.EndsWith("\r\n")) { rtb_ruleInfo.Rtf = rtb_ruleInfo.Rtf.Remove(rtb_ruleInfo.Rtf.Length - 2, 2); } }
private void pb_ruleComfrim_Click(object sender, EventArgs e) { FiddlerRequsetChange nowRequestChange = null; FiddlerResponseChange nowResponseChange = null; IFiddlerHttpTamper fiddlerHttpTamper = null; ListView tamperRuleListView = null; try { switch (tabControl_Modific.SelectedIndex) { case 0: nowRequestChange = GetRequestModificInfo(); break; case 1: nowRequestChange = GetRequestReplaceInfo(); break; case 2: nowResponseChange = GetResponseModificInfo(); break; case 3: nowResponseChange = GetResponseReplaceInfo(); break; default: throw new Exception("unknow http tamper tab"); //break; } } catch (Exception ex) { MessageBox.Show(ex.Message, "Stop", MessageBoxButtons.OK, MessageBoxIcon.Stop); MarkControl(tabControl_Modific.SelectedTab, Color.Plum, 2); nowRequestChange = null; nowResponseChange = null; } finally { if (nowRequestChange != null) { fiddlerHttpTamper = nowRequestChange; tamperRuleListView = lv_requestRuleList; } else if (nowResponseChange != null) { fiddlerHttpTamper = nowResponseChange; tamperRuleListView = lv_responseRuleList; } } if (fiddlerHttpTamper == null) { return; } if (fiddlerHttpTamper.HttpFilter == null || fiddlerHttpTamper.HttpFilter.UriMatch == null) { MessageBox.Show("you Uri Filter is not legal \r\n check it again", "edit again"); MarkControl(groupBox_urlFilter, Color.Plum, 2); return; } ListViewItem nowRuleItem = null; foreach (ListViewItem tempItem in tamperRuleListView.Items) { if (tempItem == EditListViewItem) { continue; } //if (fiddlerHttpTamper.HttpFilter.UriMatch.Equals(tempItem.Tag)) if (fiddlerHttpTamper.HttpFilter.Equals(tempItem.Tag)) { MarkRuleItem(tempItem, Color.Plum, 2); DialogResult tempDs; //add mode if (EditListViewItem == null) { tempDs = MessageBox.Show(string.Format("find same url filter with [Rule:{0}], do you want create the same uri rule \r\n [Yes] new a same url filter rule \r\n [No] update the rule \r\n [Cancel] give up save", tempItem.SubItems[0].Text), "find same rule ", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); if (tempDs == DialogResult.Yes) { continue; } else if (tempDs == DialogResult.No) { nowRuleItem = tempItem; SyncEnableSateToIFiddlerHttpTamper(nowRuleItem, fiddlerHttpTamper); UpdataRuleToListView(nowRuleItem, fiddlerHttpTamper, true); break; } else { return; } } //edit mode else { tempDs = MessageBox.Show(string.Format("find same uri filter with [Rule:{0}], do you want save the rule \r\n [Yes] skip the same uri filter rule \r\n [No] remove the rule \r\n [Cancel] give up save", tempItem.SubItems[0].Text), "find same rule ", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); if (tempDs == DialogResult.Yes) { continue; } else if (tempDs == DialogResult.No) { tamperRuleListView.Items.Remove(tempItem); continue; } else { return; } } } } if (nowRuleItem == null) { if (EditListViewItem == null) { AddRuleToListView(tamperRuleListView, fiddlerHttpTamper, true); } else { SyncEnableSateToIFiddlerHttpTamper(EditListViewItem, fiddlerHttpTamper); UpdataRuleToListView(EditListViewItem, fiddlerHttpTamper, true); } } ChangeEditRuleMode(RuleEditMode.NewRuleMode, null, null); }
public void AutoTamperRequestBefore(Session oSession) { //if (oSession.HTTPMethodIs("CONNECT") && oSession.HostnameIs("api.map.baidu.com")) //{ // oSession["x-OverrideSslProtocols"] = "ssl3.0"; //} //oSession.oRequest["AddOrigin"] = "from lijie PC"; if (!isOnLoad) { return; } if (myFreeHttpWindow.IsRequestRuleEnable) { //IsRequestRuleEnable is more efficient then string comparison (so if not IsRequestRuleEnable the string comparison will not execute) if (isSkipUiHide && oSession["ui-hide"] == "true") { return; } if (myFreeHttpWindow.ModificSettingInfo.IsSkipTlsHandshake && oSession.RequestMethod == "CONNECT") { return; } List <ListViewItem> matchItems = FiddlerSessionHelper.FindMatchTanperRule(oSession, myFreeHttpWindow.RequestRuleListView, true); if (matchItems != null && matchItems.Count > 0) { foreach (var matchItem in matchItems) { FiddlerRequsetChange nowFiddlerRequsetChange = ((FiddlerRequsetChange)matchItem.Tag); FreeHttpWindow.MarkMatchRule(matchItem); MarkSession(oSession); ShowMes(string.Format("macth the [requst rule {0}] with {1}", matchItem.SubItems[0].Text, oSession.fullUrl)); FiddlerSessionTamper.ModificSessionRequest(oSession, nowFiddlerRequsetChange, ShowError, ShowMes); if (myFreeHttpWindow.ModificSettingInfo.IsOnlyMatchFistTamperRule) { break; } } } } if (myFreeHttpWindow.IsResponseRuleEnable) { if (myFreeHttpWindow.ModificSettingInfo.IsSkipTlsHandshake && oSession.RequestMethod == "CONNECT") { return; } List <ListViewItem> matchItems = FiddlerSessionHelper.FindMatchTanperRule(oSession, myFreeHttpWindow.ResponseRuleListView, false); if (matchItems != null && matchItems.Count > 0) { foreach (var matchItem in matchItems) { FiddlerResponseChange nowFiddlerResponseChange = ((FiddlerResponseChange)matchItem.Tag); if (nowFiddlerResponseChange.IsIsDirectRespons) { FreeHttpWindow.MarkMatchRule(matchItem); MarkSession(oSession); ShowMes(string.Format("macth the [reponse rule {0}] with {1}", matchItem.SubItems[0].Text, oSession.fullUrl)); FiddlerSessionTamper.ReplaceSessionResponse(oSession, nowFiddlerResponseChange, ShowError, ShowMes); //oSession.state = SessionStates.Done; if (myFreeHttpWindow.ModificSettingInfo.IsOnlyMatchFistTamperRule) { break; } } } } } }
/// <summary> /// Modific the http response in oSession with your rule (if IsRawReplace and IsIsDirectRespons it will not call ReplaceSessionResponse) /// </summary> /// <param name="oSession">oSession</param> /// <param name="nowFiddlerResponseChange">FiddlerResponseChange</param> public static void ModificSessionResponse(Session oSession, FiddlerResponseChange nowFiddlerResponseChange, Action <string> ShowError, Action <string> ShowMes) { if (nowFiddlerResponseChange.ParameterPickList != null) { PickSessionParameter(oSession, nowFiddlerResponseChange, ShowError, ShowMes, false); } if (nowFiddlerResponseChange.IsRawReplace) { //if IsIsDirectRespons do nothing if (!nowFiddlerResponseChange.IsIsDirectRespons) { ReplaceSessionResponse(oSession, nowFiddlerResponseChange, ShowError, ShowMes); } } else { if (nowFiddlerResponseChange.HeadDelList != null && nowFiddlerResponseChange.HeadDelList.Count > 0) { foreach (var tempDelHead in nowFiddlerResponseChange.HeadDelList) { oSession.ResponseHeaders.Remove(tempDelHead); } } if (nowFiddlerResponseChange.HeadAddList != null && nowFiddlerResponseChange.HeadAddList.Count > 0) { foreach (var tempAddHead in nowFiddlerResponseChange.HeadAddList) { if (tempAddHead.Contains(": ")) { oSession.ResponseHeaders.Add(tempAddHead.Remove(tempAddHead.IndexOf(": ")), tempAddHead.Substring(tempAddHead.IndexOf(": ") + 2)); } else { ShowError(string.Format("error to deal add head string with [{0}]", tempAddHead)); } } } if (nowFiddlerResponseChange.BodyModific != null && nowFiddlerResponseChange.BodyModific.ModificMode != ContentModificMode.NoChange) { //you should not change the media data as string string sourceResponseBody = null; try { sourceResponseBody = oSession.GetResponseBodyAsString(); } catch (Exception ex) { ShowError(string.Format("error in GetResponseBodyAsString [{0}]", ex.Message)); oSession.utilDecodeResponse(); sourceResponseBody = oSession.GetResponseBodyEncoding().GetString(oSession.ResponseBody); } finally { oSession.utilSetResponseBody(nowFiddlerResponseChange.BodyModific.GetFinalContent(sourceResponseBody)); } //you can use below code to modific the body //oSession.utilDecodeResponse(); //oSession.utilReplaceInResponse("",""); //oSession.utilDeflateResponse(); } } }
public static async Task <RuleDetails> GetRemoteRuleAsync(string token, string apiUrl = _getRuleUrl) { HttpResponseMessage responseMessage = await httpClient.GetAsync(string.Format(apiUrl, ConfigurationData.BaseUrl, token)); if (responseMessage.StatusCode != System.Net.HttpStatusCode.OK) { return(null); } RuleDetails ruleDetails = MyJsonHelper.JsonDataContractJsonSerializer.JsonStringToObject <RuleDetails>(await responseMessage.Content.ReadAsStringAsync()); if (ruleDetails == null) { return(null); } string nowVersion = UserComputerInfo.GetRuleVersion(); if (ruleDetails.RuleStaticDataCell != null) { //if (ruleDetails.RuleStaticData.RuleVersion == nowVersion) ruleDetails.StaticDataCollection = MyJsonHelper.JsonDataContractJsonSerializer.JsonStringToObject <ActuatorStaticDataCollection>(ruleDetails.RuleStaticDataCell.RuleContent); } if (ruleDetails.RuleGroupCell != null) { //if (ruleDetails.RuleStaticData.RuleVersion == nowVersion) ruleDetails.RuleGroup = MyJsonHelper.JsonDataContractJsonSerializer.JsonStringToObject <FiddlerRuleGroup>(ruleDetails.RuleGroupCell.RuleContent); } if (ruleDetails.RequestRuleCells != null || ruleDetails.ResponseRuleCells != null) { ruleDetails.ModificHttpRuleCollection = new FiddlerModificHttpRuleCollection(); ruleDetails.ModificHttpRuleCollection.RequestRuleList = new List <FiddlerRequestChange>(); ruleDetails.ModificHttpRuleCollection.ResponseRuleList = new List <FiddlerResponseChange>(); //fill RequestRule foreach (var cell in ruleDetails.RequestRuleCells) { if (cell.RuleVersion != nowVersion) { ruleDetails.ModificHttpRuleCollection.RequestRuleList.Add(new FiddlerRequestChange() { IsEnable = false, HttpFilter = new FiddlerHttpFilter() { Name = "unmatch rule version", UriMatch = new FiddlerUriMatch() { MatchMode = FiddlerUriMatchMode.Is, MatchUri = "unmatch rule version" } } }); } else { FiddlerRequestChange tmepRequestChange = MyJsonHelper.JsonDataContractJsonSerializer.JsonStringToObject <FiddlerRequestChange>(cell.RuleContent); ruleDetails.ModificHttpRuleCollection.RequestRuleList.Add(tmepRequestChange ?? new FiddlerRequestChange() { IsEnable = false, HttpFilter = new FiddlerHttpFilter() { Name = "can not parse this rule", UriMatch = new FiddlerUriMatch() { MatchMode = FiddlerUriMatchMode.Is, MatchUri = "can not parse this rule" } } }); } } //fill ResponseRule foreach (var cell in ruleDetails.ResponseRuleCells) { if (cell.RuleVersion != nowVersion) { ruleDetails.ModificHttpRuleCollection.ResponseRuleList.Add(new FiddlerResponseChange() { IsEnable = false, HttpFilter = new FiddlerHttpFilter() { Name = "unmatch rule version", UriMatch = new FiddlerUriMatch() { MatchMode = FiddlerUriMatchMode.Is, MatchUri = "unmatch rule version" } } }); } else { FiddlerResponseChange tmepRequestChange = MyJsonHelper.JsonDataContractJsonSerializer.JsonStringToObject <FiddlerResponseChange>(cell.RuleContent); ruleDetails.ModificHttpRuleCollection.ResponseRuleList.Add(tmepRequestChange ?? new FiddlerResponseChange() { IsEnable = false, HttpFilter = new FiddlerHttpFilter() { Name = "can not parse this rule", UriMatch = new FiddlerUriMatch() { MatchMode = FiddlerUriMatchMode.Is, MatchUri = "can not parse this rule" } } }); } } } return(ruleDetails); }