2010-02-07 47 views
3

我想拦截dll的加载,所以我可以使用它们。我的第一个想法是钩住GetProcAddress。令人惊讶的是,通过挂钩它,我只能拦截在拥有我的图书馆的过程中所做的调用。 (我打开的调用GetProcAddress其他可执行文件和这些电话没有得到拦截)(我猜是因为它是动态反对我的lib编译)输出的挂接windows API函数来拦截dll加载(仅限Windows)

例子:

C:\ WINDOWS \ SysWow64资料\ kernel32.dll中 Module32NextW

C:\ WINDOWS \ SysWow64资料\ kernel32.dll中 CreateToolHelp32Snapshot函数

C:\ WINDOWS \ SYSTEM32 \ DINPUT.dll DirectInputCreateW

C:\ WINDOWS \ Syswow64资料\ ntdll.dll中 由DirectDrawCreate

不管怎么说,我想知道的是,我应该开始能够拦截的DLL加载这样我就可以再使用其功能。

基本上,我想能够调用任何DLL加载GetModuleInformation。

+0

重复的http://stackoverflow.com/questions/873658/how-can-i-hook-windows-functions-in-c-c和许多更类似的问题。 – mghie 2010-02-08 07:43:16

+3

我不知道我是否应该打电话给你的名字或忽略你。我不想知道如何挂钩功能。我想知道我应该挂钩哪些函数来拦截Dll的加载。 – user246100 2010-02-08 08:33:15

回答

3

首先,你在做什么,需要一个全局钩子?

如果你想成为通知一个DLL已经在任何进程中加载​​,你可以看看PsSetImageLoadNotifyRoutine,这是一个内核模式例程。 尽管它是内核模式,但使用起来并不困难,编写基本驱动程序非常有趣。

另一种方法是在每个过程中强制加载库。有各种方法,其中一个更合法的将是Windows Message hooks

+1

你好。我刚刚看到你的答案,对此表示遗憾。这意味着被用来拦截游戏的加载,然后修改它的工作。像秘籍一样。我看到了使用永久循环检测它的代码,并查找是否在其中创建了一个进程(按名称)。我正在寻找一个更干净的方式来做到这一点,你对一个基本的Windows驱动程序的建议看起来不错。谢谢! – user246100 2011-07-08 08:46:56

0

在LoadLibrary函数上安装系统范围的钩子。 (我不知道如何使用这个问题下的小评论的东西)

+0

问题是:如何使其成为“全系统”。 – user246100 2011-07-08 09:13:58

+0

由于写入时复制功能,您在进程上设置的任何钩子都不会被复制。要全局挂钩代码,您需要在全局中插入自己的代码。 – 2011-07-08 11:35:31