EnumProcessModules返回有效句柄上的无效句柄

时间:2020-06-28 07:31:17

标签: c++

我正在尝试创建一个程序,该程序将枚举CSGO中的所有模块。但是Handle似乎对EnumProcessModules函数无效。它不为零,否则工作正常。尝试以管理员身份运行它,但结果保持不变

#include <Windows.h>
#include <TlHelp32.h>
#include <iostream>
#include <string>
#include <psapi.h>
#include <tchar.h>

using namespace std;

struct ret
{
    HANDLE pHandle;
    DWORD pid, bytes;
    HMODULE hmod[1024];
};

ret GetHandleToCSGO()
{
    PROCESSENTRY32 pe;
    pe.dwSize = sizeof(PROCESSENTRY32);

    HANDLE tHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (Process32First(tHandle, &pe))
    {
        while (Process32Next(tHandle, &pe))
        {
            if (!strcmp(pe.szExeFile,"csgo.exe"))
            {
                ret r;
                r.pHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, pe.th32ProcessID);
                r.pid = pe.th32ProcessID;

                CloseHandle(tHandle);
                return r;
            }
        }
    }
}

void enummodules(ret)
{
    ret r;
    if (EnumProcessModules(r.pHandle, r.hmod, sizeof(r.hmod), &r.bytes))
    {
        for (int64_t i = 0; i < (r.bytes / sizeof(HMODULE)); i++)
        {
            TCHAR szModName[MAX_PATH];

            if (GetModuleFileNameEx(r.pHandle, r.hmod[i], szModName, sizeof(szModName) / sizeof(TCHAR)))
                printf(TEXT("\t%s (0x%08X)\n"), szModName, r.hmod[i]);
        }
    }
    else
        cout << GetLastError();
}

int main()
{
    ret r; r = GetHandleToCSGO(); 
    cout << r.pHandle;  
    enummodules(r);
}

1 个答案:

答案 0 :(得分:0)

Microsoft Docs都有关于这两个主题的教程,向您展示了必须如何完成

您应该错误地检查CreateToolHelp32Snapshot()的返回值

由于使用的是while循环而不是do while循环,因此实际上是在跳过第一个过程。并非所有路径都有返回值,您的IDE应该警告您这有问题。

您的enummodules实际上并没有输入,您创建了一个本地范围ret,而不是使用您传递的那个。

这是固定代码:

#include <Windows.h>
#include <TlHelp32.h>
#include <iostream>
#include <string>
#include <psapi.h>
#include <tchar.h>

using namespace std;

struct ret
{
    HANDLE pHandle;
    DWORD pid, bytes;
    HMODULE hmod[1024];
};

ret GetHandleToCSGO()
{
    ret r{ 0 };

    PROCESSENTRY32 pe;
    pe.dwSize = sizeof(PROCESSENTRY32);

    HANDLE tHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (Process32First(tHandle, &pe))
    {
        do
        {
            if (!_stricmp(pe.szExeFile, "csgo.exe"))
            {
                r.pHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, pe.th32ProcessID);
                r.pid = pe.th32ProcessID;
                break;
            }
        } while (Process32Next(tHandle, &pe));
    }

    CloseHandle(tHandle);
    return r;
}

void enummodules(ret r)
{
    if (EnumProcessModules(r.pHandle, r.hmod, sizeof(r.hmod), &r.bytes))
    {
        for (int64_t i = 0; i < (r.bytes / sizeof(HMODULE)); i++)
        {
            TCHAR szModName[MAX_PATH];

            if (GetModuleFileNameEx(r.pHandle, r.hmod[i], szModName, sizeof(szModName) / sizeof(TCHAR)))
                printf(TEXT("\t%s (0x%08X)\n"), szModName, (unsigned int)r.hmod[i]);
        }
    }
    else
        cout << "last error: " << GetLastError();
}

int main()
{
    ret r; r = GetHandleToCSGO();
    cout << r.pHandle;
    enummodules(r);

    std::getchar();
    return 0;
}
相关问题