我正在寻找一种算法或一些技巧,以进行反编译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-它们将生成一个图,您无法确定主导地位,也无法分辨范围是何时增加或减小。

评论

在组装级别上没有这样的概念,简单地说:您不会知道。您当然可以遵循条件跳转,但它们可能与原始条件中的作用域不一致。基本上将C转换为汇编程序再转换为二进制程序是有损过程,在进行逆向工程时必须处理它。

#1 楼

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

有效地,当您拥有反编译的源代码时,您可以使用tern之类的东西将其作为源代码即时分析(如javascript燕鸥是设计的)

评论


不喜欢吗?但是它确实提供了一种方法来检查反编译源中变量的(静态)范围,这可能是针对javascript的(并且是开源的),但可以轻松地(大概)将其修改为其他源代码

– Nikos M.
2014年5月26日15:14

#2 楼

词汇范围的概念只能在比汇编更高的语言水平上使用。编译器负责跟踪范围。一旦将源代码编译成机器代码,“作用域”的概念就不复存在了……它只是一长串指令。