我试图使用IDA python获取.data节中所有变量的列表,因为我想从IDA中提取对每个全局变量的交叉引用列表。
是否可以使用IDA python做到这一点? br />

#1 楼

尽管Sark是一个很好的库/工具,但是如果您只是在寻找一个小的实用程序脚本,则可能要避免安装它的开销。我建议您无论如何都要尝试一下。

下面的代码将无需使用任何第三方代码就能做到:

# get segment start and end EA by name
idata_seg_selector = idc.SegByName('.data')
idata_seg_startea = idc.SegByBase(idata_seg_selector)
idata_seg_endea = idc.SegEnd(idata_seg_startea)

# iterate EAs in range
for seg_ea in range(idata_seg_startea, idata_seg_endea):
  # iretate xrefs to specific ea
  for xref in idautils.xrefsto(ea):
    print("Found a cross reference {}: from {} to '.idata' variable {}".format(xref, xref.frm, seg_ea))





使用此代码,您将看到所有交叉引用,不仅是那些带有名称的交叉引用,尽管如果愿意的话,添加交叉引用也很简单。
如@ws所述,您仅会在OP请求时看到位于.data部分的变量,您应考虑包括其他与数据相关的部分(例如.idata.rodata.bss等)。另外,您可能要考虑使用idc.isData(idc.GetFlags(ea))过滤掉某些或所有部分中的非数据偏移量。


评论


+1,但有更多段可能包含全局变量,例如ELF中的.rodata和.bss

– w s
16 Sep 8'在5:46



@w就是OP要求的

– NirIzr
16 Sep 8'在6:49

@NirIzr“因为我要提取每个全局变量的交叉引用列表”。他可能对其他细分市场一无所知。

– w s
16年9月8日在7:09

@ws谢谢,已编辑,以包括您的评论和可能的通用解决方案。

– NirIzr
16年8月8日在15:13

有没有办法做到这一点并获得全球名称? (dword _ #########)

–bravosierra99
19-10-21在18:47

#2 楼

有几种方法可以做到这一点。我正在使用Sark,因为它使编码更加容易。

这里的第一个选择是遍历IDA的名称列表,并按地址过滤。第二个是遍历段中的所有行,并显示带有名称的行。在大多数情况下,最好使用第一个。


进口鲨鱼
导入idautils

# First option - names list
def get_segment_names(name):
    seg = sark.Segment(name=name)
    for ea, name in idautils.Names():
        if seg.startEA <= ea < seg.endEA:
            yield ea, name


# Second option - iteration over lines
def get_segment_names2(name):
    seg = sark.Segment(name=name)
    for line in seg.lines:
        if line.has_name:
            yield line.ea, line.name


要使用它们,只需传递段的名称即可:

for ea, name in get_segment_names('.data'):
    print '{} at 0x{:x}'.format(name, ea)


现在,如果要使用外部参照,则可以稍后执行以下操作:



并获取变量的所有外部参照。

评论


表示对Sark表示支持:)

– NirIzr
2016年9月7日在22:20