2016-05-23 4 views
-2

Я пытаюсь создать собственный кейлоггер (частный/образовательный), чтобы расширить свои навыки. Я начал искать крючки и в этом случае KBDLLHOOKSTRUCT.Проблемы с подключением KBDLL

Я не уверен, что случилось с моим кодом, но он не работает. Что я делаю:

  • Создать функцию обратного вызова с nCode, wParam'а, и LPARAM плюс возвращение к CallNextHookEx.

  • Я установил функцию в рукоятке HHOOK с помощью SetWindowsHookEx и установил бесконечный цикл. Мой KBDLLHOOKSTRUCT установлен в * lParam, поскольку lParam - это указатель на KBDLLHOOKSTRUCT, содержащий информацию, которую я хочу, правильно?

Мой код:

#include <windows.h> 
#include <iostream> 
#include <fstream> 
#include <string> 

HHOOK hookHandle; 
KBDLLHOOKSTRUCT hookData; 

LRESULT CALLBACK LowLevelKeyboardProc(int nC, WPARAM wP, LPARAM lP); 
std::string readLogs(); 
void writeLogs(std::string logs); 

int main() 
{ 
    hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, NULL, 0); 
    while(true) { 

     Sleep(1000); 
    } 
    return 0; 
} 

std::string readLogs() { 
    std::ifstream readFile; 
    readFile.open("logs.txt"); 
    std::string logs; 
    readFile >> logs; 
    return logs; 
} 

void writeLogs(std::string logs) { 
    std::string oLogs = readLogs(); 
    std::ofstream writeFile; 
    writeFile.open("logs.txt"); 
    writeFile << oLogs + logs; 
} 

LRESULT CALLBACK LowLevelKeyboardProc(int nC, WPARAM wP, LPARAM lP) { 
    if (nC >= 0) { 
     if (wP == WM_KEYDOWN) { 
      hookData = *((KBDLLHOOKSTRUCT*)lP); 
     } 
    } 
    return CallNextHookEx(hookHandle, nC, wP, lP); 
} 

Просто игнорировать readLogs() и writeLogs().

Я думал, что проблема была с:

hookData = *((KBDLLHOOKSTRUCT*)lP); 

Но это было не так, по-видимому, из-за простое приращение ИНТА й не произошло.

Таким образом, я пришел сюда, чтобы попросить о помощи. Что я могу сделать, чтобы исправить мою проблему?

+0

Где этот предполагаемый приращение x? –

+0

[Сырой вход] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645543.aspx) – theB

+0

@ EricBrown Здесь вы найдете: http://pastebin.com/pSQ3mSs1 – Flinzy

ответ

2

Вам необходимо прочитать документацию. Прямо от LowLevelKeyboardProc:

Этот крюк вызывается в контексте потока, который его установил. Вызов выполняется путем отправки сообщения в поток, который установил hook. Следовательно, поток, который установил крючок, должен иметь контур сообщения.

+0

Благодарим вас за Ваш ответ. Не могли бы вы указать мне направление? Я изменил цикл while (true) {} на цикл сообщений, но он работает только тогда, когда я добавляю окно сообщения к функции обратного вызова. И я бы предпочел не открывать окно сообщений после каждого ключа. Какие разные «сообщения» можно использовать? Я пробовал SendMessage (HWND_BROADCAST, NULL, wP, lP), но ничего не происходит. – Flinzy

+0

@Flinzy: Все, что вам нужно, это стандартный цикл сообщений (без каких-либо фильтров). См. [Использование сообщений и очереди сообщений] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms644928.aspx) для примера. – IInspectable

Смежные вопросы