我正在寻找一种判断指令是否为跳转指令的方法。当然,我想避免检查所有可能的CPU体系结构的所有可能的跳转助记符。

我认为可以检查所属的外部参照类型。但是,有几种不同的类型:Code_Near_Jump Code_Far_JumpData_Read(用于间接跳转)。这种方法对我来说看起来很复杂,并不十分可靠。

对于call指令,有idaapi.is_call_insn(addr)。跳跃有类似的东西吗?

#1 楼

有关想法,请参见https://github.com/trailofbits/mcsema/blob/master/tools/mcsema_disass/ida/get_cfg.py

这里是如何获取入口点操作码助记符的示例:

import idaapi
import idautils

ea = idaapi.get_screen_ea()  // Gets the entrypoint VA
idautils.DecodeInstruction(ea).get_canon_mnem() // e.g. push or jne


我最近使用过该技术,请检查示例工作。

然后您可以使用所使用的位的常量的常量,例如,

/www.hex-rays.com/products/ida/support/idapython_docs/

评论


您在其他平台上尝试过吗?我只是在MIPS上尝试过,但是没有用。如果看一下SDK,这些常量似乎是特定于Intel的。

–TMR232
15年6月29日在15:53

我没有,但是我认为你是正确的。请参阅此参考以获取受支持的ida处理器hex-rays.com/products/ida/support/idadoc/618.shtml MIPS所需的常量在此处hex-rays.com/products/ida/support/idapython_docs egMIPS_null = 0 MIPS_add = 1 MIPS_addu = 2

–JoeKir
15年7月16日在0:13

可悲的是,似乎唯一的方法是检测跳转外部参照。我需要检查,但是我认为当跳转到不存在的地址时可能会出现问题。检查后将更新。

–TMR232
15年7月16日在19:23