Memory 在内存中定位堆栈/堆变量

Memory 在内存中定位堆栈/堆变量,memory,stack,reverse-engineering,computer-forensics,volatility,Memory,Stack,Reverse Engineering,Computer Forensics,Volatility,我目前正在尝试热补丁程序(根据发布的补丁更新程序内存中的代码和数据) 假设我们可以停止一个正在运行的程序,并进行修补。如果补丁更改了一些数据初始化或赋值,我们怎么知道变量在哪里,比如堆栈或堆中的变量 例如: 修补程序之前: void func() { int a = 1; } 修补后: void func() { int a = 2; } 打补丁时,我们如何知道a在堆栈中的位置(或者可能不在堆栈中)?除非您对编译器的工作方式有很多了解,否则您无法事先知道这些变量存储在何处

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

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


例如:

修补程序之前:

void func() {
    int a = 1;
}
修补后:

void func() {
    int a = 2;
}


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

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


通过检查生成的代码,您可能能够了解特定编译程序的运行情况。

如果我们知道一个编译器是如何工作的,那么如何在运行时从内存中获取它们?与内存取证一样,我们不必知道先验知识。如果可以使用合理的调试器检查目标代码,那么显然可以使用相同的调试器检查变量的值。这是很明显的。我建议你去学习如何编写汇编程序,然后学习如何使用调试器。这对你来说也是显而易见的,我建议你在这种情况下修补初始化指令;在堆栈中定位变量是不可靠的(依赖于编译器;还有一些优化会使事情更难处理)。这个解决方案可以接受吗?