fix: Use self-defined struct to replace char buffer

This commit is contained in:
yuanyuanxiang
2025-12-07 14:00:54 +01:00
parent a2d7e86012
commit 2c94e56933
5 changed files with 69 additions and 20 deletions

View File

@@ -1128,4 +1128,24 @@ public:
#define MYMSG MSG64 #define MYMSG MSG64
#endif #endif
typedef struct CharMsg {
char data[256];
bool needFree;
CharMsg(const char* msg, bool free = true) {
memset(data, 0, sizeof(data));
strcpy_s(data, msg);
needFree = free;
}
CharMsg(int len, bool free = true) {
memset(data, 0, sizeof(data));
needFree = free;
}
char& operator[](int index) {
return data[index];
}
operator const char* () const {
return data;
}
}CharMsg;
#endif #endif

Binary file not shown.

Binary file not shown.

View File

@@ -779,9 +779,9 @@ VOID CMy2015RemoteDlg::AddList(CString strIP, CString strAddr, CString strPCName
LRESULT CMy2015RemoteDlg::OnShowMessage(WPARAM wParam, LPARAM lParam) LRESULT CMy2015RemoteDlg::OnShowMessage(WPARAM wParam, LPARAM lParam)
{ {
if (wParam && !lParam) { if (wParam && !lParam) {
CString* text = (CString*)wParam; CharMsg* msg = (CharMsg*)wParam;
ShowMessage("提示信息", *text); ShowMessage("提示信息", msg->data);
delete text; if (msg->needFree) delete msg;
return S_OK; return S_OK;
} }
std::string pwd = THIS_CFG.GetStr("settings", "Password"); std::string pwd = THIS_CFG.GetStr("settings", "Password");
@@ -1222,7 +1222,8 @@ DWORD WINAPI CMy2015RemoteDlg::StartFrpClient(LPVOID param)
CString tip = !ip.empty() && ip != cvt.getPublicIP() ? CString tip = !ip.empty() && ip != cvt.getPublicIP() ?
CString(ip.c_str()) + " 必须是\"公网IP\"或反向代理服务器IP" : CString(ip.c_str()) + " 必须是\"公网IP\"或反向代理服务器IP" :
"请设置\"公网IP\"或使用反向代理服务器的IP"; "请设置\"公网IP\"或使用反向代理服务器的IP";
This->PostMessageA(WM_SHOWMESSAGE, (WPARAM)new CString(tip), NULL); CharMsg* msg = new CharMsg(tip);
This->PostMessageA(WM_SHOWMESSAGE, (WPARAM)msg, NULL);
int usingFRP = 0; int usingFRP = 0;
#ifdef _WIN64 #ifdef _WIN64
usingFRP = ip.empty() ? 0 : THIS_CFG.GetInt("frp", "UseFrp"); usingFRP = ip.empty() ? 0 : THIS_CFG.GetInt("frp", "UseFrp");
@@ -2213,6 +2214,32 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject)
// 【L】主机上下线和授权 // 【L】主机上下线和授权
// 【x】对话框相关功能 // 【x】对话框相关功能
switch (cmd) { switch (cmd) {
case TOKEN_AUTH: {
BOOL valid = FALSE;
if (len > 20) {
std::string sn(szBuffer + 1, szBuffer + 20); // length: 19
std::string passcode(szBuffer + 20, szBuffer + len);
auto v = splitString(passcode, '-');
if (v.size() == 6 || v.size() == 7) {
std::vector<std::string> subvector(v.end() - 4, v.end());
std::string password = v[0] + " - " + v[1] + ": " + GetPwdHash() + (v.size() == 6 ? "" : ": " + v[2]);
std::string finalKey = deriveKey(password, sn);
std::string hash256 = joinString(subvector, '-');
std::string fixedKey = getFixedLengthID(finalKey);
valid = (hash256 == fixedKey);
}
if (valid) {
std::string tip = passcode + " 校验成功: " + sn;
CharMsg* msg = new CharMsg(tip.c_str());
PostMessageA(WM_SHOWMESSAGE, (WPARAM)msg, NULL);
}
}
char resp[100] = { valid };
const char* msg = valid ? "此程序已获授权,请遵守授权协议,感谢合作" : "未获授权";
memcpy(resp + 4, msg, strlen(msg));
ContextObject->Send2Client((PBYTE)resp, sizeof(resp));
break;
}
case COMMAND_GET_FILE: { case COMMAND_GET_FILE: {
// 发送文件 // 发送文件
int result; int result;
@@ -2758,22 +2785,22 @@ void CMy2015RemoteDlg::OnOnlineShare()
MessageBox("字符串长度超出[0, 250]范围限制!", "提示", MB_ICONINFORMATION); MessageBox("字符串长度超出[0, 250]范围限制!", "提示", MB_ICONINFORMATION);
return; return;
} }
char* buf = new char[dlg.m_str.GetLength()+1]; CharMsg* buf = new CharMsg(dlg.m_str.GetLength()+1);
memcpy(buf, dlg.m_str, dlg.m_str.GetLength()); memcpy(buf->data, dlg.m_str, dlg.m_str.GetLength());
buf[dlg.m_str.GetLength()] = 0; buf[dlg.m_str.GetLength()] = 0;
PostMessageA(WM_SHARE_CLIENT, (WPARAM)buf, NULL); PostMessageA(WM_SHARE_CLIENT, (WPARAM)buf, NULL);
} }
LRESULT CMy2015RemoteDlg::ShareClient(WPARAM wParam, LPARAM lParam) LRESULT CMy2015RemoteDlg::ShareClient(WPARAM wParam, LPARAM lParam)
{ {
char* buf = (char*)wParam; CharMsg* buf = (CharMsg*)wParam;
int len = strlen(buf); int len = strlen(*buf);
BYTE bToken[_MAX_PATH] = { COMMAND_SHARE }; BYTE bToken[_MAX_PATH] = { COMMAND_SHARE };
// 目标主机类型 // 目标主机类型
bToken[1] = SHARE_TYPE_YAMA; bToken[1] = SHARE_TYPE_YAMA;
memcpy(bToken + 2, buf, len); memcpy(bToken + 2, buf->data, len);
lParam ? SendAllCommand(bToken, sizeof(bToken)) : SendSelectedCommand(bToken, sizeof(bToken)); lParam ? SendAllCommand(bToken, sizeof(bToken)) : SendSelectedCommand(bToken, sizeof(bToken));
SAFE_DELETE_AR(buf); if(buf->needFree) delete buf;
return S_OK; return S_OK;
} }
@@ -3511,10 +3538,10 @@ void CMy2015RemoteDlg::OnOnlineAssignTo()
MessageBox("超出使用时间可输入的字符数限制!", "提示", MB_ICONINFORMATION); MessageBox("超出使用时间可输入的字符数限制!", "提示", MB_ICONINFORMATION);
return; return;
} }
char* buf1 = new char[dlg.m_str.GetLength() + 1]; CharMsg* buf1 = new CharMsg(dlg.m_str.GetLength() + 1);
char *buf2 = new char[dlg.m_sSecondInput.GetLength() + 1]; CharMsg* buf2 = new CharMsg(dlg.m_sSecondInput.GetLength() + 1);
memcpy(buf1, dlg.m_str, dlg.m_str.GetLength()); memcpy(buf1->data, dlg.m_str, dlg.m_str.GetLength());
memcpy(buf2, dlg.m_sSecondInput, dlg.m_sSecondInput.GetLength()); memcpy(buf2->data, dlg.m_sSecondInput, dlg.m_sSecondInput.GetLength());
buf1[dlg.m_str.GetLength()] = 0; buf1[dlg.m_str.GetLength()] = 0;
buf2[dlg.m_sSecondInput.GetLength()] = 0; buf2[dlg.m_sSecondInput.GetLength()] = 0;
PostMessageA(WM_ASSIGN_CLIENT, (WPARAM)buf1, (LPARAM)buf2); PostMessageA(WM_ASSIGN_CLIENT, (WPARAM)buf1, (LPARAM)buf2);
@@ -3522,17 +3549,17 @@ void CMy2015RemoteDlg::OnOnlineAssignTo()
LRESULT CMy2015RemoteDlg::assignFunction(WPARAM wParam, LPARAM lParam, BOOL all) LRESULT CMy2015RemoteDlg::assignFunction(WPARAM wParam, LPARAM lParam, BOOL all)
{ {
char* buf1 = (char*)wParam, * buf2 = (char*)lParam; CharMsg* buf1 = (CharMsg*)wParam, *buf2 = (CharMsg*)lParam;
int len1 = strlen(buf1), len2 = strlen(buf2); int len1 = strlen(*buf1), len2 = strlen(*buf2);
BYTE bToken[_MAX_PATH] = { COMMAND_ASSIGN_MASTER }; BYTE bToken[_MAX_PATH] = { COMMAND_ASSIGN_MASTER };
// 目标主机类型 // 目标主机类型
bToken[1] = SHARE_TYPE_YAMA_FOREVER; bToken[1] = SHARE_TYPE_YAMA_FOREVER;
memcpy(bToken + 2, buf1, len1); memcpy(bToken + 2, buf1->data, len1);
bToken[2 + len1] = ':'; bToken[2 + len1] = ':';
memcpy(bToken + 2 + len1 + 1, buf2, len2); memcpy(bToken + 2 + len1 + 1, buf2->data, len2);
all ? SendAllCommand(bToken, sizeof(bToken)) : SendSelectedCommand(bToken, sizeof(bToken)); all ? SendAllCommand(bToken, sizeof(bToken)) : SendSelectedCommand(bToken, sizeof(bToken));
SAFE_DELETE_AR(buf1); if(buf1->needFree) delete buf1;
SAFE_DELETE_AR(buf2); if(buf2->needFree) delete buf2;
return S_OK; return S_OK;
} }

View File

@@ -45,9 +45,11 @@
<PropertyGroup Label="UserMacros" /> <PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental> <LinkIncremental>true</LinkIncremental>
<IncludePath>$(SolutionDir);$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<IncludePath>$(SolutionDir);$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile> <ClCompile>