静态分析 - 范围变化

逆向工程 静态分析
2021-07-05 23:36:45

我正在寻找一种算法或一些关于在对反编译的 ASM 源进行静态分析时如何找到范围变化的技巧。我需要知道跟踪堆栈使用情况和达到变量定义的范围更改。如果我有一个像

int somefunc(int b) {

// Scope 1
a = b + 1;

if(a > 0) {
  // Scope 2
  a = 0
} else {
  // Scope 3
  a = b;
}

return a;

一旦我从程序集构建了流程图,我怎么知道范围从 1-2 变化到 2-1 等?到目前为止,我唯一的猜测是它与支配地位和检查子图有关。我会看到这种方法的一些问题是具有提前终止的循环或语句,例如 break;继续; return - 他们将生成一个图表,您无法确定支配地位,也无法判断您的范围何时增加或减少。

2个回答

Marijn Haverbeke 的tern 项目解决了 JavaScript 中的范围问题(以及动态类型的相关问题)也许这对本案有很大帮助。

有效地,当您拥有反编译的源代码时,您可以使用诸如 tern 之类的东西来即时分析它作为源代码(就像在设计 tern 的 javascript 中所做的那样)

词法范围的概念仅在比汇编语言更高的语言级别中可用。编译器负责跟踪范围。一旦源代码被编译成机器码,“范围”的概念就不复存在……它只是一长串指令。