如何在我的脚本中获取 IDA 字符串窗口中的字符串列表?

逆向工程 艾达 蟒蛇
2021-06-30 01:30:52

我正在尝试编写一些脚本,通过 IDA 中的反汇编进行一些字符串搜索。目前,我遍历所有反汇编,从 MinEA() 到 MaxEA() 并使用 idc.FindText() 来查看潜在的字符串是否在反汇编中。虽然这有效,但非常耗时。我想知道是否有一种方法可以使用 API 方法来获取 IDA 字符串窗口中的所有字符串。例如,我能够通过使用 idaapi.get_import_module_qty() 和 idaapi.enum_import_names(i, import_call_back) 获取导入窗口中使用的所有导入。这非常快,我可以轻松地检查是否已导入某些内容。是否有类似的东西可以让我从字符串窗口中获取所有字符串?如果没有,是否有一种更省时的字符串搜索方法?感谢您提供任何意见。

3个回答

看起来您正在寻找以下内容或至少是类似的内容:

import idautils
sc = idautils.Strings()

for s in sc:
    print "%x: len=%d type=%d -> '%s'" % (s.ea, s.length, s.type, str(s))

在 IDA 6.8, 64 位上测试和工作。关于 idautils 模块中的类 Strings 的详细信息在这里:https ://www.hex-rays.com/products/ida/support/idapython_docs/idautils.Strings-class.html

获取所有字符串的另一种变体

import idaapi as ia
sc = ia.string_info_t()
for i in range(0,ia.get_strlist_qty()):
    ia.get_strlist_item(i,sc)
    print ia.get_ascii_contents(sc.ea,sc.length,sc.type)

我找到了一个粗略但完全不同的解决方案,而不必弄乱 Python 2.7 。全部使用 IDA GUI 并借助正则表达式

  1. 在 IDA 中打开所需的文件,让它加载
  2. 视图 -> 打开子视图 -> 字符串
  3. Ctrl+A -> 右键单击​​ -> 复制
  4. 将数据粘贴到一些支持正则表达式的文本编辑器(我使用 Notepad++)
  5. 使用正则表达式进行查找和替换(在 Notepad++ 上:替换,搜索模式“正则表达式”为“. 匹配换行符”未勾选):
  • 首先,在回车前修剪所有“”,
    ___Find: \x20\x20+\r
    Replace: \r
    
  • 然后(截至 2021 年 1 月)- 在 Notepad++ 中,有一个错误,这使它^regex match literal \r要解决这个问题,您可以这样做:在顶部添加一个换行符(如果顶部有无用的人类可读标题,请用换行符替换)。计算字符串文本开始之前有多少个字符(我有27 个),然后执行,
    ___Find: \n.{27}?
    Replace:        
    

警告:如果在字符串文本开始之前您有不同的字符数,请用您的数字替换该数字!

  1. 最后,删除第一个换行符,您的数据就可以工作了