理解 Hex-Rays 伪代码

逆向工程 六线谱
2021-07-07 11:30:57

以下伪代码的含义是什么?:

  1. BYTE1(v2) 或者 BYTE1(v2)

  2. HIBYTE(v2)

这些宏有什么解释吗?如何在 C 代码中实现这些宏?

3个回答

BYTE1(v2)是值 v2 的第二个字节。根据参考,它是零索引的。定义为:

#define BYTEn(x, n)   (*((_BYTE*)&(x)+n))
#define BYTE1(x)   BYTEn(x,  1)         // byte 1 (counting from 0)

例如BYTE1(0x1213141516)是 0x15。(根据小端字节序)

HIBYTE(v2)是值 v2 的高字节。定义为:

#define HIBYTE(x)   (*((_BYTE*)&(x)+1))

例如HIBYTE(0x1213)是 0x12。(根据小端字节序)

打开你的 IDA 安装文件夹 open plugins\defs.h,这个文件包含了 hexrays 反编译器使用的所有宏。它也可以在 github 的 arman 的回答中找到。

重要——这个定义在最新版本的 IDA 中发生了变化defs.h,在反编译器输出和在反编译器输出中。

从(7.1 和 7.5 之间的某些 IDA 版本)起,HIBYTE 的含义有所不同,我猜你会称它为最重要的字节最高字节最后一个字节

例如,在__int32it now 中意味着BYTE3,在__int64it 中意味着BYTE7

这与默认的 Windows 定义和 IDA 的旧版本相反。

    // minwindef.h
    auto result_win = static_cast<BYTE>(static_cast<uintptr_t>(x) >> 8 & 0xff);

    // ida_defs_70.h
    auto result_ida70 = *(reinterpret_cast<uint8*>(&x)+1);

    // ida_defs_75.h
    auto result_ida75 = *(reinterpret_cast<uint8*>(&x)+(sizeof x/sizeof(uint8) - 1));

确保您使用的是适用于您的 IDA 版本的定义,该定义可以defs.h在您的 IDA 可执行文件的路径中找到plugins/