import System; import System.Windows.Forms; import Fiddler; // イントロダクション // // Well, hello there! // // さて、こんにちは。 :-) // // これは、Progress Telerik Fiddler Classicのメニューコマンドやその他の機能の一部を作成する、FiddlerScript Rulesファイルです。 // このファイルを編集して、コマンドを修正したり、新しいコマンドを追加したりすることができます。 // // このファイルのオリジナルはSampleRules.jsという名前で、以下の場所にあります。 // \Program Files\Fiddler\ // // Fiddler Classicが最初に実行されると、CustomRules.jsという名前のコピーがあなたの // \Documents\Fiddler2\Scripts // フォルダの中にCustomRules.jsという名前のコピーが作成されます。 // // このファイルを間違って編集してしまった場合は、CustomRules.jsを削除してFiddler Classicを再起動してください。 // js ファイルを削除し、Fiddler Classic を再起動してください。 // デフォルトのルールの新しいコピーが、元のサンプルルールファイルから作成されます。 // このファイルを編集する最良の方法は、FiddlerScript Editorをインストールすることです。 // インストールすることです。ここで入手してください。 http://fiddler2.com/r/?SYNTAXVIEWINSTALL // GLOBALIZATION NOTE:このファイルは、UTF-8エンコーディングで保存してください。 // JScript.NET リファレンス // http://fiddler2.com/r/?msdnjsnet // // FiddlerScript リファレンス // http://fiddler2.com/r/?fiddlerscriptcookbook class Handlers { // ***************** // // これがHandlersクラスです。FiddlerScript に追加するほとんどのものは、このクラス内にあります。 // このクラスは、FiddlerScript に追加されるほとんどすべてのもの、あるいは以下に示す既存の関数のいずれかに属します。 // // ***************** // 次のスニペットは、Web Sessions リスト用のカスタムバウンドカラムを実演しています。 // 詳しくは http://fiddler2.com/r/?fiddlercolumns を参照してください。 /* public static BindUIColumn("Method", 60) function FillMethodColumn(oS: Session): String { return oS.RequestMethod; } */ // 次のスニペットは、単純なテキストを表示するカスタムタブを作成する方法を示しています。 /* public BindUITab("Flags") static function FlagsReport(arrSess: Session[]):String { var oSB: System.Text.StringBuilder = new System.Text.StringBuilder(); for (var i:int = 0; i-1)) { // 大文字・小文字を区別する oSession.url = oSession.url.Replace(gs_ReplaceToken, gs_ReplaceTokenWith); } if ((null != gs_OverridenHost) && (oSession.host.toLowerCase() == gs_OverridenHost)) { oSession["x-overridehost"] = gs_OverrideHostWith; } if ((null!=bpRequestURI) && oSession.uriContains(bpRequestURI)) { oSession["x-breakrequest"]="uri"; } if ((null!=bpMethod) && (oSession.HTTPMethodIs(bpMethod))) { oSession["x-breakrequest"]="method"; } if ((null!=uiBoldURI) && oSession.uriContains(uiBoldURI)) { oSession["ui-bold"]="QuickExec"; } if (m_SimulateModem) { // アップロード1KBにつき300msの送信遅延が発生します。 oSession["request-trickle-delay"] = "300"; // ダウンロード1KBにつき150msの受信遅延が発生します。 oSession["response-trickle-delay"] = "150"; } if (m_DisableCaching) { oSession.oRequest.headers.Remove("If-None-Match"); oSession.oRequest.headers.Remove("If-Modified-Since"); oSession.oRequest["Pragma"] = "no-cache"; } // User-Agent のオーバーライド if (null != sUA) { oSession.oRequest["User-Agent"] = sUA; } if (m_Japanese) { oSession.oRequest["Accept-Language"] = "ja"; } if (m_AutoAuth) { // 現在の Fiddler Classic ユーザーの認証情報を使用して、認証チャレンジに自動的に応答します。 // 現在の Fiddler Classic ユーザーの認証情報を使用して、認証チャレンジに自動的に応答します。変更することができます (デフォルト) // ドメイン名:パスワード文字列に変更することができます。 // // 警告: リモート接続が許可されている場合、この設定にはセキュリティリスクがあります。 // 警告: リモート接続が許可されている場合、この設定はセキュリティリスクを引き起こします! oSession["X-AutoAuth"] = "(default)"; } if (m_AlwaysFresh && (oSession.oRequest.headers.Exists("If-Modified-Since") || oSession.oRequest.headers.Exists("If-None-Match"))) { oSession.utilCreateResponseAndBypassServer(); oSession.responseCode = 304; oSession["ui-backcolor"] = "Lavender"; } } // この関数は、リクエストヘッダのセットがクライアントから読み込まれた直後に呼び出されます。 // クライアントから読み込まれた直後に呼ばれます。これは通常、ボディがまだ読み込まれていないため、あまり有用な作業を行うには早すぎる // しかし、時には役に立つかもしれません。 // // 例えば、以下を参照してください。 // http://blogs.msdn.com/b/fiddler/archive/2011/11/05/http-expect-continue-delays-transmitting-post-bodies-by-up-to-350-milliseconds.aspx // このハンドラでできる便利なことの1つについて、を参照してください。 // // 注意: oSession.requestBodyBytes はこの関数内では使用できません! /* static function OnPeekAtRequestHeaders(oSession: Session) { var sProc = ("" + oSession["x-ProcessInfo"]).ToLower(); if (!sProc.StartsWith("mylowercaseappname")) oSession["ui-hide"] = "NotMyApp"; } */ // // 与えられたセッションでレスポンスストリーミングが有効になっている場合、 OnBeforeResponse 関数は実際にはレスポンスがクライアントに返された後に呼び出されます。 // は、実際にはレスポンスがクライアントに返された後に呼ばれる。 // // これに対して、この OnPeekAtResponseHeaders 関数はレスポンスヘッダがクライアントに送信される前 (そしてボディがクライアントから読み込まれる前) に呼び出される。 // レスポンスヘッダがクライアントに送信される前に (そしてボディがサーバから読み込まれる前に) 呼び出されます。 したがって、これは絶好の機会である // レスポンスヘッダに何かあれば、ストリーミングを無効にする // (oSession.bBufferResponse = true)。 // レスポンスボディを改竄する必要があることを示唆するものがある場合、 ストリーミングを無効にする // (oSession.bBufferResponse = true) // 絶好の機会です。 // // 注意: oSession.responseBodyBytes はこの関数内では使用できません! // static function OnPeekAtResponseHeaders(oSession: Session) { //FiddlerApplication.Log.LogFormat("Session {0}: Response header peek shows status is {1}", oSession.id, oSession.responseCode); if (m_DisableCaching) { oSession.oResponse.headers.Remove("Expires"); oSession.oResponse["Cache-Control"] = "no-cache"; } if ((bpStatus>0) && (oSession.responseCode == bpStatus)) { oSession["x-breakresponse"]="status"; oSession.bBufferResponse = true; } if ((null!=bpResponseURI) && oSession.uriContains(bpResponseURI)) { oSession["x-breakresponse"]="uri"; oSession.bBufferResponse = true; } } static function OnBeforeResponse(oSession: Session) { if (m_Hide304s && oSession.responseCode == 304) { oSession["ui-hide"] = "true"; } //Getレスポンスに対してなにかモニタリングしたいときはここに記述 //例 //if (oSession.oResponse.headers.ExistsAndContains("Content-Type", "audio/mpeg")) { // //LOG出力 // FiddlerApplication.Log.LogString("★★★ m4a アドレスが見つかりました! ★★★"); // FiddlerApplication.Log.LogString("https://" + oSession.url); // FiddlerApplication.Log.LogString("★★★★★★★★★★★★★★★★★★★★★★★★★★"); //} /* //getレスポンスを奪ってクライアントに渡る前に書き換えたい時はこのような感じにする if (oSession.url.IndexOf("/public/index.php?action=assault_boss_atack")!=-1) { if (oSession.oResponse.headers.ExistsAndContains("Content-Type", "application/json")) { try{ var oBody = oSession.GetResponseBodyAsString(); // Remove any compression or chunking oSession.utilDecodeResponse(); var oBody = System.Text.Encoding.UTF8.GetString(oSession.responseBodyBytes); var j = Fiddler.WebFormats.JSON.JsonDecode(oBody); oBody=Fiddler.WebFormats.JSON.JsonEncode(j.JSONObject); var jTemp=null; try{ var jTemp=j.JSONObject["info"]["bossList"]["boss"]["boss10392"]; } catch(e) { } jTemp["level"]=1; //ボスのレベルを1にする //jTemp["hp"]=int(jTemp["hp"]/2); //ボスのHPを半分にへらす jTemp["hp"]=1; //ボスのHPを1にする //LOG出力 FiddlerApplication.Log.LogString(oSession.url); //JSONエンコード oBody=Fiddler.WebFormats.JSON.JsonEncode(j.JSONObject) //レスポンスを書き換える oSession.utilSetResponseBody(oBody); } catch(e){ } } } */ } /* // この関数は、Fiddler Classic が自ら生成したエラー(例えば「DNS Lookup failure」)をクライアントアプリケーションに返す直前に実行される。 // (例: "DNS Lookup failure") をクライアントアプリケーションに返す直前に実行されます。 // これらのレスポンスは、上記の OnBeforeResponse 関数を経由しない。 static function OnReturningError(oSession: Session) { } */ /* // この関数は、Fiddler Classic がセッションの処理を終了した後に実行されます。 // 成功したか失敗したかに関係なく実行されます。この関数は通常、Web Sessions UI listitem の最後の更新の後に実行されることに注意してください。 // このため、セッションのUIを変更する場合は、手動でリフレッシュする必要があります。 // UIを変更する場合は、手動でセッションのUIを更新する必要があります。 static function OnDone(oSession: Session) { } */ /* static function OnBoot() { MessageBox.Show("Fiddler Classicの起動が終了しました。"); System.Diagnostics.Process.Start("iexplore.exe"); UI.ActivateRequestInspector("HEADERS"); UI.ActivateResponseInspector("HEADERS"); } */ /* static function OnBeforeShutdown(): Boolean { // シャットダウンをキャンセルする場合はfalseを返す。 return ((0 == FiddlerApplication.UI.lvSessions.TotalItemCount()) || (DialogResult.Yes == MessageBox.Show("Fiddler Classicの終了を許可しますか?", "バイバイ?", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2))); } */ /* static function OnShutdown() { MessageBox.Show("Fiddler Classicがシャットダウンされました"); } */ /* static function OnAttach() { MessageBox.Show("Fiddler Classic がシステムプロキシになりました"); } */ /* static function OnDetach() { MessageBox.Show("Fiddler Classic はシステムプロキシではなくなりました。"); } */ // The Main() 関数は、FiddlerScript がコンパイルされるたびに実行されます。 static function Main() { var today: Date = new Date(); FiddlerObject.StatusText = " CustomRules.js was loaded at: " + today; // 応答の "Server" ヘッダーがある場合、それを含む "Server" カラムを追加するためにアンコメントします。 // UI.lvSessions.AddBoundColumn("Server", 50, "@response.server"); // 以下のExecActionメソッドを呼び出すグローバルホットキー(Win+G)を追加するためにコメントを外す... // UI.RegisterCustomHotkey(HotkeyModifiers.Windows, Keys.G, "screenshot"); } // これらの静的変数は、単純なブレークポイントやその他のQuickExecのルールに使用されます。 BindPref("fiddlerscript.ephemeral.bpRequestURI") public static var bpRequestURI:String = null; BindPref("fiddlerscript.ephemeral.bpResponseURI") public static var bpResponseURI:String = null; BindPref("fiddlerscript.ephemeral.bpMethod") public static var bpMethod: String = null; static var bpStatus:int = -1; static var uiBoldURI: String = null; static var gs_ReplaceToken: String = null; static var gs_ReplaceTokenWith: String = null; static var gs_OverridenHost: String = null; static var gs_OverrideHostWith: String = null; // OnExecAction関数は、Fiddler ClassicウィンドウのQuickExecボックスのいずれかによって呼び出されます。 // またはExecAction.exeコマンドライン・ユーティリティによって呼び出されます。 static function OnExecAction(sParams: String[]): Boolean { FiddlerObject.StatusText = "ExecAction: " + sParams[0]; var sAction = sParams[0].toLowerCase(); switch (sAction) { case "bold": if (sParams.Length<2) {uiBoldURI=null; FiddlerObject.StatusText="Bolding cleared"; return false;} uiBoldURI = sParams[1]; FiddlerObject.StatusText="Bolding requests for " + uiBoldURI; return true; case "bp": FiddlerObject.alert("bpu = breakpoint request for uri\nbpm = breakpoint request method\nbps=breakpoint response status\nbpafter = breakpoint response for URI"); return true; case "bps": if (sParams.Length<2) {bpStatus=-1; FiddlerObject.StatusText="Response Status breakpoint cleared"; return false;} bpStatus = parseInt(sParams[1]); FiddlerObject.StatusText="Response status breakpoint for " + sParams[1]; return true; case "bpv": case "bpm": if (sParams.Length<2) {bpMethod=null; FiddlerObject.StatusText="Request Method breakpoint cleared"; return false;} bpMethod = sParams[1].toUpperCase(); FiddlerObject.StatusText="Request Method breakpoint for " + bpMethod; return true; case "bpu": if (sParams.Length<2) {bpRequestURI=null; FiddlerObject.StatusText="RequestURI breakpoint cleared"; return false;} bpRequestURI = sParams[1]; FiddlerObject.StatusText="RequestURI breakpoint for "+sParams[1]; return true; case "bpa": case "bpafter": if (sParams.Length<2) {bpResponseURI=null; FiddlerObject.StatusText="ResponseURI breakpoint cleared"; return false;} bpResponseURI = sParams[1]; FiddlerObject.StatusText="ResponseURI breakpoint for "+sParams[1]; return true; case "overridehost": if (sParams.Length<3) {gs_OverridenHost=null; FiddlerObject.StatusText="Host Override cleared"; return false;} gs_OverridenHost = sParams[1].toLowerCase(); gs_OverrideHostWith = sParams[2]; FiddlerObject.StatusText="Connecting to [" + gs_OverrideHostWith + "] for requests to [" + gs_OverridenHost + "]"; return true; case "urlreplace": if (sParams.Length<3) {gs_ReplaceToken=null; FiddlerObject.StatusText="URL Replacement cleared"; return false;} gs_ReplaceToken = sParams[1]; gs_ReplaceTokenWith = sParams[2].Replace(" ", "%20"); // Simple helper FiddlerObject.StatusText="Replacing [" + gs_ReplaceToken + "] in URIs with [" + gs_ReplaceTokenWith + "]"; return true; case "allbut": case "keeponly": if (sParams.Length<2) { FiddlerObject.StatusText="Please specify Content-Type to retain during wipe."; return false;} UI.actSelectSessionsWithResponseHeaderValue("Content-Type", sParams[1]); UI.actRemoveUnselectedSessions(); UI.lvSessions.SelectedItems.Clear(); FiddlerObject.StatusText="Removed all but Content-Type: " + sParams[1]; return true; case "stop": UI.actDetachProxy(); return true; case "start": UI.actAttachProxy(); return true; case "cls": case "clear": UI.actRemoveAllSessions(); return true; case "g": case "go": UI.actResumeAllSessions(); return true; case "goto": if (sParams.Length != 2) return false; Utilities.LaunchHyperlink("http://www.google.com/search?hl=en&btnI=I%27m+Feeling+Lucky&q=" + Utilities.UrlEncode(sParams[1])); return true; case "help": Utilities.LaunchHyperlink("http://fiddler2.com/r/?quickexec"); return true; case "hide": UI.actMinimizeToTray(); return true; case "log": FiddlerApplication.Log.LogString((sParams.Length<2) ? "User couldn't think of anything to say..." : sParams[1]); return true; case "nuke": UI.actClearWinINETCache(); UI.actClearWinINETCookies(); return true; case "screenshot": UI.actCaptureScreenshot(false); return true; case "show": UI.actRestoreWindow(); return true; case "tail": if (sParams.Length<2) { FiddlerObject.StatusText="Please specify # of sessions to trim the session list to."; return false;} UI.TrimSessionList(int.Parse(sParams[1])); return true; case "quit": UI.actExit(); return true; case "dump": UI.actSelectAll(); UI.actSaveSessionsToZip(CONFIG.GetPath("Captures") + "dump.saz"); UI.actRemoveAllSessions(); FiddlerObject.StatusText = "Dumped all sessions to " + CONFIG.GetPath("Captures") + "dump.saz"; return true; default: if (sAction.StartsWith("http") || sAction.StartsWith("www.")) { System.Diagnostics.Process.Start(sParams[0]); return true; } else { FiddlerObject.StatusText = "Requested ExecAction: '" + sAction + "' not found. Type HELP to learn more."; return false; } } } }