看到
查找钩子与其他操作相比,枚举已安装的钩子非常容易.
特定于线程的钩子记录在一个win32k每线程数据结构中,而不是富有想象力地标记为THREADINFO 1.这本质上是一个类似ETHREAD/TEB的结构,但是专门为用户和gdi信息量身定制.它的一个成员(aphkStart)是一个16元素的指针数组,它们分别指向NULL,或者是HOOK结构链表的头部.枚举钩子只是沿着这些链条走下去的一种方法.
为方便起见,可能因此不需要迭代来查看是否设置了任何挂钩,THREADINFO包含另一个成员fsHooks,它是一个位域.如果某个位打开,则挂钩数组中的相应索引有效.而不是33个比较(16个为NULL,17个为for循环),告诉是否有钩子只需要一个,漂亮!
每个桌面2的全局钩子也存储在每个对象结构中,也称为(DESKTOPINFO),并且还存储在具有伴随位域的阵列中.弥合这两者的是pDeskInfo,它是THREADINFO的成员,指向其拥有的DESKTOPINFO.
尽管在介绍中有所体现,但在实践中使用所有这些未记录的结构实际上并不太难.win32k.sys的Windows 7符号包括它们的布局,这很不错.Vista/Server 2008时代的符号并不是这样,这是学习集会的地方,可以节省一天的时间.
了解这些结构的外观是一回事,了解它们是另一回事......
我们得到了他们的肮脏手套,我们发现HOOK结构自己记录了大部分相关信息:
struct tagHOOK
{
THRDESKHEAD head; // info about the creator
struct tagHOOK* phkNext; // next entry in linked list
int iHook; // WH_ hook type
UINT_PTR offPfn; // RVA to hook function in ihmod library
UINT flags; // HF_ flags (GLOBAL, ANSI)
int ihmod;
THREADINFO* ptiHooked; // the hooked thread
PVOID rpDesk; // saved desktop pointer
ULONG nTimeout :7;
ULONG fLastHookHung :1;
};
Run Code Online (Sandbox Code Playgroud)
检测已安装的全局挂钩的概述如下:
- 调用PsGetCurrentThread并获取当前线程的ETHREAD结构.根据MSDN文档,ETHREAD是一种不透明的数据结构.
- 通过调用PsGetThreadWin32Thread来提取THREADINFO结构.它们都没有记录.
- 提取DESKTOPINFO.
- 在那里你可以找到所有全局安装的钩子.它们按阵列组织.每个元素都是一个链表,对应一个特定的钩子(WH_*).
检测已安装的本地挂钩的概述如下:
- 给定一个线程ID.
- 调用PsLookupThreadByThreadId并获取指定线程的ETHREAD结构.
- 通过调用PsGetThreadWin32Thread来提取THREADINFO结构.
- 在那里,您可以找到指定线程的所有本地安装的挂钩.它们按阵列组织.每个元素都是一个链表,对应一个特定的钩子(WH_*).
Process Hacker 2插件(http://processhacker.sourceforge.net)显示系统挂钩并能够取消挂钩(右键菜单).
抓取Process Hacker源并编译它,然后将HookTools.vcxproj添加到Plugins.sln.使用VS 2013.在VC++目录中设置库路径.
或相关问题及答案
但我还没有找到一种可靠的方法来做到这一点.
| 归档时间: |
|
| 查看次数: |
6972 次 |
| 最近记录: |