访问直接内存地址并在C++中获取值

llk*_*llk 16 c++ memory pointers memory-address

我想知道是否可以使用C/C++访问直接的内存块并获取值.例如:

int i = 15;
int *p = &i;
cout << &i;
Run Code Online (Sandbox Code Playgroud)

如果我在这里取印刷值,那将给我变量i的地址,其中包含值15.我只是说它为本例打印出0x0ff9c1.如果我有一个单独的程序声明一个像这样的指针...

int *p = 0x0ff9c1;
cout << *p;
Run Code Online (Sandbox Code Playgroud)

是否有可能打印出另一个应用程序放在内存块0x0ff9c1中的15?我知道我的指针声明与内存地址不正确,我不知道如何做到这一点.我尝试过使用memcopy但是我也无法使用它.我知道这是可能的,因为我有一个名为Cheat Engine的程序,它修改游戏内存地址值以获得不公平的优势.我已成功放置打印的内存位置并通过Cheat Engine获取值(15).我的目标是使用C++来做到这一点.如果这太混乱了,基本上我想访问另一个应用程序使用其内存地址存储的变量并打印出该值.如果重要的话,我正在使用Windows 7 x64和MinGW编译器.谢谢!

PS:我会张贴一张Cheat Engine的图片,以提供更好的主意. 在此输入图像描述

Ed *_*eal 6

这两个进程具有单独的地址空间.除非是明确共享内存,否则一个进程无法访问另一个进程内存.

  • 感谢downbote.像调试器这样的东西将自己附加到进程,因此能够访问该进程的所有内存.@paul - 我认为有人应该阅读有关分页,虚拟内存,分段和进程地址空间的内容. (2认同)
  • @Paul:放松一下.我只是说我认为这不是一个好的答案,尽管答案正在通过对这个答案的评论的杂音进行分散,我们对答案本身的文本进行上/下投票.如果它被重构,我会赞成它,所以答案文本给出了完整的故事,但在那之前,我对"不可能"的答案文本被接受感到非常沮丧.我没有用零来回答问题的习惯是一个单独的问题,它更多地与我觉得我没有看到那些只是试图提供帮助的人的净声誉惩罚点,即使是很差. (2认同)

Hos*_*ork 5

你不能在C++中以平台无关的方式做到这一点.虽然我没有专门使用这个"作弊引擎",但它几乎肯定使用调试器使用的相同特殊API.代码将特定于Windows,您将需要在运行过程中具有特定权限级别.

(例如,如果您使用Visual Studio并在调试模式下从中执行程序,则Visual Studio可以查看并修改该程序中的值.)

我有一段时间没有编写调试器,所以我不知道在Debug API上开始的好地方在哪里,但你可以在网上搜索这篇文章:

http://www.woodmann.com/fravia/iceman1.htm