我们将钩取IE使其试图连接到指定网站时转到连接到我的博客、
练习目标是钩取IE进程的API,在它连接到特定网站的过程中,将其连接到其他网站。无论是在IE地址栏中直接输入地址还是点击某个链接,IE都无法连接到被阻止的网站(将其当做拦截恶意网页功能较为容易理解)。
目标API
开始前先大致“猜测”一下,只要钩取套接字库(ws2_32.dll)或微软提供的网络访问相关库(wininet.dll、winhttp.dll)就可以了(钩取后者更容易)。
下面运行IE进行分析。首先使用Process Explorer查看IE加载了哪些DLL。从图中可知,IE不仅加载了ws2_32.dll,还加载了wininet.dll库。Wininet.dll提供的API,顾名思义,该API用来连接某个网站。
接下来验证Wininet.InternetConnect() API是否就是要钩取的API。
IE进程结构
运行IE浏览器,打开多个选项卡(tab),分别连接到不同网站。
使用Process Explorer查看IE进程结构。
![S]L71`CNAX(6YWYMUWWSIL.png
从图中可知,IE中有7个选项卡,共有5个IE进程(iexplore.exe)在运行。并且PID为3784的ieplore.exe进程与其他iexplore.exe进程形成了父子关系。从IE进程结构来看,IE应用程序为父进程(PID:3784),它管理着各选项卡对应的子进程。
像这样,IE应用程序中每个选项卡对应的子iexplore.exe进程实际负载网络连接,创建选项卡进程时,(相关进程的)API就会被执行钩取操作,即采用全局API钩取技术钩取。否则,在新选项卡中连接网站时将无法钩取。本章采用一种更加安全方便的全局API钩取方法,钩取ntdll!ZwResumeThread() API,创建进程之后,主线程被Resume(恢复运行)时,可以钩取目标API。
关于全局API钩取的概念
常规API钩取
使用常规API钩取方法时,每当(要钩取的)目标进程被创建时,都要钩取指定API。图中描述了通过DLL注入技术实施常规API钩取操作的情形。
图中要钩取的目标进程为Test.exe(PID:2492)。使用InjDll.exe程序将Hook.dll注入Test.exe进程,然后钩取指定API。若后面生成了另外一个Test.exe进程(PID:37%),则必须先向它注入Hook.dll后才能实现正常的API钩取操作。也就是说,每当要钩取的目标进程生成时都要手动钩取API。
全局API钩取
全局API钩取操作的过程。
InjDll.exe负责将gHook.dll注入Explorer.exe进程(Windows操作系统的基本shell)。注意,要钩取的进程不是Test.exe,而是启动运行Test.exe的Explorer.exe进程