数值类型

数据的后缀

符号后缀含义
uunsigned int
Llong
Ffloat
LLlong long
  • 0x18,十六进制数 18,十进制数 24

  • 0x47ui64,十六进制数 47,十进制数 71,类型为 unsigned __int64

  • \x1A,十六进制数 1A,十进制数 26,其中 \x 为转义字符

    • \x 表示后面的字符是 十六进制数
    • \0 表示后面的字符是 八进制数
  • 在标准的 C++ 代码中没有类似于 ui64 的后缀,是编译器扩展,改为 u 即可


数据的前缀

不同位数的 int 类型

参数意义
int88 位,等于 byte,占 1 个字节
int1616 位,等于 short,占 2 个字节
int3232 位,等于 int,占 4 个字节
int6464 位,等于 long,占 8 个字节
  • 伪代码中的 _DWORD 类型,改写到在 C++ 中需引入头文件 #include <windows.h>,去掉 '_',改写为 DWORD

  • IDA 的伪代码中,有些参数的数据类型并不准确,比如 char 类型string 类型_int64 类型 等,需自己判断

在编写 C、C++ 脚本时,对应的数据类型也可以写为:

参数意义
int8_t8 位,占 1 个字节
int16_t16 位,占 2 个字节
int32_t32 位,占 4 个字节
int64_t64 位,占 8 个字节

例如 int32_t 是一种有符号的 32 位整数类型,通常用于确保在不同平台上有相同大小的整数表示
这是 C/C++ 标准库中的一个固定大小整数类型,可以确保在各种系统上都是 32 位

或者使用无符号数类型:

参数意义
uint8_t8 位无符号,占 1 个字节
uint16_t16 位无符号,占 2 个字节
uint32_t32 位无符号,占 4 个字节
uint64_t64 位无符号,占 8 个字节
  • C 语言可引入头文件 #include <stdint.h>,C++ 可引入 #include <iostream> 或直接使用 std::uint64_t

(_BYTE *)

  • 将值或寄存器转换为字节指针,类似于将值分配给 C 变量 byte *

*(_BYTE *)

  • 从地址中提供的指针中取出一个字节

如果地址是 12345678,并且该地址存放的是字符串 “hello”

x = *(_BYTE *) (12345678 + counter)

如果 counter 是 0,那么 x 将是 ‘h’
如果 counter 是 1,那么 x 将是 ‘e’


IDA 中的数据宏定义

函数作用
LOWORD()得到一个 32bit 数的 低 两字节的16bit
HIWORD()得到一个 32bit 数的 高 两字节的16bit
LOBYTE()得到一个 16bit 数的 最低(最右边)那个字节 8bit
HIBYTE()得到一个 16bit 数的 最高(最左边)那个字节 8bit

宏定义的函数表示

  • 以 32 位程序,四字节数据 0xc3d57636 为例:
// 0xc3
unsigned char HIBYTE(unsigned int w)  // 取四字节数据的最高一字节  
{  
    return (w >> 8 * 3) & 0xFF;  // *((char *) &w + 3);
}  

// 0xd5
unsigned char BYTE2(unsigned int w) {  // 取四字节数据的次高一字节  
    return (w >> 8 * 2) & 0xFF;  // *((char *) &w + 2);
}  

// 0x76
unsigned char BYTE1(unsigned int w)  // 取四字节数据的次低一字节  
{  
    return (w >> 8 * 1) & 0xFF;  // *((char *) &w + 1);
}

// 0x36
unsigned char LOBYTE(unsigned int w)  // 取四字节数据的最低一字节  
{  
    return w >> 8 & 0xFF;  // *((char *) &w);
}