使用 ReadProcessMemory 从进程读取相对于基址的地址
Reading an address relative to the base address from a process with ReadProcessMemory
几年前
,我做了一些记忆阅读的东西,主要是为了好玩。当时的标准是32位。
我已经修改了现有代码以在 x64 系统上运行,但似乎无法读取相对于进程基址的地址。我的日常工作并不涉及低级编程,所以我很生疏。
简而言之:我想读取一个内存地址,相对于进程的基址,这样我就可以做一些有用的事情。
在作弊引擎中,我可以使用:
哇-64.exe + 0x173D390
阅读我的地址没有问题。
尝试模拟时,我可以确定(我认为成功(进程基址。但是,当我尝试从指针读取"地址"时,我总是收到0xCCCCCCCC。显然有些不对劲,但我正在努力寻找如何进一步调试它......
#include "stdafx.h"
#include <iostream>
#include <string>
#include <windows.h>
#include <psapi.h>
using namespace std;
UINT_PTR GetProcessBaseAddress(DWORD processID, HANDLE *processHandle);
int main()
{
HWND WindowHandle = FindWindow(nullptr, L"World of Warcraft");
DWORD PID;
GetWindowThreadProcessId(WindowHandle, &PID);
HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
if (processHandle == 0) {
cout << "Could not open process";
return 1;
}
UINT_PTR BaseAddress = GetProcessBaseAddress(PID, &processHandle);
UINT_PTR PlayerBaseAddress = (BaseAddress + 0x173D390);
UINT_PTR PlayerBase;
ReadProcessMemory(processHandle, (void *)PlayerBaseAddress, &PlayerBase, sizeof(PlayerBase, 0));
cout << "Process base: " << hex << BaseAddress << ", Player Base Address: " << hex << PlayerBaseAddress << ", Actual address: " << hex << PlayerBase << "n";
system("PAUSE");
return 0;
}
UINT_PTR GetProcessBaseAddress(DWORD processID, HANDLE *processHandle)
{
DWORD_PTR baseAddress = 0;
HMODULE *moduleArray;
LPBYTE moduleArrayBytes;
DWORD bytesRequired;
if (*processHandle)
{
if (EnumProcessModulesEx(*processHandle, NULL, 0, &bytesRequired, 0x02))
{
if (bytesRequired)
{
moduleArrayBytes = (LPBYTE)LocalAlloc(LPTR, bytesRequired);
if (moduleArrayBytes)
{
unsigned int moduleCount;
moduleCount = bytesRequired / sizeof(HMODULE);
moduleArray = (HMODULE *)moduleArrayBytes;
if (EnumProcessModulesEx(*processHandle, moduleArray, bytesRequired, &bytesRequired, 0x02))
{
baseAddress = (DWORD_PTR)moduleArray[0];
}
LocalFree(moduleArrayBytes);
}
}
}
CloseHandle(*processHandle);
}
return baseAddress;
}
编辑控制台实际输出
Process base: 7ff7395d0000, Player Base Address: 7ff73ad0d390, Actual address: cccccccccccccccc
感谢 RbMm,我不小心在 GetProcessBaseAddress 中留下了对 CloseHandle(( 的调用。删除它并将其放在 main(( 中解决了问题。
该程序似乎仅在VS中的"发布"模式下才能正确执行。
如果您只想获取EXE
的基址,则不需要枚举所有进程模块。 EXE
始终是进程中的第一个模块 - 因此足够的查询只有一个:
ULONG GetProcessBaseAddress(HANDLE hProcess, HMODULE* phmod)
{
ULONG cb;
return EnumProcessModulesEx(hProcess, phmod, sizeof(HMODULE), &cb, LIST_MODULES_DEFAULT) ? 0 : GetLastError();
}
并像这样使用
union {
HMODULE hmod;
ULONG_PTR BaseAddress;
};
ULONG err = GetProcessBaseAddress(h, &hmod);
if (!err)
{
DbgPrint("%pn", BaseAddress + 0x173D390 );
}
相关文章:
- unique_ptr相对于shared_ptr的优势是什么
- int 相对于C++中主代码的目的
- SourceAddress 是否相对于 MmCopyVirtualMemory 中的 SourceProcess?
- 加载地址 X 时,对于 Y 类型的对象没有足够的空间
- 相对于类statics的基元全局的生存期
- 如果在循环中声明了指针变量,则它是否与循环的每次传递都与相同的内存地址相关联
- 实现现有的网络接口,以相对于C 11中的Endianess定义位字段
- 如何添加相对于QTABBAR中标签的位置的小部件
- 相对于 3D 应用程序中的 Windows 消息循环的计时错误
- §12.3.2 [class.conv.fct]/1 in C++1z 相对于 C++14 发生了重大变化。有意义吗?
- 编译器告诉我它无法解析重载函数的地址.对于 switch() 语句,这意味着什么
- 相对于 cpp 不工作目录的路径
- 使用原生C++Qt相对于PyQt有什么优势?
- 打开相对于chromium.exe的文件
- msvcr100相对于msvcrt的优势
- 对于在同一地址构造两次的对象,编译器如何知道必须调用第二个析构函数
- at()函数相对于get(ch)的必要性
- unique_ptr相对于auto_ptr的优点
- c++中std::thread相对于pthread的优势
- 哈希,相对于x,y位置的多边形