IDA中的_OWORD
IDA中的_OWORD一个有意思的巧合_OWORD的含义总结阅读之前注意:本文阅读建议用时:5min本文阅读结构如下表:项目下属项目测试用例数量一个有意思的巧合无0_OWORD的含义无1总结无0一个有意思的巧合正如我们所知道的那样,在英文中的月份缩写中,OCT代表着十月(October),而DEC代表着十二月(Decembe...
IDA中的_OWORD
- 一个有意思的巧合
- _OWORD的含义
- 总结
阅读之前注意:
本文阅读建议用时:5min
本文阅读结构如下表:
项目 | 下属项目 | 测试用例数量 |
---|---|---|
一个有意思的巧合 | 无 | 0 |
_OWORD的含义 | 无 | 1 |
总结 | 无 | 0 |
一个有意思的巧合
正如我们所知道的那样,在英文的月份缩写中,OCT代表着十月(October),而DEC代表着十二月(December)。
但是对于经常接触进制转换的程序员来说,他们还有着额外的意思,OCT代表八进制(octal),DEC则代表十六进制(hexadecimal)。
真是一种奇怪的巧合!
_OWORD的含义
在IDA中,_WORD代表一个字(1个字=2个字节=16位),_DWORD代表两个字(2个字=4个字节=32位),_QWORD(4个字=8个字节=64位)。
现在,你应该知道_OWORD代表什么意思了吧?
没错,_OWORD(8个字=16个字节=128位)!
尽管我们在常见的IDA头文件定义中可以看到如下宏定义,但_OWORD却没有被定义。
/*
This file contains definitions used by the Hex-Rays decompiler output.
It has type definitions and convenience macros to make the
output more readable.
Copyright (c) 2007-2011 Hex-Rays
*/
#if defined(__GNUC__)
typedef long long ll;
typedef unsigned long long ull;
#define __int64 long long
#define __int32 int
#define __int16 short
#define __int8 char
#define MAKELL(num) num ## LL
#define FMT_64 "ll"
#elif defined(_MSC_VER)
typedef __int64 ll;
typedef unsigned __int64 ull;
#define MAKELL(num) num ## i64
#define FMT_64 "I64"
#elif defined (__BORLANDC__)
typedef __int64 ll;
typedef unsigned __int64 ull;
#define MAKELL(num) num ## i64
#define FMT_64 "L"
#else
#error "unknown compiler"
#endif
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned short ushort;
typedef unsigned long ulong;
typedef char int8;
typedef signed char sint8;
typedef unsigned char uint8;
typedef short int16;
typedef signed short sint16;
typedef unsigned short uint16;
typedef int int32;
typedef signed int sint32;
typedef unsigned int uint32;
typedef ll int64;
typedef ll sint64;
typedef ull uint64;
// Partially defined types:
#define _BYTE uint8
#define _WORD uint16
#define _DWORD uint32
#define _QWORD uint64
#if !defined(_MSC_VER)
#define _LONGLONG __int128
#endif
这是为什么呢?我们直观的理解下,你可能很熟悉int、float、double、char这些数据类型,但C标准中的最大的数据类型long long或者double才只有8个字节(64位)。而_OWORD的128位已经超过这个表示范围了!因此我们没有既看到__int128的宏定义,也没有看到_OWORD的宏定义。
总结
本篇博客的核心是:_OWORD(8个字=16个字节=128位),因为超过了C语言中数据类型可以表示的最大范围(64位)而不被支持,所以需要我们手动实现相关支持。
如果本文对你有帮助,不如请我一杯可乐吧
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)