获取进程的基址
Get base address of process
我想访问进程的某个地址。但为此,我需要首先获取进程的基址。我正在使用一个工具来查看我是否真的做对了。该工具显示我需要以下内容:"app.exe"+0x011F9B08 = 0x119F8300
以为我可以通过OpenProcess()
获取进程的基址,但这给了我:结果0x0000005c
。我觉得不对吗?至少,不是我需要的。
我认为我需要的基址是:0x119F8300 - 0x011F9B08 = 0x107FE7F8 <-- base?
这是我的代码:
hWindow = FindWindow(NULL, lpWindowName);
if(hWindow)
{
GetWindowThreadProcessId(hWindow, &dwProcId);
if(dwProcId != 0)
{
// hProcHandle -> 0x0000005c
hProcHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcId);
}
else
{
return 0;
}
}
如何获取已打开的进程的基址?
如果要
在其他进程的地址空间中获取虚拟地址,可以这样做:
- 使用
OpenProcess
打开进程 -- 如果成功,返回的值是进程的句柄,它只是内核用来标识内核对象的不透明令牌。 它的确切整数值(在您的情况下0x5c)对用户空间程序没有任何意义,除了将其与其他句柄和无效句柄区分开来。 - 调用
GetProcessImageFileName
以获取进程的主可执行模块的名称。 - 使用
EnumProcessModules
枚举目标进程中所有模块的列表。 - 对于每个模块,调用
GetModuleFileNameEx
以获取文件名,并将其与可执行文件的文件名进行比较。 - 找到可执行文件的模块后,调用
GetModuleInformation
以获取可执行文件的原始入口点。
这将为您提供虚拟地址,但您无法使用它做很多事情,因为它没有映射到当前进程的地址空间中。
我想
详细阐述一下罗森菲尔德@Adam答案。我将在这里以英雄联盟为例。
为了打开进程(获取句柄),我们需要它的PID(进程ID)。我们可以通过窗口句柄(HWND)来做到这一点,因为通常窗口的标题是已知的
//You will need to change this the name of the window of the foreign process
HWND WindowHandle = FindWindow(nullptr, L"League of Legends (TM) Client");
DWORD PID;
GetWindowThreadProcessId(WindowHandle, &PID);
PVOID hProcess = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, 0, PID);
现在我们能够掌握该过程,让我们继续
HMODULE Module = GetModule();
DWORD BaseAddress = (DWORD)Module;
获取模块函数
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)))
{
wstring wstrModName = szModName;
//you will need to change this to the name of the exe of the foreign process
wstring wstrModContain = L"League of Legends.exe";
if (wstrModName.find(wstrModContain) != string::npos)
{
CloseHandle(pHandle);
return hMods[i];
}
}
}
}
return nullptr;
}
就我个人而言,我喜欢编写 2 个单独的函数,一个用于获取句柄,一个用于获取模块。
好了,我们成功地获得了一个外来进程的基址。
相关文章:
- 每次使用带有LOCK_EX标志的LOCK_NB时,相同的程序/进程都会获取锁
- 如何获取进程以设置其亲和力?
- 从两个 4x64 位整数数组中获取取模
- 如何获取进程的整数PID?
- 获取特定进程的句柄数
- 如何使用 c++ libboost 运行进程并获取其输出?
- 从 c++ 中的实例化进程获取输出的可靠方法是什么?
- 如何从进程获取实时、非阻塞输出
- 从创建进程创建的进程获取输出
- 在Win 7中从远程进程获取PEB
- 从其他进程获取 CoGetClassObject
- 从x64进程获取另一个进程的32位PEB
- 从x64进程获取函数表
- 从非子进程获取退出代码
- 从Linux中的非子进程获取退出代码
- 从另一个进程获取 win32 线程的起始地址
- 从其他进程获取模块句柄
- 从32位进程获取64位进程内存的入口点
- 如何从子进程获取状态信息以度量资源利用率
- C++在没有OpenProcess()的情况下从进程获取句柄