如何解决C++ 有没有办法从另一个应用程序的值中找到内存地址?
我怎样才能找到一个内存地址,然后我可以通过使用 C++ 仅使用该内存地址的值来更改/读取该内存地址? 例如,如何通过在 Cheat Engine 中搜索一个值来找到某事物的内存地址。
我在 Google 上搜索了大约一个小时,但仍然找不到任何对我有用的东西。
我使用的是 Windows。
抱歉,如果我有任何拼写错误或语法问题,我的主要语言不是英语。
解决方法
例如,如何通过以下方式找到某事物的内存地址 只是在作弊引擎中搜索一个值。
所以你想要的是知道在进程中可以找到某些东西的内存地址。例如,假设 notepad.exe 在内存中的某处有字节 68 65 6c 6c 6f
,我们想找出其中的位置。
基本上,我们希望在进程运行时扫描进程内存中的给定模式。
有几种策略:
- 我们在 notepad.exe 中注入一个 DLL 并从该 DLL 进行扫描;
- 我们从另一个进程远程扫描内存
每种方法都有各种优点和缺点。你的问题集中在第二个。我将就如何解决这个问题给出一个高层次的看法。
首先,每个进程都有自己的地址空间。这意味着 notepad.exe 中的地址 A
和paint.exe 中的地址 A
将指向不同的内容,甚至可能在两个进程中都无效。有关详细信息,请参阅 this 页。
还有 ASLR,它可以随机化内存地址,但在这种情况下这不是什么大问题。
我们需要一种方法来解决这个问题,并知道目标进程中哪些内存范围是有效的。我们可以用 VirtualQueryEx 做到这一点。我们可以从 0 开始,直到最后一个有效的用户模式内存地址(0x7FFFFFFF
用于 32 位进程,0x7FFFFFFFFFFF
用于 64 位进程)。如果我们有一个有效的范围,我们用 ReadProcessMemory 读取它。如果它无效,我们检查下一页。如果我们设法阅读它,我们现在可以搜索我们的模式。
我们可以跳过 VirtualQueryEx
调用,对每个可能的页面盲目尝试 ReadProcessMemory
,但是,尤其是对于 64 位进程,这可能需要相当长的时间。 VirtualQueryEx
返回的信息可用于根据我们要查找的内容过滤掉一些范围。
请注意,为了做到这一点,我们需要能够使用 OpenProcess 以及 PROCESS_QUERY_INFORMATION
和 PROCESS_VM_READ
access rights 打开目标进程的句柄。>
我们可能会遇到一些问题:在我们的查询和我们的读取之间有一个时间范围,在这个时间范围内目标进程的内存布局可以改变。我们必须为此做好准备。一般来说,读取会失败,我们可以忽略它。或者目标进程可能正在积极地试图阻止我们:也许我们无法使用所需的权限打开它的句柄,也许有一些反作弊技术到位,等等。在我们尝试之前无法知道。>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。