Как я могу подключить функции Windows в C / C ++?


33 ов принято

Взгляните на Detours , он идеально подходит для такого рода вещей.


Для общесистемной перехвата прочитайте эту статью из MSDN.


Во-первых, создайте DLL, которая обрабатывает функции. В этом примере ниже перечислены функции отправки и приема сокетов.

#include <cstdio>
#include <windows.h>
#include <tlhelp32.h>

void EnableDebugPriv() {
    HANDLE hToken;
    LUID luid;
    TOKEN_PRIVILEGES tkp;

    OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken );

    LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &luid );

    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Luid = luid;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    AdjustTokenPrivileges( hToken, false, &tkp, sizeof( tkp ), NULL, NULL );

    CloseHandle( hToken ); 
}

int main( int, char *[] ) {
    PROCESSENTRY32 entry;
    entry.dwSize = sizeof( PROCESSENTRY32 );

    HANDLE snapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, NULL );

    if ( Process32First( snapshot, &entry ) == TRUE ) {
        while ( Process32Next( snapshot, &entry ) == TRUE ) {
            if ( stricmp( entry.szExeFile, "target.exe" ) == 0 ) {
                EnableDebugPriv();

                char dirPath[MAX_PATH];
                char fullPath[MAX_PATH];

                GetCurrentDirectory( MAX_PATH, dirPath );

                sprintf_s( fullPath, MAX_PATH, "%s\DllToInject.dll", dirPath );

                HANDLE hProcess = OpenProcess( PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, entry.th32ProcessID );
                LPVOID libAddr = (LPVOID)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "LoadLibraryA" );
                LPVOID llParam = (LPVOID)VirtualAllocEx( hProcess, NULL, strlen( fullPath ), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE );

                WriteProcessMemory( hProcess, llParam, fullPath, strlen( fullPath ), NULL );
                CreateRemoteThread( hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)libAddr, llParam, NULL, NULL );
                CloseHandle( hProcess );
            }
        }
    }

    CloseHandle( snapshot );

    return 0;
}

Затем создайте программу для вставки DLL в целевое приложение.

foo.exe

Этого должно быть более чем достаточно, чтобы вы начали!


12 ов

EASYHOOK http://www.codeplex.com/easyhook

Все доминирующие технологии Dominate - это простота, гибкость и функциональность.

Это также не обсуждалось ранее в отношении процессов Hook . Я прочитал все листы этой темы и с абсолютным сертификатом, EASYHOOK очень суров. Независимо от того, используете ли вы C, C ++, CLR, что угодно.

Я немного вставлю с домашней страницы codeplex, чтобы обеспечить достаточную оплату omage.

Ниже приведен неполный список функций:

  1. Так называемый «Thread Dead Barrier» избавится от многих основных проблем при подключении неизвестных API; эта технология уникальна для EasyHook
  2. Вы можете написать обработчики управляемого обработчика для неуправляемых API-интерфейсов
  3. Вы можете использовать все удобные управляемые коды, например NET Remoting, WPF и WCF, например
  4. Документированный, чистый неуправляемый API подключения
  5. Поддержка 32- и 64-битного режима ядра (также проверьте мой драйвер PatchGuard 3 bypass, который можно найти в списке выпусков)
  6. В целевой памяти нет утечек ресурсов или памяти
  7. Экспериментальный механизм инъекций стелса, который не привлечет внимания ни одного текущего AV-программного обеспечения
  8. EasyHook32.dll и EasyHook64.dll являются чистыми неуправляемыми модулями и могут использоваться без установленной .NET-инфраструктуры!
  9. Все крючки устанавливаются и автоматически удаляются стабильным образом
  10. Поддержка Windows Vista с пакетом обновления 1 (SP1) и Windows Server 2008 с пакетом обновления 1 (SP1) x64 с использованием полностью недокументированных API-интерфейсов, позволяющих подключаться к любому сеансу терминала.
  11. Управляемая / Неуправляемая трассировка стека модулей внутри обработчика крючка
  12. Получить управляемый / неуправляемый модуль вызова внутри обработчика привязки
  13. Создавать собственные трассировки стека внутри обработчика крючка
  14. Вы сможете писать библиотеки инъекций и процессы хоста, скомпилированные для AnyCPU, что позволит вам вставлять ваш код в 32- и 64-разрядные процессы из 64- и 32-разрядных процессов, используя все те же сборки во всех случаях.
  15. EasyHook поддерживает RIP-относительное перемещение адреса для 64-битных целей.
  16. Не требуется распаковка / установка.
  17. Распространяемый компонент Visual Studio не требуется.

