如何找到在本地范围内声明的变量的地址?

时间:2018-08-27 18:48:22

标签: c++ visual-studio winapi visual-studio-2017

有关使用c ++查找另一个进程的变量 的主题。

问题是-我不知道如何在虚拟内存中找到分配局部变量的位置。我已经成功找到了以下变量:

  1. 在全球范围内声明
  2. 任何静态变量

使用WINAPI函数GetModuleInformationMODULEINFO,我正在获取有关所选进程的可执行文件的开始位置和结束位置的信息(EntryPoint开始,而SizeOfImage-结束) 。因此,使用for循环,我可以找到另一个程序的任何变量,例如毫秒。

但是问题是-它仅适用于全局变量和静态变量。我使用测试程序测试了所有内容,这些程序只有2个变量(1个全局变量,main函数内部1个变量)和cout's变量。这是外观的示例。

根据EntryPointSizeOfImage,我正在了解测试程序的内存分配量。例如,内存分配开始于16 000 000并结束于17 500 000-(据我了解)我的test.exe的所有内容都在其中分配,所以我用{{1 }}循环寻找变量,然后我成功找到了任何全局变量,并且花费的时间少于第二个。

但是我在test.exe的范围内找不到我的局部变量,我手动将扫描开始位置从for更改为0,并且我在虚拟内存中的3号位置找到了局部变量000 000。

为什么将该变量放在该位置,而不放在程序所有变量应位于的.exe范围内。

我已经花费了大量的时间来寻找答案,但是在Google中,大多数内容都是关于简单的东西(例如读/写内存),很少有关于如何找到全局变量的示例,而与本地或堆变量无关。拜托,我希望有一些有经验的人知道如何找到局部变量的分配。

2 个答案:

答案 0 :(得分:1)

局部变量在包含它们的函数的调用过程中“存在”,因此,无法说出将其放置在哪个堆栈帧中。您可以在此Article

中了解有关本地和全局变量的更多信息

答案 1 :(得分:0)

我认为您正在尝试编写/测试内存扫描仪,也许是为了玩游戏。在这种情况下,通常所讨论的变量不是局部变量,而是全局变量或堆上的变量。我建议您确保它是您要查找的局部变量。

另一件事是,您可能需要使用虚拟内存API(例如Virtualxxx函数)扫描额外的内存。因为我相信并非所有领域都在PE的地址范围内。因此,扫描内存中的PE文件只会为您提供展开的图像。

另一个提示是,如果您找不到要扫描的值,则可能会通过该过程将值编码/加密保留在内存中。然后尝试一种“已更改”的方法来识别那些区域。

打猎愉快!