2012-11-05 57 views
0

有没有办法(编程)检测用户模式挂钩列表?我曾尝试阅读一些有关的文章,但无法完成。任何指针或想法或样本都会有很大的帮助。直到现在我还没有开始编写代码,所以请随时用C或C++来帮助我。 TIA。检测用户模式挂钩

编辑::我想用一种方法来枚举当前正在运行的所有进程,然后再次枚举每个进程使用的所有模块。我真正想尝试的(正如一些专家所解释的),是比较当前加载到内存中的所有模块的枚举列表以及每个进程的磁盘上的模块列表,以检查是否挂钩。有人请说明这一点吗?我不知道我的问题是什么,但如果你有我的困惑,请在这里帮助我。

+0

这里有几个例子。例如,Jay Satiro写了一个可以下载的用户钩子监视器。源代码可以浏览https://github.com/jay/gethooks – Anthill

+0

@ Downvoter-请原因。我研究并发布了这个问题。并不是每个人都对谷歌很幸运。 – Abhineet

+0

这就像试图说服自己,你并不疯狂。如果有人篡改了您的流程,那么也可以篡改您的代码,以检测您是否被篡改。 –

回答

0

有几种方式可以实现usermode挂钩。例如:

  1. 无条件分支指令可以在函数的开始处内联插入。
  2. 修补导入地址表。
  3. 某些机制可用于在输入函数时引发异常(更改页面保护,int 3等),然后使用向量异常处理程序重定向执行。

检测方法因您检测到的用户模式钩子的方法而异。作为一个例子,

  1. 用于检测用户模式钩(在目标函数开始JMP指令)的最常用的方法的经典方法是拆卸功能,并检查第一个指令。
  2. 使用GetProcAddress动态地解析IAT中预期的函数地址,并检查该表是否与预期相符。
  3. 检查页面保护,擅自拆卸等

我不打算提供的挂钩(和检测)的所有可能方法的穷举,而是解释说,没有产生任何单一泛型方法用户模式挂钩列表。

+0

谢谢你。它有帮助。 – Abhineet

+0

如何比较磁盘和内存中的进程模块以识别是否存在挂钩? – Abhineet

0

我建议先找几个其他的东西。

  1. 检查是否有Process Address Space RWX内存块。这不是像内存中的每个函数与磁盘进行比较的强烈操作。
  2. 对于检查IAT挂钩,检查Function Address是否不在外部加载的模块范围内。