C++读取进程局部变量的奇怪方式

问题描述 投票:0回答:0

我正在尝试使用

ReadProcessMemory
函数从攻击进程中读取受害进程的一个简单局部变量,但我只在一个非常麻烦和有问题的情况下成功了。

这里是受害者处理器的代码:

int main()
{
    int a = 1234;      //local variable to be read
    for(;;){}          //loop to avoid closing the process
}

我知道这个变量是本地的,它存储在进程的当前线程堆栈中,我知道如何在需要时读取进程的所有地址,请参阅:C++ read all memory from process within modulesize,以及:进程的读取进程内存不会返回所有内容

问题是,当我在

release
模式下运行这段代码并尝试检索值时,即使我从攻击进程中读取了受害者进程的所有地址,也根本找不到。

我检查了

CheatEngine
看我是否犯了错误但它是一回事,它没有找到存储这个局部变量值的地址:

image of variable

process Hacker
的帮助下,我检索了不同的进程地址以检查它们:

image of process hacker

但还是没有。

但是,如果我将此变量声明为动态变量以将其存储在堆中:

int main()
{
    int* a = new int;    // Request memory for the variable
    *a = 1234;           // Store value at allocated address
    for (;;) {}          //loop to avoid closing the process
}

我的攻击过程和

CheatEngine
都成功地找到了值为1234的动态变量的地址,没有任何问题:

another image

现在我们来谈谈我发表这篇文章的原因。 我只找到了一种方法来从我的攻击过程和 CheatEngine 中找到局部变量的地址,这有点令人困惑,因为我无法弄清楚为什么这个特定的添加解决了这个问题:

int main()
{
    int a = 1234;                  //local variable to be read
    std::cout << "Adrr: " << &a;   //print local variable adress
    for (;;) {}                    //loop to avoid closing the process
}

当我打印受害进程中变量的地址时,就好像这让这个以前不在任何进程地址中的局部变量突然出现了。

https://i.stack.imgur.com/jL5Aq.png

https://i.stack.imgur.com/akf5O.png

我的问题是:

  • 为什么当我打印局部变量的地址时,值 1234 是否出现在受害进程的地址之一中,通常情况下,即使不打印地址,该值仍应存储在受害进程的地址之一中进程的地址?

  • 为什么查找动态变量的地址与查找局部变量的地址不是同一个问题?

c++ winapi memory
© www.soinside.com 2019 - 2024. All rights reserved.