idaapi.BasicBlock返回的IDA Pro的idaapi.FlowChart()对象可以是以下类型(请参见SDK来源中的gdl.hpp):

// flow chart block types
enum fc_block_type_t
{
  fcb_normal,    // normal block
  fcb_indjump,   // block ends with indirect jump
  fcb_ret,       // return block
  fcb_cndret,    // conditional return block
  fcb_noret,     // noreturn block
  fcb_enoret,    // external noreturn block (does not belong to the function)
  fcb_extern,    // external normal block
  fcb_error,     // block passes execution past the function end
};


我能够找到除fcb_cndret以外的所有类型的示例。


条件返回块


是什么意思?有人可以举个例子吗?

#1 楼

我也不知道,所以我整理了这个小脚本,进行了一些实证分析。

import idaapi
import idc
import idautils

for f in Functions():
    fc = idaapi.FlowChart(idaapi.get_func(f))
    for bb in fc:
        if bb.type == 3:
            print "%x type: %d" % (bb.startEA, bb.type)

print "Done"


我将其扔到了多个x86和x86_64二进制文件中而没有结果。

所以,可能是这样的:


这种块很少出现
仅在其他体系结构中出现(抱歉,我在这台计算机上没有任何ARM或MIPS进行测试,对不起)
保留枚举字段以供将来使用

我只花了两美分。

更新

我用ARM二进制文件进行了尝试,发现了两个。
显然,这些是其中有条件指令修改PC寄存器的块(请参见屏幕快照)



欢呼