browser icon
You are using an insecure version of your web browser. Please update your browser!
Using an outdated browser makes your computer unsafe. For a safer, faster, more enjoyable user experience, please update your browser today or try a newer browser.

调用 IE 浏览器的开发者工具

Posted by on 2013 年 11 月 22 日

你可以任意转载本文,但请在转载后的文章中注明作者和原始链接。
媒体约稿请联系 titilima_AT_163.com(把“_AT_”换成“@”)。

今天来点干货:研究 IE 开发者工具的调用。如果你只是想知道怎么调用的话,可以直接查看我的开源项目 SuperF12。下面的内容是我整个的分析过程,所谓授之以鱼莫若授之以渔,我这里提供的是一种解决问题的思路和方法。

首先,用 IE 把开发者工具显示出来。然后用 Spy++ 看该窗口的信息:

需要关注的地方已经被我高亮出来了。接下来,使用 Process Explorer 来查看窗口过程的所在位置。

是时候启动调试器了。打开 WinDbg,Attach 一个新的 IE 子进程,并监控 iedvtool.dll 的加载:

sxe ld iedvtool.dll

接着在 IE 中打开开发者工具,调试器中断下来。查看其堆栈:

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
ChildEBP RetAddr
02fda46c 77465c34 ntdll!KiFastSystemCallRet
02fda470 7748060d ntdll!NtMapViewOfSection+0xc
02fda4c4 774806ea ntdll!LdrpMapViewOfSection+0xc7
02fda55c 7747fb51 ntdll!LdrpFindOrMapDll+0x303
02fda6dc 774822b2 ntdll!LdrpLoadDll+0x2b2
02fda710 757a8b51 ntdll!LdrLoadDll+0x92
02fda74c 76079d43 KERNELBASE!LoadLibraryExW+0x1d3
02fda768 76079cc7 ole32!LoadLibraryWithLogging+0x16
02fda78c 76079bb6 ole32!CClassCache::CDllPathEntry::LoadDll+0xa9
02fda7bc 760790be ole32!CClassCache::CDllPathEntry::Create_rl+0x37
02fdaa08 76078f93 ole32!CClassCache::CClassEntry::CreateDllClassEntry_rl+0xd4
02fdaa50 76078e99 ole32!CClassCache::GetClassObjectActivator+0x224
02fdaa88 76078c57 ole32!CClassCache::GetClassObject+0x30
02fdab04 76093170 ole32!CServerContextActivator::CreateInstance+0x110
02fdab44 76078dca ole32!ActivationPropertiesIn::DelegateCreateInstance+0x108
02fdab98 76078d3f ole32!CApartmentActivator::CreateInstance+0x112
02fdabb8 76078ac2 ole32!CProcessActivator::CCICallback+0x6d
02fdabd8 76078a73 ole32!CProcessActivator::AttemptActivation+0x2c
02fdac14 76078e2d ole32!CProcessActivator::ActivateByContext+0x4f
02fdac3c 76093170 ole32!CProcessActivator::CreateInstance+0x49
02fdac7c 76092ef4 ole32!ActivationPropertiesIn::DelegateCreateInstance+0x108
02fdaedc 76093170 ole32!CClientContextActivator::CreateInstance+0xb0
02fdaf1c 76093098 ole32!ActivationPropertiesIn::DelegateCreateInstance+0x108
02fdb6f4 76099e25 ole32!ICoCreateInstanceEx+0x404
02fdb754 76099d86 ole32!CComActivator::DoCreateInstance+0xd9
02fdb778 76099d3f ole32!CoCreateInstanceEx+0x38
02fdb7a8 6bebe0d5 ole32!CoCreateInstance+0x37

运行至 CoCreateInstance 即将退出的代码行,查看各个参数:

1
2
3
0:005> dd ebp
02fdb7a8  02fdb7cc 6bebe0d5 6bf07ebc 00000000
02fdb7b8  00000001 6bfad788 0069e488 6bf07ecc

能得到开发者工具的 CLSID 和 IID:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
0:005> dt _GUID 6bf07ebc
ntdll!_GUID
{1a6fe369-f28c-4ad9-a3e6-2bcb50807cf1}
   +0x000 Data1            : 0x1a6fe369
   +0x004 Data2            : 0xf28c
   +0x006 Data3            : 0x4ad9
   +0x008 Data4            : [8]  "???"
