Простой способ подключить доступ к реестру для конкретного процесса - PullRequest
4 голосов
/ 03 декабря 2010

Есть ли простой способ перехватить доступ к реестру процесса, который выполняет мой код?Я знаю о SetWindowsHookEx и друзьях, но это слишком сложно ... У меня все еще есть надежда, что есть такой простой способ как LD_PRELOAD на Unix ...

Ответы [ 3 ]

2 голосов
/ 17 июня 2011

Читайте о теории 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 hooked!» - тогда он выполняет функцию GetTickCount:это было предназначено.

Извините за то, что так разбросаны информацией, но я надеюсь, что это поможет. :) - Я понимаю, что это старый вопрос.-

0 голосов
/ 17 июня 2011

Большинство вызовов winapi генерируют записи в таблице символов для межмодульных вызовов, это позволяет довольно просто их перехватывать, все что вам нужно сделать, это перезаписать адреса IAT.Используя что-то, такое как MSDetours, это можно сделать безопасно в несколько строк кода.MSDetours также предоставляет инструменты для вставки пользовательских dll в целевой процесс, чтобы вы могли выполнять перехват

0 голосов
/ 08 января 2011

SetWindowsHookEx совсем не поможет - он предоставляет разные функциональные возможности.

Проверьте, помогает ли https://web.archive.org/web/20080212040635/http://www.codeproject.com/KB/system/RegMon.aspx. SysInternals 'RegMon использует драйвер режима ядра, который является очень сложным способом.

Обновление: наша компания предлагает продукт CallbackRegistry, который позволяет без проблем отслеживать операции с реестром. И кстати, мы предлагаем бесплатные некоммерческие лицензии по запросу (при условии одобрения в каждом конкретном случае).

...