Я рад, что мой проститутка по-прежнему знает несколько трюков в сравнении, что заставляет меня держать их вокруг. Но, конечно, когда вам нужен КРЮК, 99 раз 100, EASYHOOK'r выведет вас туда быстрее. И это довольно активно поддерживается.


Пожалуйста, дайте более подробную информацию о функции, которую вы хотите подключить! Существует несколько способов получить свой собственный код, вызываемый в таком случае, например:

  • Вы можете создать поддельную DLL с тем же именем, что и DLL, которая содержит функцию, которую вы хотите подключить (и скопировать ее в папку foo.exe). Эта библиотека будет выставлять те же функции, что и исходная DLL. Каждая открытая функция просто обходит вызов исходной DLL, за исключением функции, которую вы хотите подключить.

  • Вы можете изменить таблицу указателей функций во время выполнения, например, с помощью (коммерческого) пакета Detour, упомянутого в «кухне». Тем не менее, делать такую ??привязку можно легко сделать самостоятельно, см. Эту статью, чтобы узнать, как это сделать.

  • Вы можете узнать, где вызывается конкретная функция, trueи просто заменить код сборки, который вызывает функцию с кодом, который «возвращает true». В принципе, вы исправляете " foo.exe" ..

  • Для определенных функций Windows предлагает автоматическое переключение, например, для клавиш и событий мыши. Для этого проверьте функцию SetWindowsHook .


3

Это зависит от версии Windows, к которой вы хотите настроить таргетинг. Тем не менее, если вы играете в Pre-Vista, вы можете просто использовать SetWindowsHookEx для вставки вашей DLL в каждый запущенный процесс. Затем вашей DLL нужно будет подключить соответствующую функцию с помощью Detours или аналогичного.


-1

Если вы пишете свой крючок в сборке и не используете Detours (по какой-либо причине), вам нужна некоторая ключевая информация о сохранении FALSE:

  • Win32, установите EAX в 0
  • Win64, установите RAX на 0

Вам необходимо установить EAX или RAX (в зависимости от платформы) в ноль, поскольку последнее, что выполняет функция, которую вы подключаете. Это приведет к тому, что вызывающий код получит 0 в качестве возвращаемого значения (при условии, что они возвращают значение типа int или указателя).

C ++, C, окна, крюк,

c++,c,windows,hook,

29

Ответов: 5


33 ов принято

Взгляните на Detours , он идеально подходит для такого рода вещей.


Для общесистемной перехвата прочитайте эту статью из MSDN.


Во-первых, создайте DLL, которая обрабатывает функции. В этом примере ниже перечислены функции отправки и приема сокетов.

#include <cstdio>
#include <windows.h>
#include <tlhelp32.h>

void EnableDebugPriv() {
    HANDLE hToken;
    LUID luid;
    TOKEN_PRIVILEGES tkp;

    OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken );

    LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &luid );

    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Luid = luid;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    AdjustTokenPrivileges( hToken, false, &tkp, sizeof( tkp ), NULL, NULL );

    CloseHandle( hToken ); 
}

int main( int, char *[] ) {
    PROCESSENTRY32 entry;
    entry.dwSize = sizeof( PROCESSENTRY32 );

    HANDLE snapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, NULL );

    if ( Process32First( snapshot, &entry ) == TRUE ) {
        while ( Process32Next( snapshot, &entry ) == TRUE ) {
            if ( stricmp( entry.szExeFile, "target.exe" ) == 0 ) {
                EnableDebugPriv();

                char dirPath[MAX_PATH];
                char fullPath[MAX_PATH];

                GetCurrentDirectory( MAX_PATH, dirPath );

                sprintf_s( fullPath, MAX_PATH, "%s\DllToInject.dll", dirPath );

                HANDLE hProcess = OpenProcess( PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, entry.th32ProcessID );
                LPVOID libAddr = (LPVOID)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "LoadLibraryA" );
                LPVOID llParam = (LPVOID)VirtualAllocEx( hProcess, NULL, strlen( fullPath ), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE );

                WriteProcessMemory( hProcess, llParam, fullPath, strlen( fullPath ), NULL );
                CreateRemoteThread( hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)libAddr, llParam, NULL, NULL );
                CloseHandle( hProcess );
            }
        }
    }

    CloseHandle( snapshot );

    return 0;
}

Затем создайте программу для вставки DLL в целевое приложение.

foo.exe

Этого должно быть более чем достаточно, чтобы вы начали!


12 ов

EASYHOOK http://www.codeplex.com/easyhook

Все доминирующие технологии Dominate - это простота, гибкость и функциональность.

