我目前可以想到IDA中的两种方法:
寻找助记符列表(更好:特定的操作码?),例如对于x86,请参见此处,并将它们每个人手动映射到
read
和write
。使用idc.GetOpType(ea, n)
函数并检查相关的o_*
常量(请参见此处),即:记忆。是否有更好的方法找出我想要的东西?理想情况下是一种适用于多种CPU架构的方法吗?
#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之外使用(特别是有
STM
和LDM
指令)。#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
评论
是否需要使用IDA?您要进行静态或动态分析吗?@TaThanhDinh:静态分析。 IDA很好,但是如果有其他方法,那也很好。
在这种情况下,您可能会发现Xed很有用。它提供了高级API来确定一条指令可以读取还是写入存储器。我不知道Capstone是否具有类似的API。
听起来是个好计划。