我正在使用以下代码。 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中的本地char数组,该函数返回后将不再存在。

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

关于c++ - 为什么会破坏wchar_t *变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57811090/

10-13 07:10