Это также не обсуждалось ранее в отношении процессов Hook . Я прочитал все листы этой темы и с абсолютным сертификатом, EASYHOOK очень суров. Независимо от того, используете ли вы C, C ++, CLR, что угодно.

Я немного вставлю с домашней страницы codeplex, чтобы обеспечить достаточную оплату omage.

Ниже приведен неполный список функций:

  1. Так называемый «Thread Dead Barrier» избавится от многих основных проблем при подключении неизвестных API; эта технология уникальна для EasyHook
  2. Вы можете написать обработчики управляемого обработчика для неуправляемых API-интерфейсов
  3. Вы можете использовать все удобные управляемые коды, например NET Remoting, WPF и WCF, например
  4. Документированный, чистый неуправляемый API подключения
  5. Поддержка 32- и 64-битного режима ядра (также проверьте мой драйвер PatchGuard 3 bypass, который можно найти в списке выпусков)
  6. В целевой памяти нет утечек ресурсов или памяти
  7. Экспериментальный механизм инъекций стелса, который не привлечет внимания ни одного текущего AV-программного обеспечения
  8. EasyHook32.dll и EasyHook64.dll являются чистыми неуправляемыми модулями и могут использоваться без установленной .NET-инфраструктуры!
  9. Все крючки устанавливаются и автоматически удаляются стабильным образом
  10. Поддержка Windows Vista с пакетом обновления 1 (SP1) и Windows Server 2008 с пакетом обновления 1 (SP1) x64 с использованием полностью недокументированных API-интерфейсов, позволяющих подключаться к любому сеансу терминала.
  11. Управляемая / Неуправляемая трассировка стека модулей внутри обработчика крючка
  12. Получить управляемый / неуправляемый модуль вызова внутри обработчика привязки
  13. Создавать собственные трассировки стека внутри обработчика крючка
  14. Вы сможете писать библиотеки инъекций и процессы хоста, скомпилированные для AnyCPU, что позволит вам вставлять ваш код в 32- и 64-разрядные процессы из 64- и 32-разрядных процессов, используя все те же сборки во всех случаях.
  15. EasyHook поддерживает RIP-относительное перемещение адреса для 64-битных целей.
  16. Не требуется распаковка / установка.
  17. Распространяемый компонент Visual Studio не требуется.

Я рад, что мой проститутка по-прежнему знает несколько трюков в сравнении, что заставляет меня держать их вокруг. Но, конечно, когда вам нужен КРЮК, 99 раз 100, EASYHOOK'r выведет вас туда быстрее. И это довольно активно поддерживается.


Пожалуйста, дайте более подробную информацию о функции, которую вы хотите подключить! Существует несколько способов получить свой собственный код, вызываемый в таком случае, например:

  • Вы можете создать поддельную DLL с тем же именем, что и DLL, которая содержит функцию, которую вы хотите подключить (и скопировать ее в папку foo.exe). Эта библиотека будет выставлять те же функции, что и исходная DLL. Каждая открытая функция просто обходит вызов исходной DLL, за исключением функции, которую вы хотите подключить.

  • Вы можете изменить таблицу указателей функций во время выполнения, например, с помощью (коммерческого) пакета Detour, упомянутого в «кухне». Тем не менее, делать такую ??привязку можно легко сделать самостоятельно, см. Эту статью, чтобы узнать, как это сделать.

  • Вы можете узнать, где вызывается конкретная функция, trueи просто заменить код сборки, который вызывает функцию с кодом, который «возвращает true». В принципе, вы исправляете " foo.exe" ..

  • Для определенных функций Windows предлагает автоматическое переключение, например, для клавиш и событий мыши. Для этого проверьте функцию SetWindowsHook .


3

Это зависит от версии Windows, к которой вы хотите настроить таргетинг. Тем не менее, если вы играете в Pre-Vista, вы можете просто использовать SetWindowsHookEx для вставки вашей DLL в каждый запущенный процесс. Затем вашей DLL нужно будет подключить соответствующую функцию с помощью Detours или аналогичного.


-1

Если вы пишете свой крючок в сборке и не используете Detours (по какой-либо причине), вам нужна некоторая ключевая информация о сохранении FALSE:

  • Win32, установите EAX в 0
  • Win64, установите RAX на 0

Вам необходимо установить EAX или RAX (в зависимости от платформы) в ноль, поскольку последнее, что выполняет функция, которую вы подключаете. Это приведет к тому, что вызывающий код получит 0 в качестве возвращаемого значения (при условии, что они возвращают значение типа int или указателя).

C ++, C, окна, крюк,
Похожие вопросы