在C+中查找PID和基址+; 我试图编写一个C++代码,它显示了一些应用程序的进程ID和基地址,PID看起来正确,但是基地址是0,这是不正确的。我的问题是-这里怎么了

在C+中查找PID和基址+; 我试图编写一个C++代码,它显示了一些应用程序的进程ID和基地址,PID看起来正确,但是基地址是0,这是不正确的。我的问题是-这里怎么了,c++,winapi,codeblocks,C++,Winapi,Codeblocks,IDE:代码::块 此外,为了使它能够正常运行,我必须在中设置“-lpsapi” 设置->编译器->链接器设置->其他链接器选项 我曾考虑将其构建为admin,但在Code::Block中找不到这样的选项(可能是内置的?) #定义WINVER 0x0501 #包括 #包括 #包括 #包括 #包括 #包括 #包括 使用名称空间std; 句柄GetHandle() { string name=“PathOfExile_x64.exe”; DWORD pid=0; HANDLE snapshot=

IDE:代码::块

此外,为了使它能够正常运行,我必须在中设置“-lpsapi” 设置->编译器->链接器设置->其他链接器选项

我曾考虑将其构建为admin,但在Code::Block中找不到这样的选项(可能是内置的?)

#定义WINVER 0x0501
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
句柄GetHandle()
{
string name=“PathOfExile_x64.exe”;
DWORD pid=0;
HANDLE snapshot=CreateToolhelp32Snapshot(TH32CS\u SNAPPROCESS,0);
PROCESSENTRY32过程;
零内存(&process,sizeof(process));
process.dwSize=sizeof(过程);
if(Process32First(快照和进程))
{
做
{
if(字符串(process.szExeFile)==名称)
{
pid=process.th32ProcessID;
打破
}
}while(Process32Next(快照和进程));
}
CloseHandle(快照);
如果(pid!=0)
{

cout我会这样做,测试工作。我不熟悉枚举函数,我更喜欢使用ToolHelp32Snapshot函数

#包括“stdafx.h”
#包括
#包括
#包括
DWORD GetProcId(常量字符*procName)
{
dwordprocid=0;
HANDLE hSnap=CreateToolhelp32Snapshot(TH32CS\u SNAPPROCESS,0);
if(hSnap!=无效的\u句柄\u值)
{
PROCESSENTRY32 procEntry;
procEntry.dwSize=sizeof(procEntry);
if(Process32First(hSnap和procEntry))
{
做
{
如果(!\u stricmp(procEntry.szExeFile,procName))
{
procId=procEntry.th32ProcessID;
打破
}
}while(Process32Next(hSnap,&procEntry));
}
}
闭合手柄(hSnap);
返回procId;
}
uintptr_t GetModuleBaseAddress(DWORD procId,常量字符*modName)
{
uintpttr_t modBaseAddr=0;
HANDLE hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32,procId);
if(hSnap!=无效的\u句柄\u值)
{
MODULEENTRY32 modEntry;
modEntry.dwSize=sizeof(modEntry);
if(模块32第一(hSnap和modEntry))
{
做
{
if(!\u stricmp(modEntry.szModule,modName))
{
modBaseAddr=(uintptr_t)modEntry.modBaseAddr;
打破
}
}while(module32下一步(hSnap和modEntry));
}
}
闭合手柄(hSnap);
返回modBaseAddr;
}
int main()
{
DWORD procId=GetProcId(“PathOfExile_x64.exe”);
uintpttr_t modBase=GetModuleBaseAddress(procId,“PathOfExile_x64.exe”);

std::cout我会这样做,测试工作。我不熟悉枚举函数,我更喜欢使用ToolHelp32Snapshot函数

#包括“stdafx.h”
#包括
#包括
#包括
DWORD GetProcId(常量字符*procName)
{
dwordprocid=0;
HANDLE hSnap=CreateToolhelp32Snapshot(TH32CS\u SNAPPROCESS,0);
if(hSnap!=无效的\u句柄\u值)
{
PROCESSENTRY32 procEntry;
procEntry.dwSize=sizeof(procEntry);
if(Process32First(hSnap和procEntry))
{
做
{
如果(!\u stricmp(procEntry.szExeFile,procName))
{
procId=procEntry.th32ProcessID;
打破
}
}while(Process32Next(hSnap,&procEntry));
}
}
闭合手柄(hSnap);
返回procId;
}
uintptr_t GetModuleBaseAddress(DWORD procId,常量字符*modName)
{
uintpttr_t modBaseAddr=0;
HANDLE hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32,procId);
if(hSnap!=无效的\u句柄\u值)
{
MODULEENTRY32 modEntry;
modEntry.dwSize=sizeof(modEntry);
if(模块32第一(hSnap和modEntry))
{
做
{
if(!\u stricmp(modEntry.szModule,modName))
{
modBaseAddr=(uintptr_t)modEntry.modBaseAddr;
打破
}
}while(module32下一步(hSnap和modEntry));
}
}
闭合手柄(hSnap);
返回modBaseAddr;
}
int main()
{
DWORD procId=GetProcId(“PathOfExile_x64.exe”);
uintpttr_t modBase=GetModuleBaseAddress(procId,“PathOfExile_x64.exe”);

std::cout Building as admin不应该有什么区别,但可以作为admin运行。请检查MSDN中使用的函数,特别是它们表示错误的方式。在那里,您还应该找到
psapi
作为必须链接的库的名称。基址不应该转换为DWORD。阅读编译器警告s、 数据转换过程中是否有错误?
GetHandle
返回一个
nullptr
,除非您以足够的权限运行代码。您需要这些权限,因为您请求
process\u ALL\u ACCESS
时没有明显的原因。调试代码和处理错误都会导致他马上就离开了。即使有足够的特权,我仍然得到了错误的基址。以管理员身份构建不会有什么区别,但可以以管理员身份运行。请查看MSDN中使用的函数,特别是它们表示错误的方式。在那里,您还应该找到
psapi
作为您拥有的库的名称链接到。基址不应强制转换为DWORD。读取编译器警告。在数据转换过程中是否有错误?
GetHandle
返回
nullptr
,除非您以足够的权限运行代码。您需要这些权限,因为您正在请求

#define WINVER 0x0501
#include <iostream>
#include <cstdio>
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <Psapi.h>
#include <tlhelp32.h>

using namespace std;

HANDLE GetHandle()
{
    string name = "PathOfExile_x64.exe";
    DWORD pid = 0;

    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 process;
    ZeroMemory(&process, sizeof(process));
    process.dwSize = sizeof(process);

    if (Process32First(snapshot, &process))
    {
        do
        {
            if (string(process.szExeFile) == name)
            {
               pid = process.th32ProcessID;
               break;
            }
        } while (Process32Next(snapshot, &process));
    }

    CloseHandle(snapshot);

    if (pid != 0)
    {
        cout << "pid = " << pid << endl;
        return OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    }


    return NULL;
}

HMODULE GetModule()
{
    HMODULE hMods[1024];
    HANDLE pHandle = GetHandle();
    DWORD cbNeeded;
    unsigned int i;

    if (EnumProcessModules(pHandle, hMods, sizeof(hMods), &cbNeeded))
        {
        for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
        {
            TCHAR szModName[MAX_PATH];
            if (GetModuleFileNameEx(pHandle, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR)))
            {
                string wstrModName = szModName;

                string wstrModContain = "PathOfExile_x64.exe";
                if (wstrModName.find(wstrModContain) != string::npos)
                {
                    CloseHandle(pHandle);
                    return hMods[i];
                }
            }
        }
    }
    return nullptr;
}


int main()
{
    HWND WindowHandle = FindWindow(nullptr, "Path of Exile");
    DWORD PID;
    GetWindowThreadProcessId(WindowHandle, &PID);
    PVOID hProcess = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, 0, PID);

    HMODULE Module = GetModule();
    DWORD BaseAddress = (DWORD)Module;

    cout << BaseAddress << endl;

}