【问题标题】:Locate stack/heap variables in memory在内存中定位堆栈/堆变量
【发布时间】:2025-12-27 04:20:22
【问题描述】:

我目前正在尝试对程序进行热补丁(根据已发布的补丁更新程序内存中的代码和数据)。

假设我们可以停止一个正在运行的程序,然后打补丁。如果补丁改变了一些数据初始化或赋值,我们怎么知道变量在哪里,比如堆栈或堆中的变量?


例子:

补丁前:

void func() {
    int a = 1;
}

补丁后:

void func() {
    int a = 2;
}

在打补丁的时候,我们怎么知道a在堆栈中的位置(或者可能不在堆栈中)?

【问题讨论】:

  • 我建议你在这种情况下修补初始化指令;在堆栈中定位变量是不可靠的(依赖于编译器;还有一些优化可以使事情更难处理)。这种解决方案可以接受吗?

标签: memory stack reverse-engineering computer-forensics volatility


【解决方案1】:

除非您对编译器的工作原理有很多了解,否则您无法先验地知道这些变量的存储位置,甚至它们是如何表示的。每个编译器设计者都会为变量的存储方式/位置制定自己的规则。

您可以通过检查生成的代码找出特定的编译程序。

【讨论】:

  • 如果我们知道一个编译器是如何工作的,如何在运行时从内存中获取它们?与记忆取证一样,我们不必先验知识。
  • 如果您可以使用合理的调试器检查目标代码,那么您显然可以使用相同的调试器检查变量的值。这很明显。我建议你去学习如何编写一些汇编程序,然后学习如何使用调试器。那么这对你来说也是显而易见的。