为什么 wchar_t* 变量被破坏了?
Why is a wchar_t* variable being clobbered?
我正在处理以下代码。 DLLName 的类型为 wchar_t*
,它在我的程序中很早就被设置了。在我的代码达到这一点之前,DLLName 是 DLL 的有效路径,例如 L"C:\Windows\System32\advapi32.dll"
wprintf(L"Location: %s\n", 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 %s\n", 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 path\n");
return FALSE;
}
// Make sure HKLM\Software\Classes\CLSID\{GUID} exists
lResult = RegOpenKeyExW(hKey, GUID, 0, KEY_READ, &hCLSIDKey);
if (lResult != ERROR_SUCCESS) {
wprintf(L"[-] Error getting GUID path\n");
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: %d\n", 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 server\n");
return S_FALSE;
}
wprintf("[+] Found original COM server: %s\n", DLLName);
HMODULE hDLL = LoadLibraryW(DLLName);
DLLName
将指向 FindOriginalCOMServer
中的本地字符数组,一旦该函数 returns.
将不再存在
您应该将 DLLName
作为 wchar_t*
(一个指针,而不是两个)传递给 FindOriginalCOMServer()
,然后摆脱 name
并使用 DLLName
直接地。或者,您可以使用 wcscpy_s()
将字符串从 name
复制到 DLLName
。
我正在处理以下代码。 DLLName 的类型为 wchar_t*
,它在我的程序中很早就被设置了。在我的代码达到这一点之前,DLLName 是 DLL 的有效路径,例如 L"C:\Windows\System32\advapi32.dll"
wprintf(L"Location: %s\n", 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 %s\n", 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 path\n");
return FALSE;
}
// Make sure HKLM\Software\Classes\CLSID\{GUID} exists
lResult = RegOpenKeyExW(hKey, GUID, 0, KEY_READ, &hCLSIDKey);
if (lResult != ERROR_SUCCESS) {
wprintf(L"[-] Error getting GUID path\n");
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: %d\n", 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 server\n");
return S_FALSE;
}
wprintf("[+] Found original COM server: %s\n", DLLName);
HMODULE hDLL = LoadLibraryW(DLLName);
DLLName
将指向 FindOriginalCOMServer
中的本地字符数组,一旦该函数 returns.
您应该将 DLLName
作为 wchar_t*
(一个指针,而不是两个)传递给 FindOriginalCOMServer()
,然后摆脱 name
并使用 DLLName
直接地。或者,您可以使用 wcscpy_s()
将字符串从 name
复制到 DLLName
。