0:005> dt _GUID 6bfad788
ntdll!_GUID
{059055df-6bb0-402a-ba48-58bfa343719c}
   +0x000 Data1            : 0x59055df
   +0x004 Data2            : 0x6bb0
   +0x006 Data3            : 0x402a
   +0x008 Data4            : [8]  "???"

然后用 IDA 拆开 iedvtool.dll,可以得到开发者工具接口的虚表:

最后将其整理成易懂的格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class IIEDevToolsExplorerBar : public IUnknown
{
public:
    STDMETHOD(SetDevToolSite)(IEDevToolsSite *site) PURE;
    STDMETHOD(ShowDevTools)(BOOL b) PURE;
    STDMETHOD(JITShowDevTools)(int) PURE;
    STDMETHOD(CloseDevTools)(void) PURE;
    STDMETHOD(IsVisible)(BOOL *) PURE;
    STDMETHOD(GetPinState)(BOOL *) PURE;
    STDMETHOD(SetPinState)(BOOL bPin) PURE;
    STDMETHOD(IsMinimized)(BOOL *) PURE;
    STDMETHOD(DevToolsReady)(void) PURE;
};
static const CLSID CLSID_IEDTExplorerBar = {
    0x1a6fe369, 0xf28c, 0x4ad9, { 0xa3, 0xe6, 0x2b, 0xcb, 0x50, 0x80, 0x7c, 0xf1 }
};
static const IID IID_IEDTExplorerBar = {
    0x059055df, 0x6bb0, 0x402a, { 0xba, 0x48, 0x58, 0xbf, 0xa3, 0x43, 0x71, 0x9c }
};

末了补充一点。IE11 之中引入了新的开发者工具组件 F12Tools.dll,这个组件和 IE 的耦合度非常大,我至今未能找出如何成功调用它的方法。若已有看官知其奥秘还请不吝赐教,拜谢。

订阅本站

10 Comments

  • […] 最近在网上看到一大牛blog(http://blog.titilima.com/launch-f12-tools.html),讨论的是在内嵌的IE窗口中,打开开发人员工具。文章写的很好,而且还提供了开源的工具,实在是业界良心。于是我臭不要脸的A了部分关键代码,弄了个命令行版工具。有兴趣的强烈推荐阅读上面的blog,以及其提供的开源工具的代码。 […]

    • […] 不过作者提供了分析过程以及解决问题的思路和方法,有兴趣的开发者强烈推荐阅读这篇博文。 […]

      • At 2014.03.30 01:12, HYX said:

        真高兴有人和我有一样的兴趣。之前也试图研究研究,无奈COM的虚表很难啊。能稍微解释一下怎么用IDA得到这个的吗?有人说老版本的ida 4.3有com_plugin?

        • At 2014.03.30 10:00, 李马 said:

          从函数列表中找到某个看起来像的函数,然后在反汇编视图的函数名上按 x 查找引用,就会发现虚表了。

          • At 2014.03.30 11:37, HYX said:

            老手风范。曾经也找到过。但是这些函数分析出调用方式是怎么做的呢?看截图是有什么辅助吗?

            • At 2014.03.30 13:53, 李马 said:

              第一,微软的函数命名使你很容易就能猜到它的功能甚至使用方法;第二,下断点,看传入的参数。

              • At 2014.03.30 14:52, HYX said:

                好吧,个人经验+实干。看你做的好整齐!

                • At 2014.03.31 00:18, HYX said:

                  IDA 5.5 升了 6.1,加载 pdb 成功,看到了~

      • At 2015.09.17 12:08, pxhero said:

        请教一下楼主,另外一个进程(包好IE控件窗口的进程)是通过什么方式加载SuperF12.dll的呢?本人对COM刚开始学,还不怎么了解COM,望赐教,谢谢~

        • At 2015.10.21 17:32, 李马 said:

          SuperF12 的加载跟 COM 无关,它利用窗口钩子进了目标进程。

        (Required)
        (Required, will not be published)