qq_27906417 2022-04-18 21:10 采纳率: 100%
浏览 743
已结题

c++代码改成通过pid和模块名字获取指定的模块基址

不要说几个函数然后指指点点,直接回复加好注释的源码,不然不采纳。

PVOID GetProcessImageBase2(DWORD dwProcessId)//dwProcessId就是程序的标识符
{
    PVOID pProcessImageBase = NULL;
    //打开进程, 获取进程句柄
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
    if (NULL == hProcess)
    {
        return pProcessImageBase;
    }
    // 遍历进程模块,
    HMODULE hModule[100] = { 0 };
    DWORD dwRet = 0;
    BOOL bRet = EnumProcessModules(hProcess, (HMODULE*)(hModule), sizeof(hModule), &dwRet);
    if (FALSE == bRet)
    {
        CloseHandle(hProcess);
        return pProcessImageBase;
    }
    // 获取第一个模块加载基址
    pProcessImageBase = hModule[0];
    // 关闭句柄
    CloseHandle(hProcess);
    return pProcessImageBase;
}



  • 写回答

3条回答 默认 最新

  • 急速光粒 2022-04-18 23:30
    关注

    改造了一下,可以运行,注意传入正确的pid和模块名称,模块名称此处为了方便,不带路径,运行效果:

    img

    代码如下:

    #include <string>
    using namespace std;
    PVOID GetProcessImageBase3(DWORD dwProcessId, TCHAR*  moduleName)//dwProcessId就是程序的标识符
    {
        PVOID pProcessImageBase = NULL;
        //打开进程, 获取进程句柄
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
        if (NULL == hProcess)
        {
            return pProcessImageBase;
        }
        // 遍历进程模块,
        HMODULE hModule[100] = { 0 };
        DWORD dwRet = 0;
        BOOL bRet = EnumProcessModules(hProcess, (HMODULE*)(hModule), sizeof(hModule), &dwRet);
        if (FALSE == bRet)
        {
            CloseHandle(hProcess);
            return pProcessImageBase;
        }
        int iSel = 0;
        for (int i = 0; i < (dwRet / sizeof(HMODULE)); i++)
        {
            TCHAR szModName[MAX_PATH];
    
            // Get the full path to the module's file.
    
            if (GetModuleFileNameEx(hProcess, hModule[i], szModName,
                sizeof(szModName) / sizeof(TCHAR)))
            {
                // 遍历模块名,与传入的模块名比较,相同则记录序号(只比较文件名,不比较路径,注意文件名带扩展名)
                basic_string<TCHAR, char_traits<TCHAR>, allocator<TCHAR> >
                    str(szModName);
                if (str.find_last_of('\\') >= 0)
                    str = str.substr(str.find_last_of(_T("\\"))+1);
    
                if (_tcsicmp(str.c_str(), moduleName) == 0)
                {
                    iSel = i;
                    break;
                }
                _tprintf(TEXT("\t%s (0x%08X)\n"), szModName, hModule[i]);
            }
        }
        // 获取指定名称模块的加载基址,未找到则返回第0个
        pProcessImageBase = hModule[iSel];
        // 关闭句柄
        CloseHandle(hProcess);
        return pProcessImageBase;
    }
    
    
    int APIENTRY _tWinMain(HINSTANCE hInstance,
        HINSTANCE hPrevInstance,
        LPTSTR    lpCmdLine,
        int       nCmdShow)
    {
        //PVOID p = GetProcessImageBase2(12124);
        PVOID p = GetProcessImageBase3(12124, _T("devenv.exe"));//12124改成你的devenv.exe的pid
    
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月27日
  • 已采纳回答 4月19日
  • 赞助了问题酬金50元 4月19日
  • 创建了问题 4月18日

悬赏问题

  • ¥15 对于这个复杂问题的解释说明
  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败