-
-
[原创]IE控件使用F12开发者工具
-
发表于:
2020-8-24 11:20
6373
-
本文首发于我的个人博客
IE11带来了非常完善的开发者工具,但是IE控件默认是没法使用的,这给我们页面调试带来了极大的不便,不过好在Win10系统有了IEChooser
工具,也勉强能用。无意中发现360安全浏览器可以使用F12开发者工具,所以抽空研究了一下。本文仅针对Win10下的IE11浏览器,对于Win7及以下系统,可以使用一个叫做SuperF12的项目。
此次研究使用了x64dbg
调试器(配合DbgChild插件)用于动态调试,IDA
用于静态反汇编,Process Hacker
用于进程信息查看,360安全浏览器12.2.1362.0版本。
通过Process Hacker
可以发现,在360安全浏览器的IE内核中,按下F12
键,会创建一个新的子进程,并且命令行参数带有-windows10-f12=
的字样,在IDA
中按下Alt-T
以windows10-f12
为关键字进行搜索,一共能找到两处,都是在函数sub_40101F
中调用的,其FA
为#41f
,该函数比较长,下面贴出核心代码:
前面是参数解析部分,直接跳过不细究了,从函数sub_443D30
调用的地方开始看,v174
是_int64
类型,所以(signed int *)&v174 + 1
与HIDWORD
表示的意思一样,结合这两行,我们可以猜到,函数sub_443D30
是获取窗口句柄,拿到之后赋值给v39
,到这里,v39
和HIDWORD(v174)
一样,都是存储着目标窗口句柄。接下来是两个if
语句,其中sub_458950
可能是拿到本身的主版本号,这个没有细看,在实际调试中发现,两个if
都会进入。然后,通过GetWindowThreadProcessId
拿到目标窗口所在进程的PID,存储在dwProcessId[1]
中。sub_4B89C0
是memset
,将缓冲区置零,sub_402DBE
是sprintf
函数,通过动态调试发现,sub_402DBE
相当于sprintf(&Filename[2], "%d %x", dwProcessId[1], HIDWORD(v174))
,这句是在构造命令行参数,构造完之后Filename[2]
的值就类似于"123 456"
,这里要注意的是,其中的456
是十六进制的。LibFilename
是c:\Windows\SysWOW64\F12\F12AppFrame.dll
,后面的逻辑就很清晰了,加载dll,然后调用对应的函数,需要用到前面sub_402DBE
拿到的命令行参数,这里有一点要修改的是,AttachTools
函数的签名为void(__stdcall*)(HWND, HINSTANCE, char*, int)
,不知道360中为何使用了__cdecl
调用。
到这里,我们就分析完了启动参数带了-windows10-f12
后,360安全浏览器的处理逻辑,很容易可以在我们自己的项目中加入下面的代码
但是此刻还无法启动开发者工具,我们还需要继续分析AttachTools
函数
代码依旧很长,不过没关系,我们只需要从CommandLineToArgvW
开始阅读即可,lpCmdLine
是我们上面传递的第三个参数,即"123 456"
,所以pNumArgs
值为2,这里很明显看到__o__wtoi
和_wcstol
,也解释了参数中前一个值为十进制,后一个为十六进制的原因(微软任性),然后是一个CoInitializeEx(NULL, 2u);
的调用,2u
即COINIT_APARTMENTTHREADED
,v18
保存了返回值,可以看到,只有当v18
为0(S_OK
)时,才会进入后面的处理逻辑,否则直接报错了,所以我们需要确保当前进程没有初始化COM组件,最好的办法就是创建一个新进程
可以看到,新进程逻辑很简单,首先检测命令行中有没有-windows10-f12
参数,有的话就调用AttachTools
,没有的话则直接退出。-windows10-f12
的值为IE窗口的句柄,是底层类名为Internet Explorer_Server
的那个窗口句柄,这里使用了std::reverse
进行字符串反转,因为360安全浏览器这样玩的,所以也算是致敬吧。
最后,就是主进程的F12
响应,然后获取窗口句柄,当作参数传递给新进程,代码比较简单不贴了,记得一点就是,窗口句柄转换为字符串之后记得反转。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)