libdasm.c
来自「基于fuzzing的文件格式漏洞测试软件」· C语言 代码 · 共 799 行 · 第 1/5 页
C
799 行
/*
* libdasm -- simple x86 disassembly library
* (c) 2004 - 2005 jt / nologin.org
*
*
* TODO:
* - more documentation
* - do more code validation
*
*/
#include <stdio.h>
#include <string.h>
#include "libdasm.h"
// MODRM byte
#define MASK_MODRM_MOD(x) (((x) & 0xc0) >> 6)
#define MASK_MODRM_REG(x) (((x) & 0x38) >> 3)
#define MASK_MODRM_RM(x) ((x) & 0x7)
// SIB byte
#define MASK_SIB_SCALE(x) MASK_MODRM_MOD(x)
#define MASK_SIB_INDEX(x) MASK_MODRM_REG(x)
#define MASK_SIB_BASE(x) MASK_MODRM_RM(x)
// Registers
#define MASK_REG(x) ((x) & 0x000000FF)
#define REG_EAX 0
#define REG_AX REG_EAX
#define REG_AL REG_EAX
#define REG_ES REG_EAX // Just for reg_table consistence
#define REG_ST0 REG_EAX // Just for reg_table consistence
#define REG_ECX 1
#define REG_CX REG_ECX
#define REG_CL REG_ECX
#define REG_CS REG_ECX
#define REG_ST1 REG_ECX
#define REG_EDX 2
#define REG_DX REG_EDX
#define REG_DL REG_EDX
#define REG_SS REG_EDX
#define REG_ST2 REG_EDX
#define REG_EBX 3
#define REG_BX REG_EBX
#define REG_BL REG_EBX
#define REG_DS REG_EBX
#define REG_ST3 REG_EBX
#define REG_ESP 4
#define REG_SP REG_ESP
#define REG_AH REG_ESP // Just for reg_table consistence
#define REG_FS REG_ESP
#define REG_ST4 REG_ESP
#define REG_EBP 5
#define REG_BP REG_EBP
#define REG_CH REG_EBP
#define REG_GS REG_EBP
#define REG_ST5 REG_EBP
#define REG_ESI 6
#define REG_SI REG_ESI
#define REG_DH REG_ESI
#define REG_ST6 REG_ESI
#define REG_EDI 7
#define REG_DI REG_EDI
#define REG_BH REG_EDI
#define REG_ST7 REG_EDI
#define REG_NOP 10
// lock/rep prefix name table
const char *rep_table[] = {
"lock ", "repne ", "rep "
};
// Register name table
const char *reg_table[10][8] = {
{ "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi" },
{ "ax", "cx", "dx", "bx", "sp", "bp", "si", "di" },
{ "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh" },
{ "es", "cs", "ss", "ds", "fs", "gs", "seg6", "seg7" },
{ "dr0", "dr1", "dr2", "dr3", "dr4", "dr5", "dr6", "dr7" },
{ "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7" },
{ "tr0", "tr1", "tr2", "tr3", "tr4", "tr5", "tr6", "tr7" },
{ "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" },
{ "mm0", "mmx", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7" },
{ "st(0)","st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)"},
};
// Name table index
#define REG_GEN_DWORD 0
#define REG_GEN_WORD 1
#define REG_GEN_BYTE 2
#define REG_SEGMENT 3
#define REG_DEBUG 4
#define REG_CONTROL 5
#define REG_TEST 6
#define REG_SIMD 7
#define REG_MMX 8
#define REG_FPU 9
// Opcode extensions for one -and two-byte opcodes
// XXX: move these to proper instruction structures ASAP!
const char * ext_name_table[16][8] = {
{ "add", "or", "adc", "sbb", "and", "sub", "xor", "cmp" }, // g1
{ "rol", "ror", "rcl", "rcr", "shl", "shr", NULL, "sar" }, // g2
{ "test", NULL, "not", "neg", "mul", "imul", "div", "idiv" }, // g3
{ "inc", "dec", NULL, NULL, NULL, NULL, NULL, NULL }, // g4
{ "inc", "dec", "call", "callf", "jmp", "jmpf", "push", NULL }, // g5
{ "sldt", "str", "lldt", "ltr", "verr", "verw", NULL, NULL }, // g6
{ "sgdt", "sidt", "lgdt", "lidt", "smsw", NULL, "lmsw", "invlpg" }, // g7
{ NULL, NULL, NULL, NULL, "bt", "bts", "btr", "btc" }, // g8
{ NULL, "cmpxch", NULL, NULL, NULL, NULL, NULL, NULL }, // g9
{ NULL, NULL, "psrld", NULL, "psrad", NULL, "pslld", NULL }, // ga
{ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, // gb
{ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, // gc
{ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, // gd
{ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, // ge
{ "fxsave", "fxstor", "ldmxc5r", "stmxc5r", NULL, NULL, NULL, "sfence" }, // gf
{ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, // g0
};
// Instruction types for extensions
// XXX: move these to proper instruction structures ASAP!
enum Instruction ext_type_table[16][8] = {
{ // g1
INSTRUCTION_TYPE_ADD, INSTRUCTION_TYPE_OR,
INSTRUCTION_TYPE_ADC, INSTRUCTION_TYPE_SBB,
INSTRUCTION_TYPE_AND, INSTRUCTION_TYPE_SUB,
INSTRUCTION_TYPE_XOR, INSTRUCTION_TYPE_CMP,
},
{ // g2
INSTRUCTION_TYPE_ROX, INSTRUCTION_TYPE_ROX,
INSTRUCTION_TYPE_ROX, INSTRUCTION_TYPE_ROX,
INSTRUCTION_TYPE_SHX, INSTRUCTION_TYPE_SHX,
INSTRUCTION_TYPE_OTHER, INSTRUCTION_TYPE_SHX,
},
{ // g3
INSTRUCTION_TYPE_TEST, INSTRUCTION_TYPE_OTHER,
INSTRUCTION_TYPE_NOT, INSTRUCTION_TYPE_NEG,
INSTRUCTION_TYPE_MUL, INSTRUCTION_TYPE_MUL,
INSTRUCTION_TYPE_DIV, INSTRUCTION_TYPE_DIV,
},
{ // g4
INSTRUCTION_TYPE_INC, INSTRUCTION_TYPE_DEC,
INSTRUCTION_TYPE_OTHER, INSTRUCTION_TYPE_OTHER,
INSTRUCTION_TYPE_OTHER, INSTRUCTION_TYPE_OTHER,
INSTRUCTION_TYPE_OTHER, INSTRUCTION_TYPE_OTHER,
},
{ // g5
INSTRUCTION_TYPE_INC, INSTRUCTION_TYPE_DEC,
INSTRUCTION_TYPE_CALL, INSTRUCTION_TYPE_CALL,
INSTRUCTION_TYPE_JMP, INSTRUCTION_TYPE_JMP,
INSTRUCTION_TYPE_PUSH, INSTRUCTION_TYPE_OTHER,
},
{ // g6
INSTRUCTION_TYPE_OTHER, INSTRUCTION_TYPE_OTHER,
INSTRUCTION_TYPE_OTHER, INSTRUCTION_TYPE_OTHER,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?