IDA中的_OWORD

IDA中的_OWORD

996.icu LICENSE

  • 一个有意思的巧合
  • _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位)而不被支持,所以需要我们手动实现相关支持。

如果本文对你有帮助,不如请我一杯可乐吧

在这里插入图片描述

在Python中,可以使用unluac模块来反编译luac_Lua程序。具体步骤如下: 1. 安装unluac模块。可以使用pip命令进行安装,命令如下: ``` pip install unluac ``` 2. 编写Python脚本来调用unluac模块进行反编译。以下是一个简单的示例脚本: ``` import unluac with open('test.luac', 'rb') as f: data = f.read() decompiled = unluac.decompile(data) with open('test.lua', 'w') as f: f.write(decompiled) ``` 该脚本将test.luac文件反编译为test.lua文件。 3. 将反编译后的Lua代码导入到IDA Pro中。可以使用IDA Pro的Lua插件进行处理。 1. 在IDA Pro中,选择File -> Script file,打开Lua脚本窗口。 2. 在窗口中输入以下代码: ``` local f = io.open("test.lua", "r") local content = f:read("*all") f:close() LoadSource(content, "test.lua") ``` 3. 点击Run按钮,将Lua代码加载到IDA Pro中。 4. 编写IDA Pro处理器模块。可以使用IDA Pro的Python API编写处理器模块,对Lua代码进行分析和处理。以下是一个示例模块: ``` import idaapi class LuaProcessor(idaapi.processor_t): id = 0x8000 + 1 flag = idaapi.PR_USE32 | idaapi.PR_DEFSEG32 cnbits = 8 dnbits = 8 psnames = ["luac"] plnames = ["Luac bytecode"] segreg_size = 0 instruc_start = 0 assembler = { "flag" : flag, "uflag" : 0, "name" : "Luac assembler", "origin" : "luac", "notify" : None, "header" : None, "footer" : None, "segstart" : None, "segend" : None, "assume" : None, "flag2" : 0, "cmnt" : ";", "ascsep" : '"', "accsep" : "'", "esccodes" : "\"'", "a_ascii" : "db", "a_byte" : "db", "a_word" : "dw", "a_dword" : "dd", "a_qword" : "dq", "a_oword" : "xmmword", "a_float" : "dd", "a_double" : "dq", "a_tbyte" : "dt", "a_packreal" : "dq", "a_dups" : "#dups", "a_bss" : "res", "a_seg" : "seg", "a_curip" : "$", "a_public" : "public", "a_weak" : "weak", "a_extrn" : "extrn", "a_comdef" : "comm", "a_align" : "align", "lbrace" : "(", "rbrace" : ")", "a_mod" : "%", "a_band" : "&", "a_bor" : "|", "a_xor" : "^", "a_bnot" : "~", "a_shl" : "<<", "a_shr" : ">>", "a_sizeof_fmt" : "size %s", } def PROCESSOR_ENTRY(): return LuaProcessor() ``` 该模块将Lua代码识别为Luac bytecode,并使用Luac assembler进行处理。 以上就是使用Python反编译luac_Lua程序并为其编写IDA Pro处理器模块的一般步骤。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值