在 IDAPython 中枚举所有 XefsTo 段

逆向工程 蟒蛇
2021-06-13 03:57:26

枚举特定段中地址的所有外部参照的最佳方法是什么?我想出了一种蛮力方法(如下所示)。代码扫描段中的每个地址并检查地址的 XrefTo。

seg_list = []
for seg in Segments():
    seg_list.append(seg)

# logic will be added to remove section that are code later
seg_list.reverse()
for seg in seg_list:  
    start = SegStart(seg)
    end = SegEnd(seg)
    while start < end:
        gen_xrefs = XrefsTo(start, 0)
        for xx in gen_xrefs:
            print hex(start), hex(xx.frm)
        start += 1

如果我有多个大段,这种方法非常耗时。IDADATA XREF在手动查看数据时添加注释。这些外部参照是从 IDAPython 以可访问的方式存储的,还是有另一种更实用的方法来查找某个段的外部参照?

mem_15d:00973000                 dd 1C8h dup(0)
mem_15d:00973720 dword_973720    dd 101011Ch, 1000h      ; DATA XREF: mem_f08:00970678o
mem_15d:00973728 off_973728      dd offset off_970178    ; DATA XREF: mem_f08:off_970178o
mem_15d:00973728                                         ; mem_f08:0097017Co 

注意:不能从代码中枚举所有外部参照。

1个回答

您可以使用 idautils 模块中的 Heads 功能。所以你的代码看起来像这样:

import idautils
seg_list = []
for seg in Segments():
    seg_list.append(seg)

# logic will be added to remove section that are code later
seg_list.reverse()
for seg in seg_list:  
    start = SegStart(seg)
    end = SegEnd(seg)
    for ea in idautils.Heads(start, end):
        gen_xrefs = XrefsTo(ea, 0)
        for xx in gen_xrefs:
            print hex(ea), hex(xx.frm)