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