在 ARM 二进制文件中使用 IDA python 提取条件指令

逆向工程 艾达 蟒蛇 手臂 Python
2021-07-03 12:09:58

在使用 IDA Python 提取 ARM 指令时,我注意到有些指令没有完全提取。例如,条件指令如BCSBCC打印为B为了分析,我们需要完整的说明。

这是我使用的代码:

import idautils
import idc
import idaapi
for seg_ea in Segments():
 for head in Heads(seg_ea, SegEnd(seg_ea)):
  if isCode(GetFlags(head)):
   disasm= GetMnem(head)

有没有办法纠正这个问题?

1个回答

我能够在IDA 6.95上重现您的问题,但似乎这个错误已在IDA 7中修复,因为它对我来说很好用。下面的解决方案将与 IDA 6.95 相关,尽管它可能对早期版本的IDA Pro有效

让我们从描述我们面临的死锁开始:
有问题的函数GetMnem, 被声明在IDA 6.95\Python\idc.py:L2280,看起来像这样:

def GetMnem(ea):
    """
    Get instruction mnemonics

    @param ea: linear address of instruction

    @return: "" - no instruction at the specified location

    @note: this function may not return exactly the same mnemonics
    as you see on the screen.
    """
    res = ida_ua.ua_mnem(ea)

    if not res:
        return ""
    else:
        return res

注意函数中的以下免责声明:

@注意:此函数可能不会返回与您在屏幕上看到的完全相同的助记符。

似乎我们的问题符合免责声明——我们没有看到与屏幕上看到的相同的助记符。

如您所见,GetMnem它基本上是另一个函数的包装器——ua_mnem在 中声明IDA 6.95\Python\ida_ua.py:L319

def ua_mnem(*args):
  """
  ua_mnem(ea) -> char const *
  """
  return _ida_ua.ua_mnem(*args)

好吧,似乎ua_mnem是另一个位于IDA 6.95\python\lib\python2.7\lib-dynload\ida_64\_ida_ua.pyd. 一个pyd文件实际上是一个DLL文件,不应该很容易反转。因此,我们无法查看或编辑源代码,因此无法修复问题。

解决方法来了:GetMnem您可以简单地通过使用GetDisasm和拆分行来仅获取指令来模仿它,而不是使用

import idautils
import idc
import idaapi
for seg_ea in Segments():
 for head in Heads(seg_ea, SegEnd(seg_ea)):
  if isCode(GetFlags(head)):
    mnem = GetMnem(head)
    if (mnem[0]=='B'):
        mnem = GetDisasm(head).split()[0]
    print mnem

在这种情况下,我们检查助记符是否是分支指令(以“B”开头),如果是,我们使用助记符 fromGetDisasm和 not from GetMnem当然,您需要更好地测试此解决方案,并可能处理一些特定情况。