C ++ GetModuleFileName不返回正确的字符串

时间:2017-11-01 21:10:25

标签: c++ visual-studio

有时GetModuleFileName会返回正确的字符串,但是当前使用该字符串的当前代码的99%会返回ÀÙáøÛáws\system32\HID.DLL而不是E:\Windows\system32\HID.DLL,这应该是正确的值。考虑到这一点,我无法将字符串与应加载的所有模块的列表进行比较,以查看该字符串是否在列表中,如果没有人注入该DLL。

下面的代码可能不是最好的,但是我尝试使用的代码就是这个代码。我确实尝试了各种代码更改,试图弄清楚如何不使用TCHAR并调查EnumProcessModules的回报。

void _scan_dll_data(VBTrpSetup_t &setup, VBTrp_DetectData_t &_ret, VBTrp_InjectData_t &_dlllists) {
    bool _detected_injected_dll = false;
    std::vector<std::string> _ModuleContainer;
    std::string _ModuleName;
    HMODULE hMods[1024];  /* Hopefully enough for this. */
    DWORD cbNeeded;
    if (EnumProcessModules(setup.GameProcHandle, hMods, sizeof(hMods), &cbNeeded)) {
        for (unsigned int i = 0; i < (cbNeeded / sizeof(HMODULE)); i++ ) {
            char szModName[MAX_PATH];
            if (GetModuleFileName(hMods[i], szModName, sizeof(szModName) / sizeof(char))) {
                _ModuleName = szModName;
                for (unsigned int i = 0; i < _dlllists.ModuleExcludeList.size(); i++) {
                    // item must not be in the ModuleExcludeList!!!
                    if (!_dlllists.ModuleExcludeList[i].compare(_ModuleName)) {
                        _ModuleContainer.push_back(_ModuleName);
                    }
                }
            }
        }
    }
    if (_dlllists.ModuleList != _ModuleContainer) {
        _detected_injected_dll = true;
        _ret.DLLName = reinterpret_cast<LPCSTR>(_ModuleName.c_str());
    }
    if (_detected_injected_dll) {
        _ret.value = TRUE;
    }
    else {
        _ret.value = FALSE;
    }
    if (_ret.value == TRUE) {
        _ret.int_value = -1;
    } else {
        _ret.int_value = NULL;
    }
}

希望答案很简单,我一定错过了。根据MSDN示例,我确实做了一些这方面的工作。也许那些例子是错的。我不太确定。 有谁知道如何解决它返回的这个字符串问题?

1 个答案:

答案 0 :(得分:0)

修复是肯定使用Unicode版本并使整个函数使用宽的unicode字符串。原因是因为一个结构(与PEB相关)是内部的,没有记录到ntdll.dll。

所以,基本上将所有内容都更改为GetModuleBaseNameW函数,因为我以后要将它们命名为wstring,注意到使用i导致覆盖i的第二个循环。外部for循环并删除它,并在Handle失效时添加对GetLastError的检查,并将错误代码返回给最终用户以处理清理。

结果是这段代码:

void _scan_dll_data(VBTrpSetup_t &setup, VBTrp_DetectData_t &_ret, VBTrp_InjectData_t &_dlllists) {
    BOOL _detected_injected_dll = FALSE;
    std::vector<std::wstring> _ModuleContainer;
    HANDLE hProcess;
    std::vector<HMODULE> hMods;
    DWORD cbNeeded;
    hProcess = GetCurrentProcess();
    _ret.int_value = 0;
    if (EnumProcessModulesEx(hProcess, hMods.data(), setup.NumOfModules, &cbNeeded, LIST_MODULES_ALL)) {
        for (unsigned int i = 0; i < (cbNeeded / sizeof(HMODULE)); i++) {
            wchar_t *szModName = L'\x0';
            std::wstring _ModuleName;
            if (GetModuleBaseNameW(hProcess, hMods[i], reinterpret_cast<LPWSTR>(szModName), MAX_PATH)) {
                _ModuleName = szModName;
                // item must not be in the ModuleExcludeList!!!
                if (!_dlllists.ModuleExcludeList[i].compare(_ModuleName)) {
                    _ModuleContainer.push_back(_ModuleName);
                }
            } else {
                _ret.error_code = GetLastError();
            }
        }
    } else {
        _ret.error_code = GetLastError();
    }
    if (_ret.error_code != ERROR_INVALID_HANDLE) {
        for (unsigned int j = 0; j < _dlllists.ModuleList.size(); j++) {
            if (_dlllists.ModuleList[j] != _ModuleContainer[j]) {
                _detected_injected_dll = TRUE;
                _ret.int_value = -1;
                _ret.DLLName = (LPWSTR)_ModuleContainer[j].c_str();
                // to avoid overwriting the first one.
                break;
            }
        }
        _ret.value = _detected_injected_dll;
    }
}