枚举所有外部参照到特定段中地址的最佳方法是什么?我想出了一种蛮力方法(如下所示)。该代码扫描段中的每个地址,并检查该地址的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


如果我有多个较大的细分,这种方法非常耗时。手动查看数据时,IDA添加DATA 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)


评论


我认为idautils.Heads仅用于代码。感谢你的回答。

– alexanderh
2014年2月12日19:11

可能有对非头地址的外部参照,例如对未定义数据的外部参照,或对结构的外部参照。

–威廉·亨格维尔德(Willem Hengeveld)
2014年3月27日19:30