对于 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 中看到的输出?