libdasm.c

来自「基于fuzzing的文件格式漏洞测试软件」· C语言 代码 · 共 799 行 · 第 1/5 页

C
799
字号
	{ INSTRUCTION_TYPE_JMPC,  "jns",      AM_J|OT_v,              FLAGS_NONE,           FLAGS_NONE,  0 },
	{ INSTRUCTION_TYPE_JMPC,  "jp",       AM_J|OT_v,              FLAGS_NONE,           FLAGS_NONE,  0 },
	{ INSTRUCTION_TYPE_JMPC,  "jnp",      AM_J|OT_v,              FLAGS_NONE,           FLAGS_NONE,  0 },
	{ INSTRUCTION_TYPE_JMPC,  "jl",       AM_J|OT_v,              FLAGS_NONE,           FLAGS_NONE,  0 },
	{ INSTRUCTION_TYPE_JMPC,  "jnl",      AM_J|OT_v,              FLAGS_NONE,           FLAGS_NONE,  0 },
	{ INSTRUCTION_TYPE_JMPC,  "jle",      AM_J|OT_v,              FLAGS_NONE,           FLAGS_NONE,  0 },
	{ INSTRUCTION_TYPE_JMPC,  "jnle",     AM_J|OT_v,              FLAGS_NONE,           FLAGS_NONE,  0 },
        { INSTRUCTION_TYPE_OTHER, "seto",     AM_E|OT_b,              FLAGS_NONE,           FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "setno",    AM_E|OT_b,              FLAGS_NONE,           FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "setb",     AM_E|OT_b,              FLAGS_NONE,           FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "setnb",    AM_E|OT_b,              FLAGS_NONE,           FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "setz",     AM_E|OT_b,              FLAGS_NONE,           FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "setnz",    AM_E|OT_b,              FLAGS_NONE,           FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "setbe",    AM_E|OT_b,              FLAGS_NONE,           FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "setnbe",   AM_E|OT_b,              FLAGS_NONE,           FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "sets",     AM_E|OT_b,              FLAGS_NONE,           FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "setns",    AM_E|OT_b,              FLAGS_NONE,           FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "setp",     AM_E|OT_b,              FLAGS_NONE,           FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "setnp",    AM_E|OT_b,              FLAGS_NONE,           FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "setl",     AM_E|OT_b,              FLAGS_NONE,           FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "setnl",    AM_E|OT_b,              FLAGS_NONE,           FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "setle",    AM_E|OT_b,              FLAGS_NONE,           FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "setnle",   AM_E|OT_b,              FLAGS_NONE,           FLAGS_NONE,  1 },
	{ INSTRUCTION_TYPE_OTHER, "push",     AM_REG|REG_FS|F_r,      FLAGS_NONE,           FLAGS_NONE,  0 },
	{ INSTRUCTION_TYPE_OTHER, "pop",      AM_REG|REG_FS|F_r,      FLAGS_NONE,           FLAGS_NONE,  0 },
        { INSTRUCTION_TYPE_OTHER, "cpuid",    FLAGS_NONE,             FLAGS_NONE,           FLAGS_NONE,  0 },
        { INSTRUCTION_TYPE_OTHER, "bt",       AM_E|OT_v,              AM_G|OT_v,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "shld",     AM_E|OT_v,              AM_G|OT_v,            AM_I|OT_b,   1 },
        { INSTRUCTION_TYPE_OTHER, "shld",     AM_E|OT_v,              AM_G|OT_v,   AM_REG|REG_ECX|OT_b,  1 },
        { INSTRUCTION_TYPE_OTHER, NULL,       FLAGS_NONE,             FLAGS_NONE,           FLAGS_NONE,  0 },
	// XXX: ibts: undocumented? 
        { INSTRUCTION_TYPE_OTHER, NULL,       FLAGS_NONE,             FLAGS_NONE,           FLAGS_NONE,  0 },
	{ INSTRUCTION_TYPE_OTHER, "push",     AM_REG|REG_GS|F_r,      FLAGS_NONE,           FLAGS_NONE,  0 },
	{ INSTRUCTION_TYPE_OTHER, "pop",      AM_REG|REG_GS|F_r,      FLAGS_NONE,           FLAGS_NONE,  0 },
        { INSTRUCTION_TYPE_OTHER, "rsm",      FLAGS_NONE,             FLAGS_NONE,           FLAGS_NONE,  0 },
        { INSTRUCTION_TYPE_OTHER, "bts",      AM_E|OT_v,              AM_G|OT_v,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "shrd",     AM_E|OT_v,              AM_G|OT_v,            AM_I|OT_b,   1 },
        { INSTRUCTION_TYPE_OTHER, "shrd",     AM_E|OT_v,              AM_G|OT_v,  AM_REG|REG_ECX|OT_b,   1 },
	// XXX: check addressing mode, Intel manual is a little bit confusing...
        { INSTRUCTION_TYPE_OTHER, "grp15",    AM_E|OT_v,              FLAGS_NONE,           FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_MUL, "imul",       AM_G|OT_v,              AM_E|OT_v,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "cmpxchg",  AM_E|OT_b,              AM_G|OT_b,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "cmpxchg",  AM_E|OT_v,              AM_G|OT_v,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "lss",      AM_G|OT_v,              AM_M|OT_v,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "btr",      AM_E|OT_v,              AM_G|OT_v,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "lfs",      AM_G|OT_v,              AM_M|OT_v,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "lgs",      AM_G|OT_v,              AM_M|OT_v,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "movzx",    AM_G|OT_v,              AM_E|OT_b,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "movzx",    AM_G|OT_v,              AM_E|OT_w,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, NULL,       FLAGS_NONE,             FLAGS_NONE,           FLAGS_NONE,  0 },
	// XXX: group 10 / invalid opcode?
        { INSTRUCTION_TYPE_OTHER, NULL,       FLAGS_NONE,             FLAGS_NONE,           FLAGS_NONE,  0 },
        { INSTRUCTION_TYPE_OTHER, "g8",       AM_E|OT_v,              AM_I|OT_b,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "btc",      AM_E|OT_v,              AM_G|OT_v,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "bsf",      AM_G|OT_v,              AM_E|OT_v,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "bsr",      AM_G|OT_v,              AM_E|OT_v,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "movsx",    AM_G|OT_v,              AM_E|OT_b,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "movsx",    AM_G|OT_v,              AM_E|OT_w,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "xadd",     AM_E|OT_b,              AM_G|OT_b,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "xadd",     AM_E|OT_v,              AM_G|OT_v,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "cmpps",    AM_V|OT_ps,             AM_W|OT_ps,           AM_I|OT_b,   1 },
        { INSTRUCTION_TYPE_OTHER, "movnti",   AM_M|OT_d,              AM_G|OT_d,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "pinsrw",   AM_P|OT_q,              AM_E|OT_d,            AM_I|OT_b,   1 },
        { INSTRUCTION_TYPE_OTHER, "pextrv",   AM_G|OT_v,              AM_P|OT_q,            AM_I|OT_b,   1 },
        { INSTRUCTION_TYPE_OTHER, "shufps",   AM_V|OT_ps,             AM_W|OT_ps,           AM_I|OT_b,   1 },
        { INSTRUCTION_TYPE_OTHER, "g9",       FLAGS_NONE,             FLAGS_NONE,           FLAGS_NONE,  0 },
        { INSTRUCTION_TYPE_OTHER, "bswap",    AM_REG|REG_EAX|OT_v,    FLAGS_NONE,           FLAGS_NONE,  0 },
        { INSTRUCTION_TYPE_OTHER, "bswap",    AM_REG|REG_ECX|OT_v,    FLAGS_NONE,           FLAGS_NONE,  0 },
        { INSTRUCTION_TYPE_OTHER, "bswap",    AM_REG|REG_EDX|OT_v,    FLAGS_NONE,           FLAGS_NONE,  0 },
        { INSTRUCTION_TYPE_OTHER, "bswap",    AM_REG|REG_EBX|OT_v,    FLAGS_NONE,           FLAGS_NONE,  0 },
        { INSTRUCTION_TYPE_OTHER, "bswap",    AM_REG|REG_ESP|OT_v,    FLAGS_NONE,           FLAGS_NONE,  0 },
        { INSTRUCTION_TYPE_OTHER, "bswap",    AM_REG|REG_EBP|OT_v,    FLAGS_NONE,           FLAGS_NONE,  0 },
        { INSTRUCTION_TYPE_OTHER, "bswap",    AM_REG|REG_ESI|OT_v,    FLAGS_NONE,           FLAGS_NONE,  0 },
        { INSTRUCTION_TYPE_OTHER, "bswap",    AM_REG|REG_EDI|OT_v,    FLAGS_NONE,           FLAGS_NONE,  0 },
        { INSTRUCTION_TYPE_OTHER, "addsubps", AM_V|OT_ps,             AM_W|OT_ps,           FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "psrlw",    AM_P|OT_q,              AM_Q|OT_d,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "psrld",    AM_P|OT_q,              AM_Q|OT_d,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "psrlq",    AM_P|OT_q,              AM_Q|OT_d,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "paddq",    AM_P|OT_q,              AM_Q|OT_d,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "pmullw",   AM_P|OT_q,              AM_Q|OT_d,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "movq",     AM_W|OT_q,              AM_V|OT_q,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "pmovmskb", AM_G|OT_v,              AM_P|OT_q,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "psubusb",  AM_P|OT_q,              AM_Q|OT_q,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "psubusw",  AM_P|OT_q,              AM_Q|OT_q,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "pminub",   AM_P|OT_q,              AM_Q|OT_q,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "pand",     AM_P|OT_q,              AM_Q|OT_q,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "paddusb",  AM_P|OT_q,              AM_Q|OT_q,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "paddusw",  AM_P|OT_q,              AM_Q|OT_q,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "pmaxsw",   AM_P|OT_q,              AM_Q|OT_q,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "pandn",    AM_P|OT_q,              AM_Q|OT_q,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "pavgb",    AM_P|OT_q,              AM_Q|OT_d,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "psraw",    AM_P|OT_q,              AM_Q|OT_d,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "psrad",    AM_P|OT_q,              AM_Q|OT_d,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "pavgw",    AM_P|OT_q,              AM_Q|OT_d,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "pmulhuw",  AM_P|OT_q,              AM_Q|OT_d,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "pmulhw",   AM_P|OT_q,              AM_Q|OT_d,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "cvtpd2dq", AM_V|OT_q,              AM_W|OT_d,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "movntq",   AM_P|OT_q,              AM_Q|OT_d,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "psubsb",   AM_P|OT_q,              AM_Q|OT_q,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "psubsw",   AM_P|OT_q,              AM_Q|OT_q,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "pminsw",   AM_P|OT_q,              AM_Q|OT_q,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "por",      AM_P|OT_q,              AM_Q|OT_q,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "paddsb",   AM_P|OT_q,              AM_Q|OT_q,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "paddsw",   AM_P|OT_q,              AM_Q|OT_q,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "pmaxsw",   AM_P|OT_q,              AM_Q|OT_q,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "pxor",     AM_P|OT_q,              AM_Q|OT_q,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "lddqu",    AM_V|OT_q,              AM_M|OT_q,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "psllw",    AM_P|OT_q,              AM_Q|OT_d,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "pslld",    AM_P|OT_q,              AM_Q|OT_d,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "psllq",    AM_P|OT_q,              AM_Q|OT_d,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "pmuludq",  AM_P|OT_q,              AM_Q|OT_d,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "pmaddwd",  AM_P|OT_q,              AM_Q|OT_d,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "psadbw",   AM_P|OT_q,              AM_Q|OT_d,            FLAGS_NONE,  1 },
	// XXX: check operand types
        { INSTRUCTION_TYPE_OTHER, "maskmovq", AM_P|OT_q,              AM_Q|OT_d,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "psubb",    AM_P|OT_q,              AM_Q|OT_q,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "psubw",    AM_P|OT_q,              AM_Q|OT_q,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "psubd",    AM_P|OT_q,              AM_Q|OT_q,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "psubq",    AM_P|OT_q,              AM_Q|OT_q,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "paddb",    AM_P|OT_q,              AM_Q|OT_q,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "paddw",    AM_P|OT_q,              AM_Q|OT_q,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, "paddd",    AM_P|OT_q,              AM_Q|OT_q,            FLAGS_NONE,  1 },
        { INSTRUCTION_TYPE_OTHER, NULL,       FLAGS_NONE,             FLAGS_NONE,           FLAGS_NONE,  0 },
};

