我想确定一条指令a)读取还是b)写入内存地址。
我目前可以想到IDA中的两种方法:



寻找助记符列表(更好:特定的操作码?),例如对于x86,请参见此处,并将它们每个人手动映射到readwrite。使用idc.GetOpType(ea, n)函数并检查相关的o_*常量(请参见此处),即:记忆。


是否有更好的方法找出我想要的东西?理想情况下是一种适用于多种CPU架构的方法吗?

评论

是否需要使用IDA?您要进行静态或动态分析吗?

@TaThanhDinh:静态分析。 IDA很好,但是如果有其他方法,那也很好。

在这种情况下,您可能会发现Xed很有用。它提供了高级API来确定一条指令可以读取还是写入存储器。我不知道Capstone是否具有类似的API。

听起来是个好计划。

#1 楼

尽管API可能很麻烦,但是在静态分析期间,您正在寻找的大多数信息都可以从IDA轻松获得。其中有些是通用的,而其他部分则需要针对每种处理器类型进行不同的处理。 />
import idaapi
import idautils
import idc

OPND_WRITE_FLAGS = {
    0: idaapi.CF_CHG1,
    1: idaapi.CF_CHG2,
    2: idaapi.CF_CHG3,
    3: idaapi.CF_CHG4,
    4: idaapi.CF_CHG5,
    5: idaapi.CF_CHG6,
}

OPND_READ_FLAGS = {
    0: idaapi.CF_USE1,
    1: idaapi.CF_USE2,
    2: idaapi.CF_USE3,
    3: idaapi.CF_USE4,
    4: idaapi.CF_USE5,
    5: idaapi.CF_USE6,
}

def print_insn_mem_interaction(ea):
    insn = idautils.DecodeInstruction(ea)

    # The features are needed for operand flags.
    feature = insn.get_canon_feature()

    for op in insn.Operands:
        # You always get 6 operands. Some of them are set to `o_void` to indicate
        # that they are not used.
        if op.type == idaapi.o_void:
            break

        # There are 3 types of memory references in IDA. We want all 3.
        is_mem = op.type in (idaapi.o_mem, idaapi.o_phrase, idaapi.o_displ)

        # Extract per-operand read/write status from the feature.
        is_write = feature & OPND_WRITE_FLAGS[op.n]
        is_read = feature & OPND_READ_FLAGS[op.n]

        if not is_mem:
            # Operand does not access memory.
            continue

        # Ugly line for the display. Sorry.
        action = 'memory {}'.format('/'.join(filter(bool, ('read' if is_read else None, 'write' if is_write else None))))

        print 'Operand[{}]<{}> : {}'.format(op.n, idc.GetOpnd(ea, op.n), action)


讲述访问的地址是另一回事。 ,文档会说“随您便”。)
如果您对适用于x86和x64的解析器感兴趣,则可以在此处检查我的代码。在其他任何架构上,我建议您使用对脚本更友好的反汇编程序。在这个问题上,Capstone可能是一个不错的选择。

最后,如果需要实际地址,则可能不得不转向动态分析。

#2 楼

除了动态分析(如注释中建议的那样)之外,无法从IDA获得该信息。

IDA无法维护完整的中间表示(也称为中间语言),并且该信息不可用。对IDA来说,主要是因为它不需要实施反汇编程序。但是,反编译器需要它,因此十六进制射线反编译器可能实现了更完整的IR,但使用户无法使用它。 ,它们共同达到了与原始说明相同的目标。这就使指令变成了更简单,更易于操作/处理的操作。

有提供或实现IL的开源工具,例如OpenREIL,您可以在IDA之外使用(特别是有STMLDM指令)。

#3 楼

如果您拥有IDA Pro 6.x,则解决方案非常简单:https://www.hex-rays.com/products/ida/support/tutorials/tracing.pdf

评论


对不起,我不明白你的意思。您能更具体一点吗?

–gogo大猩猩
16年2月17日在5:44

@stackoverflowwww将光标置于反汇编视图,右键菜单或主“调试器”菜单中,您将看到“添加读/写跟踪”。希望能有所帮助

–assp1r1n3
16-2-21在9:27