我如何在IDA中检测/标记递归函数?

私有方法是检查每个函数的调用列表,如果调用了自身,则它是递归的。我想发表评论或某种指示器,以帮助我区分这些功能。

#1 楼

这不是一件容易的事。如果不考虑间接调用(例如C ++中的虚函数)和来自另一个函数的调用,则可以相对容易地实现:
int f() {
    g();
}

int g() {
    f();
}

您的函数位于另一个二进制文件中(例如dll)。因此,有两种方法可以执行此操作,即静态方法和动态方法。

递归程序集遍历-静态分析方法
您应该在IDAPython中编写通过函数的脚本,
,并递归处理每个调用。如果在收集的堆栈中找到当前函数,则该函数是递归的。
非常简单的变体如下所示: IDAPython可以识别所有函数序言并过滤掉所有不调用任何内容的函数。
在每个收集的序言上放置断点并运行程序。
每次程序停止时,请使用IDAPython分析程序栈为了找到功能,您在堆栈中停了下来。如果找到它,则该函数是递归的。

#2 楼

我缺乏9个声誉点,所以可悲的是我无法评论w_s的出色回答。 ;)

为了完整起见,所描述的概念在图论中称为“ Tarjan算法”,用于查找强连接的组件。

维基百科有一个很好的动画,可以帮助您遵循以下步骤。

为了研究,这是另一个(更正式的)Python实现,它是我用来在IDAscope中的函数中查找循环的那个,但很容易用于查找递归函数。

评论


就我个人而言,我认为您的想法不只是评论,还是应该作为答案。因此,不要为此感到难过。 :)

–恐怖
2014年1月21日8:50

现在您有了自己的声誉点并可以发表评论了:)

– w s
2014年1月21日在8:52