// Just a lame hack to provide additional arguments to group 3 "test"
INST inst_table3[2] = {
	{ INSTRUCTION_TYPE_TEST,  "test",     AM_E|OT_b,              AM_I|OT_b,            FLAGS_NONE,  1 }, 
	{ INSTRUCTION_TYPE_TEST,  "test",     AM_E|OT_v,              AM_I|OT_v,            FLAGS_NONE,  1 }, 
};

// FPU instruction tables

/*
 * Tables are composed in two parts:
 *
 * - 1st part (index 0-7) are identified by the reg field of MODRM byte
 *   if the MODRM is < 0xc0. reg field can be used directly as an index to table.
 *
 * - 2nd part (8 - 0x47) are identified by the MODRM byte itself. In that case,
 *   the index can be calculated by "index = MODRM - 0xb8"
 *
 */
INST inst_table_fpu_d8[72] = {
	{ INSTRUCTION_TYPE_FPU,   "fadds",    AM_E|OT_v,              FLAGS_NONE,           FLAGS_NONE,  1 }, 
	{ INSTRUCTION_TYPE_FPU,   "fmuls",    AM_E|OT_v,              FLAGS_NONE,           FLAGS_NONE,  1 }, 
	{ INSTRUCTION_TYPE_FPU,   "fcoms",    AM_E|OT_v,              FLAGS_NONE,           FLAGS_NONE,  1 }, 
	{ INSTRUCTION_TYPE_FPU,   "fcomps",   AM_E|OT_v,              FLAGS_NONE,           FLAGS_NONE,  1 }, 
	{ INSTRUCTION_TYPE_FPU,   "fsubs",    AM_E|OT_v,              FLAGS_NONE,           FLAGS_NONE,  1 }, 
	{ INSTRUCTION_TYPE_FPU,   "fsubrs",   AM_E|OT_v,              FLAGS_NONE,           FLAGS_NONE,  1 }, 
	{ INSTRUCTION_TYPE_FPU,   "fdivs",    AM_E|OT_v,              FLAGS_NONE,           FLAGS_NONE,  1 }, 
	{ INSTRUCTION_TYPE_FPU,   "fdivrs",   AM_E|OT_v,              FLAGS_NONE,           FLAGS_NONE,  1 }, 
	{ INSTRUCTION_TYPE_FPU,   "fadd",     AM_REG|REG_ST0|F_f,     AM_REG|REG_ST0|F_f,   FLAGS_NONE,  0 }, 
	{ INSTRUCTION_TYPE_FPU,   "fadd",     AM_REG|REG_ST0|F_f,     AM_REG|REG_ST1|F_f,   FLAGS_NONE,  0 }, 
	{ INSTRUCTION_TYPE_FPU,   "fadd",     AM_REG|REG_ST0|F_f,     AM_REG|REG_ST2|F_f,   FLAGS_NONE,  0 }, 
	{ INSTRUCTION_TYPE_FPU,   "fadd",     AM_REG|REG_ST0|F_f,     AM_REG|REG_ST3|F_f,   FLAGS_NONE,  0 }, 
	{ INSTRUCTION_TYPE_FPU,   "fadd",     AM_REG|REG_ST0|F_f,     AM_REG|REG_ST4|F_f,   FLAGS_NONE,  0 }, 
	{ INSTRUCTION_TYPE_FPU,   "fadd",     AM_REG|REG_ST0|F_f,     AM_REG|REG_ST5|F_f,   FLAGS_NONE,  0 }, 
	{ INSTRUCTION_TYPE_FPU,   "fadd",     AM

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?