对于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;
}


因此,从类似Pbdf文件的结构中,它读取一个字节,确定要读取到缓冲区中的后续字节数,并以一个0。是否可以以某种方式告诉反编译器将这些变量“拆分”起来/作为两个单独的变量来处理,以获得类似于Watcom的输出?

#1 楼

我认为没有办法添加新的函数变量,因为反编译器会基于寄存器和堆栈位置创建这些变量。

但是,在确实很烦人的情况下,请在结构查看器可能会有所帮助。



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


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


评论


好主意。它将无法修复第二行中变量的显示,其中在合并变量上使用了addressof运算符(仍然仅显示&pbdfOrLength,而没有任何成员访问权限),但是我想这是可能的最佳解决方案。

–雷
18年5月8日在20:36



笨蛋我没有意识到它对地址运算符会起到这种作用。欣赏信息。

– Mayahustle
18年5月8日在21:48

#2 楼

我认为IDA接口中没有任何此类功能,但是IDA SDK中有API,可用于创建注册变量:https://www.hex-rays.com/products/ida/support/sdkdoc/group__regvar。 html#ga5f77d2c231f8faeb5939be2bc8e2a298

评论


那不会创建新的反编译器变量。这是为了在反汇编中重命名变量(将光标放在寄存器上并单击“ N”)。

– Mayahustle
18年5月8日在19:01