在 IDA 中将块声明为字符串

逆向工程 艾达 蟒蛇 加密 字符串
2021-06-11 16:44:09

我正在对一个二进制文件进行逆向工程,该二进制文件在每个字符串上都具有非常通用的标准异或 + 数学加密。我已经编写了 IDAPython 来查找每个(它们以通用方式使用)并解密它们,然后将解密的字符串添加为注释/尝试重命名变量。

不过,这并没有告诉 IDA 这些块的偏移量实际上是一个字符串。例如,它不会出现在idautils.Strings(插件必需的/我的脚本库的其余部分...)、字符串视图等中。

我想不清楚:字符串静态存储在加密块中。它们只在运行时解密,但在其他方面就像普通的字符串引用一样使用。

我可以用 IDB 中的解密结果替换加密块,但这不太理想,因为它创建的 IDB 与文件静态不是 1:1。

有没有办法告诉 IDA 将地址标识为具有特定值的字符串?

3个回答

我认为您正在寻找的 API 是 idaapi.make_ascii_string(start, len, strtype)

https://www.hex-rays.com/products/ida/support/idapython_docs/idaapi-module.html 并没有真正记录它,但是展示如何在类似情况下使用 API 的示例博客文章在这里:http: //security.my/post/38222980198/decrypting-strings-in-a-binary-with-an-idapython

我认为您应该查看这篇关于自定义数据类型和格式的博客文章这将允许您定义一种新类型的字符串并提供用于“打印”它的算法。

自定义数据类型:自定义类型基本上只是一种在内置 IDA 类型(dt_byte、dt_word 等)不够用时标记一些字节以供以后使用自定义格式显示的方法。例如:一个XMM向量,一个Pascal字符串,一个半精度(16位)浮点数,一个16:32的远指针(fword),uleb128数等等。

尚不清楚创建新类型是否会导致条目显示在字符串菜单中,否则我确定您可以使用名称窗口及其过滤来替代。

有关更多详细信息,请在idaapi 中搜索data_format_t,并查看bytes.hpp但是,我认为第一个链接将使您走上正轨。

如果 IDB 中不静态存在该字符串,我不相信您可以告诉 IDA 将字符串添加到其字符串列表中。

但是,您可以让脚本执行以下操作:

  1. 创建一个新部分
  2. 将解密的字符串写入该部分(通过 IDB 中的字节修补),解密字符串和加密字符串之间可能存在交叉引用
  3. 在写入新部分的解密字符串上运行idaapi.refresh_strlist()此处记录的参数