帮助分析 IDA Pro Hex-Rays 转储

逆向工程 艾达 反编译
2021-06-25 10:17:31

我正在尝试对文件格式进行逆向工程,我有一个朋友(在安全领域工作)通过 Hex-Rays 反编译程序并给我生成的 .C 文件。过去几天我一直在分析这个文件。然而,我仍然想弄清楚很多,特别是两个部分:

// v42 is a FILE handler, Dst is a 0x40 byte buffer
if ( !ReadBuffer(&v42, &Dst, 0x40u, 0) ||
 !(unsigned __int8)(*(int (__stdcall **)(char *))(*(_DWORD *)v29 + 20))(&Dst) )

我理解第一部分,它将 0x40 字节读入缓冲区,即文件头。第二行非常混乱。我非常了解 C++,但我不必处理这方面的进展情况。我的猜测是,这是说“如果 0x20 处的字节不是 1”的奇特魔法,但这没有意义。

还有一个与此文件关联的密码。密码本身似乎是一个 SHA256 哈希值,但我不确定它是如何使用的。深入研究这个 .C 文件,我看到了与密码相关的功能。它有许多看起来几乎相同的行:

    v3 = a3;
      v4 = __ROL4__(
         (unsigned __int8)byte_441348[(*(_DWORD *)a1 + *(_DWORD *)a3) &         0xFF] | (((unsigned __int8)byte_441248[((unsigned int)(*(_DWORD *)a1 + *(_DWORD *)a3) >> 8) & 0xFF] | ((((unsigned __int8)byte_441048[(unsigned int)(*(_DWORD *)a1 + *(_DWORD *)a3) >> 24] << 8) | (unsigned __int8)byte_441148[((unsigned int)(*(_DWORD *)a1 + *(_DWORD *)a3) >> 16) & 0xFF]) << 8)) << 8),
     11);
      v5 = *(_DWORD *)(a1 + 4) ^ v4;

有没有一种方法可以让我弄清楚这里使用的是什么算法,而无需手动将代码转换为可用的东西?

最重要的是,我知道该文件是用 zlib 压缩的(1.2.5 和 1.2.1 都被两个相关程序使用)。我相信在流被 zlib 膨胀之前,文件上的这个密码有一些转换。

有任何想法吗?

1个回答

对于您的第一个问题,(*(int (__stdcall **)(char *))(*(_DWORD *)v29 + 20))是一个函数调用(v29是一个包含函数指针的对象(可能是一个 vtable))。

请为您的其他每个问题创建单独的帖子(每个帖子一个问题)。