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



本主题关于使用 C++查找另一个进程的变量。

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

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

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

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

根据EntryPointSizeOfImage,我正在了解我的测试程序的内存分配有多大。例如,内存分配从16 000 000开始,以17 500 000结束 - 这是(据我所知(分配我测试的所有内容的范围.exe所以我用for循环扫描它寻找变量,我成功地找到了它,任何全局变量,它只需要不到一秒的时间。

但是我在那个测试范围内找不到.exe我的局部变量,我手动将扫描开始位置从16 000 000更改为 0,我在虚拟内存中找到我的本地变量,位置为 3 000 000 .

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

我花了大量的时间来寻找答案,但在谷歌中主要是关于简单的东西,比如读/写内存,很少举例说明如何找到全局变量,但没有关于局部或堆变量的例子。拜托,我希望有一些有经验的人知道如何找到局部变量的分配。

局部变量在调用包含它们的函数期间"存在",因此话虽如此,无法判断它被放置在哪个堆栈帧中。您可以在本文中阅读有关局部变量和全局变量的更多信息

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

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

另一个提示是,如果您无法找到正在扫描的值,则可能会发生该进程将值保留在内存中的编码/加密。然后尝试一种"已改变"的方法来识别这些区域。

狩猎愉快!

最新更新