为什么 wchar_t* 变量会被破坏?

Why is a wchar_t* variable being clobbered?

本文关键字:变量 wchar 为什么      更新时间:2023-10-16

我正在使用以下代码段。DLLName 属于wchar_t*型,它在我的程序早期就被设置了。在我在我的代码中达到这一点之前,DLLName 是 DLL 的有效路径,如L"C:\Windows\System32\advapi32.dll"

wprintf(L"Location: %sn", DLLName);
HMODULE hDLL = LoadLibraryW(DLLName);

当我的代码达到wprintf时会发生什么?不会打印 DLLName 的值。事实上,DLLName 现在是一个空白字符串,L""!这会导致调用LoadLibraryW()失败。

奇怪。我评论掉wprintf.当调试器到达LoadLibraryW()时,DLLName 是正确的宽字符串,带有我的 DLL 的路径。LoadLibraryW()后,DLLName 的值为L"x4",调用失败。

这是怎么回事?我对如何调试它一无所知。

编辑:我所有的代码

BOOL FindOriginalCOMServer(wchar_t* GUID, wchar_t** DLLName)
{
HKEY hKey;
HKEY hCLSIDKey;
wchar_t name[MAX_PATH];
DWORD nameLength = MAX_PATH;
wprintf(L"[*] Beginning search for GUID %sn", GUID);
LONG lResult = RegOpenKeyExW(HKEY_LOCAL_MACHINE, (LPCWSTR)L"SOFTWARE\Classes\CLSID", 0, KEY_READ, &hKey);
if (lResult != ERROR_SUCCESS) {
wprintf(L"[-] Error getting CLSID pathn");
return FALSE;
}
// Make sure HKLMSoftwareClassesCLSID{GUID} exists
lResult = RegOpenKeyExW(hKey, GUID, 0, KEY_READ, &hCLSIDKey);
if (lResult != ERROR_SUCCESS) {
wprintf(L"[-] Error getting GUID pathn");
RegCloseKey(hKey);
return FALSE;
}
// Read the value of HKLM's InProcServer32
lResult = RegGetValueW(hCLSIDKey, (LPCWSTR)L"InProcServer32", NULL, RRF_RT_ANY, NULL, (PVOID)&name, &nameLength);
if (lResult != ERROR_SUCCESS) {
wprintf(L"[-] Error getting InProcServer32 value: %dn", lResult);
RegCloseKey(hKey);
RegCloseKey(hCLSIDKey);
return FALSE;
}
*DLLName = name;
return TRUE;
}

然后:

wchar_t* DLLName = new wchar_t[MAX_PATH];
if (!FindOriginalCOMServer((wchar_t*)lplpsz, &DLLName))
{
wprintf(L"[-] Couldn't find original COM servern");
return S_FALSE;
}
wprintf("[+] Found original COM server: %sn", DLLName);
HMODULE hDLL = LoadLibraryW(DLLName);

DLLName将指向FindOriginalCOMServer中的本地字符数组,一旦该函数返回,该数组将不再存在。

您应该将DLLName作为wchar_t*传递给FindOriginalCOMServer()(一个指针,而不是两个(,然后摆脱name并直接使用DLLName。 或者,您可以使用wcscpy_s()将字符串从name复制到DLLName