fiddler note

一晚上终于找到对的东西,作者很专业,这里作为笔记,想学习好东西还是到作者那里^_^

-----------------------------------------------------------

背景

发现使用Fiddler进行抓包时有一部分请求总是没抓到,查看了一下源代码,发现使用WinINET这套API发送的请求都能正常抓到,而使用WinHTTP这套API发送的请求都没有抓到,遂搜索了一下,果然前人们早已给出答案,解决方案原文可以参看Fiddler作者Eric Lawrence大神的一篇博客Using Fiddler with WinHTTP,博客里表示Fiddler对各种HTTP(s) stacks都是能支持的,只是默认启动时只是接管了WinINET代理设置。

Eric的那篇博客里已经列出了相关的方法和代码,本文只是对其略做改进,让同一段代码可以适配不同的Windows版本。

分析

我们需要让Fiddler抓取WinHTTP的包时,要做的就是让WinHTTP的代理设置改为与WinINET一致,因为WinINET在Fiddler启动后使用Fiddler作为代理。这些通过Windows自带命令就可以做到:

  • 在XP下:
    proxycfg -u

  • 在Win7下(使用管理员权限的命令行):
    netsh winhttp import proxy ie
    注:在Win7 64位系统下需要将System32目录和SysWOW64目录下的netsh命令各执行一次,下方将给出的脚本已覆盖这种情况。

但是如果使用频繁,每次都还要去手动敲命令行还是挺痛苦的,作为能偷懒的地方绝不多放过的少年,一劳永逸的方法当然是让它随Fiddler的启动与关闭自动执行这些命令(当然这就是Eric的博客里讲述的方法)。

实现

这可以通过修改CustomRules.js实现(如果想对Fiddler的扩展机制进行深入了解可以去参阅Fiddler官网的文档)。

操作方法:
打开Fiddler > 点击菜单Rules > 点击Customize Rules...

然后就打开了CustomRules.js文件,寻找到OnAttachOnDetach函数,可以将Fiddler启动后与关闭前需要定制的一些自动动作分别填写在它们里头,我们为实现让Fiddler能抓取WinHTTP发送的请求的目的而修改后的代码如下,添加了UpdateWinHTTPSettings函数,在OnAttachOnDetach里添加了对它的调用,修改完后保存即可生效。

static function OnAttach() {
    UpdateWinHTTPSettings();
}
static function OnDetach() {
    UpdateWinHTTPSettings();
}
static function UpdateWinHTTPSettings() {
    var oPSI: System.Diagnostics.ProcessStartInfo 
        = new System.Diagnostics.ProcessStartInfo();
    var os : OperatingSystem = Environment.OSVersion;
    if (os.Version.Major >= 6) {
        oPSI.UseShellExecute = true;
        oPSI.FileName = "netsh.exe";
        oPSI.Verb = "runas";
        oPSI.Arguments = "winhttp import proxy ie";
        System.Diagnostics.Process.Start(oPSI);
        // Re-run 32bit version
        oPSI.FileName = oPSI.FileName = 
            Environment.SystemDirectory.Replace("system32", "syswow64") 
            + "\\netsh.exe";    
        if (System.IO.File.Exists(oPSI.FileName)) {
            System.Diagnostics.Process.Start(oPSI);
        }
    }
    else {
        oPSI.UseShellExecute = true;
        oPSI.FileName = "proxycfg.exe";
        oPSI.Verb = "open";
        oPSI.Arguments = "-u";
        System.Diagnostics.Process.Start(oPSI);
    }
}

UpdateWinHTTPSettings函数里做的事情其实很简单,就是使用管理员权限执行文章前面说到的命令。

附注

我使用的完整最新的CustomRules.js文件我上传到了一个Gist里,详见:https://gist.github.com/mzlogin/3c5f9781c5bedff3fcfb,如果想直接使用可以复制脚本内容后放置到“我的文档/Fiddler 2/Scripts/CustomRules.js”,也可以在此目录下使用git抓取我的最新定制js文件。

posted @ 2015-03-26 00:07  voh99800  阅读(314)  评论(0编辑  收藏  举报