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 楼
我认为没有办法添加新的函数变量,因为反编译器会基于寄存器和堆栈位置创建这些变量。但是,在确实很烦人的情况下,请在结构查看器可能会有所帮助。
![](/img/774410669d3cd397cfc960cff0bdadf3.png)
然后,在反编译器中,将变量的类型设置为联合类型(Y是键盘快捷键)。
![](/img/78b607b9d67540f946d2ae8e0554d8e7.png)
在反汇编中,根据变量用法,可以使用“ Alt-Y”选择适当的并集字段。 (也可以在右键菜单中访问)
![](/img/7751270442d9c88f3b1e82bde10f4d8e.png)
#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
评论
好主意。它将无法修复第二行中变量的显示,其中在合并变量上使用了addressof运算符(仍然仅显示&pbdfOrLength,而没有任何成员访问权限),但是我想这是可能的最佳解决方案。
–雷
18年5月8日在20:36
笨蛋我没有意识到它对地址运算符会起到这种作用。欣赏信息。
– Mayahustle
18年5月8日在21:48