在 Hexrays 反编译器中拆分变量?

逆向工程 艾达 六线谱 反编译器 微信
2021-06-11 08:58:55

对于 Microsoft Visual C++ 可执行文件,我经常遇到这样的反编译:

void __cdecl Pbdf::ReadString(char *dst, Pbdf *pbdfOrLength)
{
    Pbdf *pbdf; // esi

    pbdf = pbdfOrLength;
    Pbdf::ReadBytes(&pbdfOrLength, 1, pbdfOrLength);
    Pbdf::ReadBytes(dst, (unsigned __int8)pbdfOrLength, pbdf);
    dst[(unsigned __int8)pbdfOrLength] = 0;
}

该函数实际上更像这样(在 Watcom 可执行文件中可以看到):

void __usercall Pbdf::ReadString(char *dst@<eax>, Pbdf *pbdf@<edx>)
{
    unsigned __int8 length; // [esp+0h] [ebp-14h]

    Pbdf::ReadBytes(pbdf, &length, 1u);
    Pbdf::ReadBytes(pbdf, dst, length);
    *((_BYTE *)dst + length) = 0;
}

因此,从类似 Pbdf 文件的结构中,它读取单个字节,确定要读入缓冲区的后续字节数,并以 0 终止该缓冲区。

但是,在 MSVC 反编译中,您可以看到它将长度和 Pbdf 结构合并为一个变量,因此我将变量命名为“pbdfOrLength”。

是否有可能告诉反编译器将这些变量“拆分”/将它们作为两个单独的变量处理,以获得类似于 Watcom 中看到的输出?

2个回答

我认为没有办法添加新的函数变量,因为反编译器是根据寄存器和堆栈位置创建的。

但是,在确实很烦人的情况下,在结构查看器中创建联合类型可能会有所帮助。

联合定义

然后,在您的反编译器中,将变量的类型设置为联合类型(Y 是键盘快捷键)。 变量类型声明

在反汇编中,根据变量的用法,可以使用“Alt-Y”选择合适的联合字段。(也可以在右键菜单中访问) 联合字段选择

我认为 IDA 接口中没有任何此类功能,但 IDA SDK 中有允许您创建寄存器变量的 API:https : //www.hex-rays.com/products/ida/support/sdkdoc/group__regvar。 html#ga5f77d2c231f8faeb5939be2bc8e2a298