我正在寻找一种方法来判断一条指令是否为跳转指令。当然,我想避免检查所有可能的 CPU 架构的所有可能的跳转助记符。
我想可以检查所属的外部参照类型。然而,可能有几种不同的类型:Code_Near_Jump
Code_Far_Jump
而且Data_Read
(对于间接跳转)。这种方法看起来很复杂,对我来说不是很可靠。
有关call
说明,有idaapi.is_call_insn(addr)
. 跳跃有没有类似的东西?
我正在寻找一种方法来判断一条指令是否为跳转指令。当然,我想避免检查所有可能的 CPU 架构的所有可能的跳转助记符。
我想可以检查所属的外部参照类型。然而,可能有几种不同的类型:Code_Near_Jump
Code_Far_Jump
而且Data_Read
(对于间接跳转)。这种方法看起来很复杂,对我来说不是很可靠。
有关call
说明,有idaapi.is_call_insn(addr)
. 跳跃有没有类似的东西?
有关想法,请查看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
我最近使用了该技术,检查了示例是否有效。基本上,如果您可以获得指令的 VA,那么您可以在 idautils 中使用 DecodeInstruction 或 DecodePreviousInstruction。
然后你可以使用比特轨迹使用的常量,例如
COND_BRANCHES = [\
idaapi.NN_ja,\
idaapi.NN_jae,\
idaapi.NN_jb,
....
功能文档在这里 - https://www.hex-rays.com/products/ida/support/idapython_docs/