是否有一种简单的方法来挂钩我的代码执行的进程的注册表访问?我知道SetWindowsHookEx
和朋友,但它太复杂了......我仍然希望LD_PRELOAD
上有一个像Unix
这样简单的方法......
答案 0 :(得分:2)
在这里阅读DLL注入理论:http://en.wikipedia.org/wiki/DLL_injection
但是,我将在此处为您提供DLL注入代码段:http://www.dreamincode.net/code/snippet407.htm
一旦你在外部应用程序的内存中做这些类型的事情很容易,在注入时,你可能也是这个过程的一部分。
有一种叫做绕行的东西,我相信你正在寻找它,它只是挂钩一个函数,当这个过程调用它时,它会执行你自己的函数。 (为确保它不会崩溃,请在函数末尾调用函数)
因此,如果您想在CreateRegKeyEx上编写自己的函数
(http://msdn.microsoft.com/en-us/library/ms724844%28v=vs.85%29.aspx)
它可能看起来像这样:
LONG WINAPI myRegCreateKeyEx(HKEY hKey, LPCTSTR lpSubKey, DWORD Reserved, LPTSTR lpClass, DWORD dwOptions, REGSAM samDesired, LPSECURITY_ATTRIBUTES lpSecurityAttributes, PHKEY phkResult, LPDWORD lpdwDisposition)
{
//check for suspicious keys being made via the parameters
RegCreateKeyEx(hKey, lpSubKey, Reserved, lpClass, dwOptions, samDesired, lpSecurityAttributes, phkResult, lpdwDisposition);
}
你可以在这里找到一个名为DetourXS的写得很好的绕行库:http://www.gamedeception.net/threads/10649-DetourXS
以下是他如何使用它建立绕行的示例代码:
#include <detourxs.h>
typedef DWORD (WINAPI* tGetTickCount)(void);
tGetTickCount oGetTickCount;
DWORD WINAPI hGetTickCount(void)
{
printf("GetTickCount hooked!");
return oGetTickCount();
}
// To create the detour
oGetTickCount = (tGetTickCount) DetourCreate("kernel32.dll", "GetTickCount", hGetTickCount, DETOUR_TYPE_JMP);
// ...Or an address
oGetTickCount = (tGetTickCount) DetourCreate(0x00000000, hGetTickCount, DETOUR_TYPE_JMP);
// ...You can also specify the detour len
oGetTickCount = (tGetTickCount) DetourCreate(0x00000000, hGetTickCount, DETOUR_TYPE_JMP, 5);
// To remove the detour
DetourRemove(oGetTickCount);
如果你不知道,该片段是挂钩GetTickCount(),每当调用该函数时,他都会写“GetTickCount挂钩!” - 然后他执行GetTickCount函数。它是预期的。
很抱歉信息如此分散,但我希望这会有所帮助。 :) - 我意识到这是一个老问题。 -
答案 1 :(得分:0)
SetWindowsHookEx根本没用 - 它提供了不同的功能。
检查https://web.archive.org/web/20080212040635/http://www.codeproject.com/KB/system/RegMon.aspx是否有帮助。 SysInternals的RegMon使用内核模式驱动程序,这是非常复杂的方式。
更新:我们公司提供CallbackRegistry产品,可让您轻松跟踪注册管理机构的运营情况。 BTW我们根据要求提供免费的非商业许可证(需视具体情况而定)。
答案 2 :(得分:0)
大多数winapi调用为模块间调用生成符号表条目,这使得挂钩它们非常简单,您只需要覆盖IAT地址即可。使用诸如MSDetours之类的东西,它可以在几行代码中安全地完成。 MSDetours还提供了将自定义dll注入目标进程的工具,以便您可以执行挂钩