IDA中的一些数据类型
数值类型
数据的后缀
符号后缀 | 含义 |
---|---|
u | unsigned int |
L | long |
F | float |
LL | long long |
0x18,十六进制数 18,十进制数 24
0x47ui64,十六进制数 47,十进制数 71,类型为
unsigned __int64
\x1A,十六进制数 1A,十进制数 26,其中
\x
为转义字符\x
表示后面的字符是 十六进制数\0
表示后面的字符是 八进制数
在标准的 C++ 代码中没有类似于
ui64
的后缀,是编译器扩展,改为u
即可
数据的前缀
不同位数的 int 类型
参数 | 意义 |
---|---|
int8 | 8 位,等于 byte,占 1 个字节 |
int16 | 16 位,等于 short,占 2 个字节 |
int32 | 32 位,等于 int,占 4 个字节 |
int64 | 64 位,等于 long,占 8 个字节 |
伪代码中的
_DWORD
类型,改写到在 C++ 中需引入头文件#include <windows.h>
,去掉'_'
,改写为DWORD
IDA 的伪代码中,有些参数的数据类型并不准确,比如
char 类型
、string 类型
、_int64 类型
等,需自己判断
在编写 C、C++ 脚本时,对应的数据类型也可以写为:
参数 | 意义 |
---|---|
int8_t | 8 位,占 1 个字节 |
int16_t | 16 位,占 2 个字节 |
int32_t | 32 位,占 4 个字节 |
int64_t | 64 位,占 8 个字节 |
例如
int32_t
是一种有符号的 32 位整数类型,通常用于确保在不同平台上有相同大小的整数表示
这是 C/C++ 标准库中的一个固定大小整数类型,可以确保在各种系统上都是 32 位
或者使用无符号数类型:
参数 | 意义 |
---|---|
uint8_t | 8 位无符号,占 1 个字节 |
uint16_t | 16 位无符号,占 2 个字节 |
uint32_t | 32 位无符号,占 4 个字节 |
uint64_t | 64 位无符号,占 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);
}
评论