IDA Pro/Hex-Rays FLIRT 签名和标准库函数检测

逆向工程 艾达 六线谱 调情签名
2021-07-02 12:51:23

我在使用 IDA Pro/Hex-Rays 及其内置FLIRT签名对 Windows EXE 文件执行标准反编译时遇到了一些问题

很多标准 C++ 函数都没有被识别为这样,即:rand、memset 等。我试图反编译的二进制文件被自动检测到使用 Visual C++ 编译。

尝试打开 .EXE 时,我在输出窗口中看到以下内容:

Plan  FLIRT signature: Microsoft VisualC 2-11/net runtime
autoload.cfg: vc32rtf.sig autoloads mssdk.til

Type library 'mssdk' loaded. Applying types...
Types applied to 302 names.

Type library 'vc6win' loaded. Applying types...
Types applied to 1 names.

Using FLIRT signature: Microsoft VisualC 2-11/net runtime

但是,当我转到应用库模块列表(查看 > 打开子视图 > 签名)时,我看到 vc32rtf 签名有 1061 个匹配的函数,但我看起来这些在反汇编或其他东西上没有正确映射/重命名正在影响其识别功能的能力。

尝试按照此处所述更改签名并添加类型库,但似乎没有任何变化。

如果它有任何用处,我正在查看的二进制文件适用于 Windows 的 Reflector 1.5.0,我可以看到的一些未识别的功能是:

兰特

int sub_64B6F3()
{
  int v0; // eax@1
  unsigned int v1; // ecx@1

  v0 = _getptd();
  v1 = 214013 * *(_DWORD *)(v0 + 20) + 2531011;
  *(_DWORD *)(v0 + 20) = v1;
  return (v1 >> 16) & 0x7FFF;
}

记忆集

char *__cdecl sub_5AD770(unsigned __int64 a1, int a2, int a3)
{
  unsigned int v3; // ecx@1
  int v4; // esi@1
  __int64 v5; // rax@2

  v4 = HIDWORD(a1);
  v3 = a1;
  if ( a1 >= 0x311000 )
  {
    *(_BYTE *)a3 = 30;
    if ( v4 || v3 >= 0xCC000000 )
    {
      if ( v4 )
      {
LABEL_10:
        if ( !v4 && v3 < dword_821FBC - 805306368 )
        {
          v5 = (__int64)(__int64 *)((char *)&qword_93C180 + v3 - 3489660928i64);
          return (char *)v5;
        }
LABEL_13:
        sub_64B413("ERROR - address was outside of heap/stack space! (%08lx))\n", v3);
        _mm_storel_pd((double *)&a1, 0i64);
        LODWORD(v5) = a1;
        return (char *)v5;
      }
      if ( v3 < dword_821FC0 - 872415232 )
      {
        v5 = (__int64)(__int128 *)((char *)&xmmword_83C160 + v3 - 3422552064i64);
        return (char *)v5;
      }
    }
    if ( !v4 && v3 < 0xD0000000 )
      goto LABEL_13;
    goto LABEL_10;
  }
  LODWORD(v5) = sub_5ADAA0(a1, HIDWORD(a1));
  *(_BYTE *)a3 = -77;
  return (char *)v5;
}
1个回答

在这里阅读:https : //www.hex-rays.com/products/ida/tech/flirt/index.shtml

我认为他们在最新版本的 IDA 中彻底改革了 FLIRT 系统。总的来说,它运行得很好,但还有很大的改进空间。这有点像“大海捞针”。

当 FLIRT 说出如此多的误报时,这很烦人。它假设匹配来自函数的前这么多字节的部分签名匹配。注意根据构建选项库函数可以是静态的、使用 DLL 或内联的,另外生成的代码可以依赖于优化设置(因此签名不匹配)。使用比 FLIRT 更严格的系统可能有很大的改进空间。

另外可能有趣的是“GraphSlick”,它可以找到内联函数:

“该插件自动检测内联函数。它突出显示了相似的节点组,并允许您对它们进行分组,从而简化复杂的功能。作者提供了随附的演示文稿,其中解释了插件背后的算法并展示了示例用例。”

https://github.com/nihilus/graphslick