我正在尝试使用
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
看我是否犯了错误但它是一回事,它没有找到存储这个局部变量值的地址:
在
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的动态变量的地址,没有任何问题:
现在我们来谈谈我发表这篇文章的原因。 我只找到了一种方法来从我的攻击过程和 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
}
当我打印受害进程中变量的地址时,就好像这让这个以前不在任何进程地址中的局部变量突然出现了。
我的问题是:
为什么当我打印局部变量的地址时,值 1234 是否出现在受害进程的地址之一中,通常情况下,即使不打印地址,该值仍应存储在受害进程的地址之一中进程的地址?
为什么查找动态变量的地址与查找局部变量的地址不是同一个问题?