mirror of
https://github.com/yuanyuanxiang/SimpleRemoter.git
synced 2026-01-21 23:13:08 +08:00
fix: Ghost run as windows service failed
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
// ClientDll.cpp : Defines the entry point for the DLL application.
|
||||
// ClientDll.cpp : Defines the entry point for the DLL application.
|
||||
//
|
||||
|
||||
#include "stdafx.h"
|
||||
@@ -217,7 +217,7 @@ int main(int argc, const char *argv[])
|
||||
}
|
||||
|
||||
SetConsoleCtrlHandler(&callback, TRUE);
|
||||
const char* ip = argc > 1 ? argv[1] : NULL;
|
||||
const char* ip = (argc > 1 && argv[1][0] != '-') ? argv[1] : NULL;
|
||||
int port = argc > 2 ? atoi(argv[2]) : 6543;
|
||||
ClientApp& app(g_MyApp);
|
||||
app.g_Connection->SetType(CLIENT_TYPE_ONE);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#include "StdAfx.h"
|
||||
#include "StdAfx.h"
|
||||
#include "LoginServer.h"
|
||||
#include "Common.h"
|
||||
#include <string>
|
||||
@@ -30,16 +30,16 @@ bool IsWindows11()
|
||||
|
||||
/************************************************************************
|
||||
---------------------
|
||||
<EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD>IT1995
|
||||
<EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>CSDN
|
||||
ԭ<EFBFBD>ģ<EFBFBD>https://blog.csdn.net/qq78442761/article/details/64440535
|
||||
<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><EFBFBD><EFBFBD>2019.3.29<EFBFBD><EFBFBD>Ԭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
作者:IT1995
|
||||
来源:CSDN
|
||||
原文:https://blog.csdn.net/qq78442761/article/details/64440535
|
||||
版权声明:本文为博主原创文章,转载请附上博文链接!
|
||||
修改说明:2019.3.29由袁沅祥修改
|
||||
************************************************************************/
|
||||
std::string getSystemName()
|
||||
{
|
||||
std::string vname("δ֪<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ");
|
||||
//<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊwin8.1<EFBFBD><EFBFBD>win10
|
||||
std::string vname("未知操作系统");
|
||||
//先判断是否为win8.1或win10
|
||||
typedef void(__stdcall*NTPROC)(DWORD*, DWORD*, DWORD*);
|
||||
HINSTANCE hinst = LoadLibrary("ntdll.dll");
|
||||
if (hinst == NULL) {
|
||||
@@ -47,7 +47,7 @@ std::string getSystemName()
|
||||
}
|
||||
if (IsWindows11()) {
|
||||
vname = "Windows 11";
|
||||
Mprintf("<EFBFBD>˵<EFBFBD><EFBFBD>Եİ汾Ϊ:%s\n", vname.c_str());
|
||||
Mprintf("此电脑的版本为:%s\n", vname.c_str());
|
||||
return vname;
|
||||
}
|
||||
DWORD dwMajor, dwMinor, dwBuildNumber;
|
||||
@@ -58,31 +58,31 @@ std::string getSystemName()
|
||||
proc(&dwMajor, &dwMinor, &dwBuildNumber);
|
||||
if (dwMajor == 6 && dwMinor == 3) { //win 8.1
|
||||
vname = "Windows 8.1";
|
||||
Mprintf("<EFBFBD>˵<EFBFBD><EFBFBD>Եİ汾Ϊ:%s\n", vname.c_str());
|
||||
Mprintf("此电脑的版本为:%s\n", vname.c_str());
|
||||
return vname;
|
||||
}
|
||||
if (dwMajor == 10 && dwMinor == 0) { //win 10
|
||||
vname = "Windows 10";
|
||||
Mprintf("<EFBFBD>˵<EFBFBD><EFBFBD>Եİ汾Ϊ:%s\n", vname.c_str());
|
||||
Mprintf("此电脑的版本为:%s\n", vname.c_str());
|
||||
return vname;
|
||||
}
|
||||
//<EFBFBD><EFBFBD><EFBFBD>治<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>Win Server<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>
|
||||
//下面不能判断Win Server,因为本人还未有这种系统的机子,暂时不给出
|
||||
|
||||
//<EFBFBD>ж<EFBFBD>win8.1<EFBFBD><EFBFBD><EFBFBD>µİ汾
|
||||
SYSTEM_INFO info; //<EFBFBD><EFBFBD>SYSTEM_INFO<EFBFBD>ṹ<EFBFBD>ж<EFBFBD>64λAMD<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
GetSystemInfo(&info); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>GetSystemInfo<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṹ
|
||||
//判断win8.1以下的版本
|
||||
SYSTEM_INFO info; //用SYSTEM_INFO结构判断64位AMD处理器
|
||||
GetSystemInfo(&info); //调用GetSystemInfo函数填充结构
|
||||
OSVERSIONINFOEX os;
|
||||
os.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
|
||||
if (GetVersionEx((OSVERSIONINFO *)&os)) {
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ汾<EFBFBD><EFBFBD>Ϣ<EFBFBD>жϲ<EFBFBD><EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//下面根据版本信息判断操作系统名称
|
||||
switch (os.dwMajorVersion) {
|
||||
//<EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD>汾<EFBFBD><EFBFBD>
|
||||
//判断主版本号
|
||||
case 4:
|
||||
switch (os.dwMinorVersion) {
|
||||
//<EFBFBD>жϴΰ汾<EFBFBD><EFBFBD>
|
||||
//判断次版本号
|
||||
case 0:
|
||||
if (os.dwPlatformId == VER_PLATFORM_WIN32_NT)
|
||||
vname ="Windows NT 4.0"; //1996<EFBFBD><EFBFBD>7<EFBFBD>·<EFBFBD><EFBFBD><EFBFBD>
|
||||
vname ="Windows NT 4.0"; //1996年7月发布
|
||||
else if (os.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
|
||||
vname = "Windows 95";
|
||||
break;
|
||||
@@ -96,19 +96,19 @@ std::string getSystemName()
|
||||
break;
|
||||
case 5:
|
||||
switch (os.dwMinorVersion) {
|
||||
//<EFBFBD>ٱȽ<EFBFBD>dwMinorVersion<EFBFBD><EFBFBD>ֵ
|
||||
//再比较dwMinorVersion的值
|
||||
case 0:
|
||||
vname = "Windows 2000"; //1999<EFBFBD><EFBFBD>12<EFBFBD>·<EFBFBD><EFBFBD><EFBFBD>
|
||||
vname = "Windows 2000"; //1999年12月发布
|
||||
break;
|
||||
case 1:
|
||||
vname = "Windows XP"; //2001<EFBFBD><EFBFBD>8<EFBFBD>·<EFBFBD><EFBFBD><EFBFBD>
|
||||
vname = "Windows XP"; //2001年8月发布
|
||||
break;
|
||||
case 2:
|
||||
if (os.wProductType == VER_NT_WORKSTATION &&
|
||||
info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
|
||||
vname = "Windows XP Professional x64 Edition";
|
||||
else if (GetSystemMetrics(SM_SERVERR2) == 0)
|
||||
vname = "Windows Server 2003"; //2003<EFBFBD><EFBFBD>3<EFBFBD>·<EFBFBD><EFBFBD><EFBFBD>
|
||||
vname = "Windows Server 2003"; //2003年3月发布
|
||||
else if (GetSystemMetrics(SM_SERVERR2) != 0)
|
||||
vname = "Windows Server 2003 R2";
|
||||
break;
|
||||
@@ -120,7 +120,7 @@ std::string getSystemName()
|
||||
if (os.wProductType == VER_NT_WORKSTATION)
|
||||
vname = "Windows Vista";
|
||||
else
|
||||
vname = "Windows Server 2008"; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>汾
|
||||
vname = "Windows Server 2008"; //服务器版本
|
||||
break;
|
||||
case 1:
|
||||
if (os.wProductType == VER_NT_WORKSTATION)
|
||||
@@ -137,25 +137,25 @@ std::string getSystemName()
|
||||
}
|
||||
break;
|
||||
default:
|
||||
vname = "δ֪<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ";
|
||||
vname = "未知操作系统";
|
||||
}
|
||||
Mprintf("<EFBFBD>˵<EFBFBD><EFBFBD>Եİ汾Ϊ:%s\n", vname.c_str());
|
||||
Mprintf("此电脑的版本为:%s\n", vname.c_str());
|
||||
} else
|
||||
Mprintf("<EFBFBD>汾<EFBFBD><EFBFBD>ȡʧ<EFBFBD><EFBFBD>\n");
|
||||
Mprintf("版本获取失败\n");
|
||||
return vname;
|
||||
}
|
||||
|
||||
std::string formatTime(const FILETIME& fileTime)
|
||||
{
|
||||
// ת<EFBFBD><EFBFBD>Ϊ 64 λʱ<CEBB><CAB1>
|
||||
// 转换为 64 位时间
|
||||
ULARGE_INTEGER ull;
|
||||
ull.LowPart = fileTime.dwLowDateTime;
|
||||
ull.HighPart = fileTime.dwHighDateTime;
|
||||
|
||||
// ת<EFBFBD><EFBFBD>Ϊ<EFBFBD>뼶ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 转换为秒级时间戳
|
||||
std::time_t startTime = static_cast<std::time_t>((ull.QuadPart / 10000000ULL) - 11644473600ULL);
|
||||
|
||||
// <EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 格式化输出
|
||||
std::tm* localTime = std::localtime(&startTime);
|
||||
char buffer[100];
|
||||
std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", localTime);
|
||||
@@ -166,7 +166,7 @@ std::string getProcessTime()
|
||||
{
|
||||
FILETIME creationTime, exitTime, kernelTime, userTime;
|
||||
|
||||
// <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
// 获取当前进程的时间信息
|
||||
if (GetProcessTimes(GetCurrentProcess(), &creationTime, &exitTime, &kernelTime, &userTime)) {
|
||||
return formatTime(creationTime);
|
||||
}
|
||||
@@ -190,25 +190,25 @@ int getOSBits()
|
||||
}
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>CPU<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 检查CPU核心数
|
||||
// SYSTEM_INFO.dwNumberOfProcessors
|
||||
int GetCPUCores()
|
||||
{
|
||||
INT i = 0;
|
||||
#ifdef _WIN64
|
||||
// <EFBFBD><EFBFBD> x64 <EFBFBD>£<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫʹ<EFBFBD><EFBFBD> `NtQuerySystemInformation`
|
||||
// 在 x64 下,我们需要使用 `NtQuerySystemInformation`
|
||||
SYSTEM_INFO sysInfo;
|
||||
GetSystemInfo(&sysInfo);
|
||||
i = sysInfo.dwNumberOfProcessors; // <EFBFBD><EFBFBD>ȡ CPU <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
i = sysInfo.dwNumberOfProcessors; // 获取 CPU 核心数
|
||||
#else
|
||||
_asm { // x64<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>²<EFBFBD>֧<EFBFBD><EFBFBD>__asm<EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD>Ƕ<EFBFBD><EFBFBD>
|
||||
_asm { // x64编译模式下不支持__asm的汇编嵌入
|
||||
mov eax, dword ptr fs : [0x18] ; // TEB
|
||||
mov eax, dword ptr ds : [eax + 0x30] ; // PEB
|
||||
mov eax, dword ptr ds : [eax + 0x64] ;
|
||||
mov i, eax;
|
||||
}
|
||||
#endif
|
||||
Mprintf("<EFBFBD>˼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CPU<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: %d\n", i);
|
||||
Mprintf("此计算机CPU核心: %d\n", i);
|
||||
return i;
|
||||
}
|
||||
|
||||
@@ -218,7 +218,7 @@ double GetMemorySizeGB()
|
||||
mst.dwLength = sizeof(mst);
|
||||
GlobalMemoryStatusEx(&mst);
|
||||
double GB = mst.ullTotalPhys / (1024.0 * 1024 * 1024);
|
||||
Mprintf("<EFBFBD>˼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>: %fGB\n", GB);
|
||||
Mprintf("此计算机内存: %fGB\n", GB);
|
||||
return GB;
|
||||
}
|
||||
|
||||
@@ -277,11 +277,11 @@ std::string GetCurrentUserNameA()
|
||||
LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, const CONNECT_ADDRESS& conn)
|
||||
{
|
||||
LOGIN_INFOR LoginInfor;
|
||||
LoginInfor.bToken = TOKEN_LOGIN; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>¼
|
||||
//<EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD>Ϣ
|
||||
LoginInfor.bToken = TOKEN_LOGIN; // 令牌为登录
|
||||
//获得操作系统信息
|
||||
strcpy_s(LoginInfor.OsVerInfoEx, getSystemName().c_str());
|
||||
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>PCName
|
||||
//获得PCName
|
||||
char szPCName[MAX_PATH] = {0};
|
||||
gethostname(szPCName, MAX_PATH);
|
||||
|
||||
@@ -297,13 +297,13 @@ LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, const CONNECT_ADDRESS& conn)
|
||||
LoginInfor.dwCPUMHz = dwCPUMHz;
|
||||
LoginInfor.bWebCamIsExist = bWebCamIsExist;
|
||||
strcpy_s(LoginInfor.szStartTime, getProcessTime().c_str());
|
||||
LoginInfor.AddReserved(GetClientType(conn.ClientType())); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
LoginInfor.AddReserved(getOSBits()); // ϵͳλ<EFBFBD><EFBFBD>
|
||||
LoginInfor.AddReserved(GetCPUCores()); // CPU<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
LoginInfor.AddReserved(GetMemorySizeGB()); // ϵͳ<EFBFBD>ڴ<EFBFBD>
|
||||
LoginInfor.AddReserved(GetClientType(conn.ClientType())); // 类型
|
||||
LoginInfor.AddReserved(getOSBits()); // 系统位数
|
||||
LoginInfor.AddReserved(GetCPUCores()); // CPU核数
|
||||
LoginInfor.AddReserved(GetMemorySizeGB()); // 系统内存
|
||||
char buf[_MAX_PATH] = {};
|
||||
GetModuleFileNameA(NULL, buf, sizeof(buf));
|
||||
LoginInfor.AddReserved(buf); // <EFBFBD>ļ<EFBFBD>·<EFBFBD><EFBFBD>
|
||||
LoginInfor.AddReserved(buf); // 文件路径
|
||||
LoginInfor.AddReserved("?"); // test
|
||||
iniFile cfg(CLIENT_PATH);
|
||||
std::string installTime = cfg.GetStr("settings", "install_time");
|
||||
@@ -311,9 +311,9 @@ LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, const CONNECT_ADDRESS& conn)
|
||||
installTime = ToPekingTimeAsString(nullptr);
|
||||
cfg.SetStr("settings", "install_time", installTime);
|
||||
}
|
||||
LoginInfor.AddReserved(installTime.c_str()); // <EFBFBD><EFBFBD>װʱ<EFBFBD><EFBFBD>
|
||||
LoginInfor.AddReserved("?"); // <EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD>Ϣ
|
||||
LoginInfor.AddReserved(sizeof(void*)==4 ? 32 : 64); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
|
||||
LoginInfor.AddReserved(installTime.c_str()); // 安装时间
|
||||
LoginInfor.AddReserved("?"); // 安装信息
|
||||
LoginInfor.AddReserved(sizeof(void*)==4 ? 32 : 64); // 程序位数
|
||||
std::string str;
|
||||
std::string masterHash(skCrypt(MASTER_HASH));
|
||||
HANDLE hMutex = OpenMutex(SYNCHRONIZE, FALSE, "MASTER.EXE");
|
||||
@@ -331,7 +331,7 @@ LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, const CONNECT_ADDRESS& conn)
|
||||
auto list = StringToVector(str, '-', 3);
|
||||
str = list[1].empty() ? "Unknown" : list[1];
|
||||
}
|
||||
LoginInfor.AddReserved(str.c_str()); // <EFBFBD><EFBFBD>Ȩ<EFBFBD><EFBFBD>Ϣ
|
||||
LoginInfor.AddReserved(str.c_str()); // 授权信息
|
||||
bool isDefault = strlen(conn.szFlag) == 0 || strcmp(conn.szFlag, skCrypt(FLAG_GHOST)) == 0 ||
|
||||
strcmp(conn.szFlag, skCrypt("Happy New Year!")) == 0;
|
||||
const char* id = isDefault ? masterHash.c_str() : conn.szFlag;
|
||||
@@ -379,7 +379,7 @@ BOOL WebCamIsExist()
|
||||
char szDeviceName[100], szVer[50];
|
||||
for (int i = 0; i < 10 && !bOk; ++i) {
|
||||
bOk = capGetDriverDescription(i, szDeviceName, sizeof(szDeviceName),
|
||||
//ϵͳ<EFBFBD><EFBFBD>API<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//系统的API函数
|
||||
szVer, sizeof(szVer));
|
||||
}
|
||||
return bOk;
|
||||
|
||||
Reference in New Issue
Block a user