char Msg[1024],調用 DLL check(Msg)。strcpy/strcat 拼接字符串。AddString 時崩潰。char Msg[1024],但可能被編譯器優化、對齊、或被其他代碼覆蓋了前 512 字節後的內存保護標記(如 /GS Buffer Security Check 插入的 Cookie)。strcat(msg, "buff") 完全不檢查剩餘空間,極易溢出。
// DLL 導出
extern "C" __declspec(dllexport) int check(char* msg, size_t maxLen) {
if (!msg || maxLen == 0) return -1;
msg[0] = '\0';
char buf[256];
int len = 0;
// 每次拼接檢查剩餘空間
auto append = [&](const char* fmt, ...) {
if (len >= maxLen - 1) return;
va_list args;
va_start(args, fmt);
int n = _vsnprintf_s(buf, sizeof(buf), _TRUNCATE, fmt, args);
va_end(args);
if (n > 0 && len + n < maxLen) {
strcpy_s(msg + len, maxLen - len, buf);
len += n;
}
};
append("xxxxxx%d,%d", int1, int2);
append("xxxxxx%d,%d", int3, int4);
// ...
return 0;
}
// 主程序調用
char Msg[1024];
check(Msg, sizeof(Msg));
BSTR 或 const char* (只讀),由調用方負責複製。/GS (Buffer Security Check) —— 默認開啟。__security_check_cookie)。Application Verifier + Basics → Heaps,捕捉跨 DLL 內存越界。裸指針跨 DLL 操作字符數組是 C++ 經典雷區,**顯式長度 + 安全函數 + 統一 CRT** 三管齊下才安心!