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 + -
显示快捷键?