挂钩特定进程的注册表访问的简单方法

时间:2010-12-03 19:14:03

标签: windows winapi hook setwindowshookex

是否有一种简单的方法来挂钩我的代码执行的进程的注册表访问?我知道SetWindowsHookEx和朋友,但它太复杂了......我仍然希望LD_PRELOAD上有一个像Unix这样简单的方法......

3 个答案:

答案 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注入目标进程的工具,以便您可以执行挂钩