我在使用 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;
}