是否可以使用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))
过滤掉某些或所有部分中的非数据偏移量。#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
评论
+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