在C+中查找PID和基址+; 我试图编写一个C++代码,它显示了一些应用程序的进程ID和基地址,PID看起来正确,但是基地址是0,这是不正确的。我的问题是-这里怎么了
IDE:代码::块 此外,为了使它能够正常运行,我必须在中设置“-lpsapi” 设置->编译器->链接器设置->其他链接器选项 我曾考虑将其构建为admin,但在Code::Block中找不到这样的选项(可能是内置的?)在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=
#定义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;
}