C++ 有没有办法从另一个应用程序的值中找到内存地址?

C++ is there a way to find a memory adress from another application from its value?

如何通过使用 C++ 使用该内存地址的值找到一个内存地址,之后我可以 change/read? 例如,如何通过在 Cheat Engine 中搜索一个值来找到某物的内存地址。

我在 Google 上搜索了大约一个小时,但我仍然找不到任何对我有用的东西。

我正在使用 Windows。

抱歉,如果我有任何拼写错误或语法问题,我的主要语言不是英语。

For example like how you can find the memory adress of something by just searching up a value in Cheat Engine.

所以你想要的是知道在进程中可以找到某些东西的内存地址。例如,假设 notepad.exe 在内存中某处有字节 68 65 6c 6c 6f,我们想找出位置。

基本上我们想要在进程处于 运行.

时扫描给定模式的进程的内存

有几个策略:

  1. 我们在 notepad.exe 中注入一个 DLL 并从该 DLL 进行扫描;
  2. 我们从另一个进程远程扫描内存

每种方法各有利弊。你的问题集中在第二个。我将对如何解决这个问题给出一个高层次的看法。

首先,每个进程都有自己的地址space。这意味着 notepad.exe 中的地址 A 和 paint.exe 中的地址 A 将指向不同的事物,或者甚至可能在两个进程中都无效。有关详细信息,请参阅 this 页面。

还有 ASLR,它随机化内存地址,但在这种情况下这不是什么大问题。

我们需要一种方法来解决这个问题,并了解目标进程中哪些内存范围是有效的。我们可以用 VirtualQueryEx. We can start from 0 and go up to the last valid user mode memory address (0x7FFFFFFF for 32-bit processes, 0x7FFFFFFFFFFF for 64-bit processes). If we have a valid range, we read it with ReadProcessMemory 来完成。如果无效,我们检查下一页。如果我们设法阅读它,我们现在可以搜索我们的模式。

我们可以跳过 VirtualQueryEx 调用并盲目地为每个可能的页面尝试 ReadProcessMemory,但是,特别是对于 64 位进程,这可能需要相当长的时间。 VirtualQueryEx 返回的信息可用于根据我们要查找的内容过滤掉一些范围。

请注意,为了做到这一点,我们需要能够使用 OpenProcess with the PROCESS_QUERY_INFORMATION and PROCESS_VM_READ access rights 打开目标进程的句柄。

我们可能会遇到一些问题:在我们的查询和读取之间存在一个时间范围,目标进程的内存布局可能会在该时间范围内发生变化。我们必须为此做好准备。一般来说,读取会失败,我们忽略即可。或者目标进程可能正在积极地试图阻止我们:也许我们无法用所需的权限打开它的句柄,也许有一些反作弊技术,等等。在我们尝试之前没有办法知道。