我想知道是否可以使用C / C ++访问直接的内存块并获取值。例如:
int i = 15;
int *p = &i;
cout << &i;
如果我在这里取印刷值,那将给我变量i的地址,其中包含值15.我只是说它为本例打印出0x0ff9c1。如果我有一个单独的程序声明一个像这样的指针......
int *p = 0x0ff9c1;
cout << *p;
是否有可能打印出另一个应用程序放在内存块0x0ff9c1中的15?我知道我的指针声明与内存地址不正确,我不知道如何做到这一点。我尝试过使用memcopy
,但我也无法让它工作。我知道这是可能的,因为我有一个名为Cheat Engine的程序,它修改游戏内存地址值以获得不公平的优势。我已成功放置打印的内存位置并通过Cheat Engine获取值(15)。我的目标是使用C ++来做到这一点。
如果这太混乱了,基本上我想访问另一个应用程序使用其内存地址存储的变量并打印出该值。如果重要的话,我正在使用Windows 7 x64和MinGW编译器。谢谢!
PS:我会张贴一张Cheat Engine所做的图片,以提供更好的主意。
答案 0 :(得分:6)
这两个进程具有单独的地址空间。除非显式共享内存,否则一个进程无法访问其他进程内存。
答案 1 :(得分:5)
你不能在C ++中以平台无关的方式做到这一点。虽然我没有专门使用这个“作弊引擎”,但它几乎肯定使用调试器使用的相同特殊API。代码将特定于Windows,您将需要在运行过程中具有特定权限级别。
(例如,如果您使用Visual Studio并在调试模式下从中执行程序,Visual Studio可以查看并修改该程序中的值。)
我有一段时间没有编写调试器,所以我不知道调试API的好地方在哪里,但你可以在网上搜索这篇文章:
答案 2 :(得分:3)
如果要更改其他进程使用的内存,一种方法是将代码注入其他进程。从那时起,你可以对其他程序的内存做任何你想要的事情,就好像它是你的拥有者一样。
搜索remote thread creation或hooking。这里有很多关于它的问题(对于初学者来说,here。)
答案 3 :(得分:1)
通常,一个程序通常不可能修改另一个程序的内存。系统竭尽全力确保这一点。如果没有,那么任何计划都不安全。在我所使用的所有Unix变体中尤其如此,但并非我所见过的所有专有操作系统。
请注意,这些规则都不适用于内核......
还有一种称为共享内存的编程范例,但你必须明确地设置它。
简短回答:你通常不能这样做。我相信你提到过windows。我对Windows一无所知,所以你的里程可能会有所不同。
答案 4 :(得分:0)
有点晚了,但你仍然可以通过DLL注入。以下是教程的链接:http://resources.infosecinstitute.com/using-createremotethread-for-dll-injection-on-windows/