以下伪代码的含义是什么?:
BYTE1(v2)或者BYTE1(v2)HIBYTE(v2)
这些宏有什么解释吗?如何在 C 代码中实现这些宏?
以下伪代码的含义是什么?:
BYTE1(v2) 或者 BYTE1(v2)
HIBYTE(v2)
这些宏有什么解释吗?如何在 C 代码中实现这些宏?
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/