【问题标题】:C++ is there a way to find a memory adress from another application from its value?C++有没有办法从另一个应用程序的值中找到一个内存地址?
【发布时间】:2021-06-07 19:25:18
【问题描述】:

我怎样才能找到一个内存地址,然后我可以通过使用 C++ 使用该内存地址的值来更改/读取? 例如,如何通过在 Cheat Engine 中搜索一个值来找到某物的内存地址。

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

我正在使用 Windows。

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

【问题讨论】:

  • 如果您使用的是 Windows,OpenProcess 可能会有一些运气
  • 除了 Teds 评论,我建议您查看 ReadProcessMemory/WriteProcessMemory 方法。
  • 计算机通常可以防止此类事情发生,因为如果天真地允许它会成为病毒的天堂
  • ASLR 可能会毁了你的一天,祝你好运。
  • 您可以使用模块基地址加上地址来计算地址。参见例如programmersought.com/article/33851486049

标签: c++ memory allocation


【解决方案1】:

例如,您如何通过以下方式找到某物的内存地址 只是在作弊引擎中搜索一个值。

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

基本上,我们希望在进程运行时扫描进程的内存以查找给定模式。

有几种策略:

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

每种方法都有各种优点和缺点。你的问题集中在第二个。我将就如何解决这个问题给出一个高层次的看法。

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

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

我们需要一种方法来解决这个问题,并知道哪些内存范围在目标进程中是有效的。我们可以使用VirtualQueryEx 来实现。我们可以从 0 开始直到最后一个有效的用户模式内存地址(0x7FFFFFFF 用于 32 位进程,0x7FFFFFFFFFFF 用于 64 位进程)。如果我们有一个有效的范围,我们用ReadProcessMemory 读取它。如果它无效,我们检查下一页。如果我们设法阅读它,我们现在可以搜索我们的模式。

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

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

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

【讨论】:

    猜你喜欢
    • 2021-11-18
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    相关资源
    最近更新 更多