ClamAV is an open source (GPLv2) anti-virus toolkit.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
clamav/libclamav/disasmpriv.h

404 lines
5.8 KiB

/*
* Copyright (C) 2008 Sourcefire, Inc.
*
* Authors: aCaB <acab@clamav.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
#ifndef __DISASMPRIV_H
#define __DISASMPRIV_H
#if HAVE_CONFIG_H
#include "clamav-config.h"
#endif
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include "others.h"
enum X86OPS {
OP_INVALID,
OP_AAA,
OP_AAD,
OP_AAM,
OP_AAS,
OP_ADD,
OP_ADC,
OP_AND,
OP_ARPL,
OP_BOUND,
OP_BSF,
OP_BSR,
OP_BSWAP,
OP_BT,
OP_BTC,
OP_BTR,
OP_BTS,
OP_CALL,
OP_CDQ,
OP_CWD,
OP_CWDE,
OP_CBW,
OP_CLC,
OP_CLD,
OP_CLI,
OP_CLTS,
OP_CMC,
OP_CMOVO,
OP_CMOVNO,
OP_CMOVC,
OP_CMOVNC,
OP_CMOVZ,
OP_CMOVNZ,
OP_CMOVBE,
OP_CMOVA,
OP_CMOVS,
OP_CMOVNS,
OP_CMOVP,
OP_CMOVNP,
OP_CMOVL,
OP_CMOVGE,
OP_CMOVLE,
OP_CMOVG,
OP_CMP,
OP_CMPSD,
OP_CMPSW,
OP_CMPSB,
OP_CMPXCHG,
OP_CMPXCHG8B,
OP_CPUID,
OP_DAA,
OP_DAS,
OP_DEC,
OP_DIV,
OP_ENTER,
OP_FWAIT,
OP_HLT,
OP_IDIV,
OP_IMUL,
OP_INC,
OP_IN,
OP_INSD,
OP_INSW,
OP_INSB,
OP_INT,
OP_INT3,
OP_INTO,
OP_INVD,
OP_INVLPG,
OP_IRET,
OP_JO,
OP_JNO,
OP_JC,
OP_JNC,
OP_JZ,
OP_JNZ,
OP_JBE,
OP_JA,
OP_JS,
OP_JNS,
OP_JP,
OP_JNP,
OP_JL,
OP_JGE,
OP_JLE,
OP_JG,
OP_JMP,
OP_LAHF,
OP_LAR,
OP_LDS,
OP_LES,
OP_LFS,
OP_LGS,
OP_LEA,
OP_LEAVE,
OP_LGDT,
OP_LIDT,
OP_LLDT,
OP_PREFIX_LOCK,
OP_LODSD,
OP_LODSW,
OP_LODSB,
OP_LOOP,
OP_LOOPE,
OP_LOOPNE,
OP_JECXZ,
OP_LSL,
OP_LSS,
OP_LTR,
OP_MOV,
OP_MOVSD,
OP_MOVSW,
OP_MOVSB,
OP_MOVSX,
OP_MOVZX,
OP_MUL,
OP_NEG,
OP_NOP,
OP_NOT,
OP_OR,
OP_OUT,
OP_OUTSD,
OP_OUTSW,
OP_OUTSB,
OP_PUSH,
OP_PUSHAD,
OP_PUSHA,
OP_PUSHFD,
OP_PUSHF,
OP_POP,
OP_POPAD,
OP_POPFD,
OP_POPF,
OP_RCL,
OP_RCR,
OP_RDMSR,
OP_RDPMC,
OP_RDTSC,
OP_PREFIX_REPE,
OP_PREFIX_REPNE,
OP_RETF,
OP_RETN,
OP_ROL,
OP_ROR,
OP_RSM,
OP_SAHF,
OP_SAR,
OP_SBB,
OP_SCASD,
OP_SCASW,
OP_SCASB,
OP_SETO,
OP_SETNO,
OP_SETC,
OP_SETNC,
OP_SETZ,
OP_SETNZ,
OP_SETBE,
OP_SETA,
OP_SETS,
OP_SETNS,
OP_SETP,
OP_SETNP,
OP_SETL,
OP_SETGE,
OP_SETLE,
OP_SETG,
OP_SGDT,
OP_SIDT,
OP_SHL,
OP_SHLD,
OP_SHR,
OP_SHRD,
OP_SLDT,
OP_STOSD,
OP_STOSW,
OP_STOSB,
OP_STR,
OP_STC,
OP_STD,
OP_STI,
OP_SUB,
OP_SYSCALL,
OP_SYSENTER,
OP_SYSEXIT,
OP_SYSRET,
OP_TEST,
OP_UD2,
OP_VERR,
OP_VERRW,
OP_WBINVD,
OP_WRMSR,
OP_XADD,
OP_XCHG,
OP_XLAT,
OP_XOR,
OP_PREFIX_OPSIZE,
OP_PREFIX_ADDRSIZE,
OP_PREFIX_SEGMENT,
OP_2BYTE,
OP_FPU,
OP_F2XM1,
OP_FABS,
OP_FADD,
OP_FADDP,
OP_FBLD,
OP_FBSTP,
OP_FCHS,
OP_FCLEX,
OP_FCMOVB,
OP_FCMOVBE,
OP_FCMOVE,
OP_FCMOVNB,
OP_FCMOVNBE,
OP_FCMOVNE,
OP_FCMOVNU,
OP_FCMOVU,
OP_FCOM,
OP_FCOMI,
OP_FCOMIP,
OP_FCOMP,
OP_FCOMPP,
OP_FCOS,
OP_FDECSTP,
OP_FDIV,
OP_FDIVP,
OP_FDIVR,
OP_FDIVRP,
OP_FFREE,
OP_FIADD,
OP_FICOM,
OP_FICOMP,
OP_FIDIV,
OP_FIDIVR,
OP_FILD,
OP_FIMUL,
OP_FINCSTP,
OP_FINIT,
OP_FIST,
OP_FISTP,
OP_FISTTP,
OP_FISUB,
OP_FISUBR,
OP_FLD,
OP_FLD1,
OP_FLDCW,
OP_FLDENV,
OP_FLDL2E,
OP_FLDL2T,
OP_FLDLG2,
OP_FLDLN2,
OP_FLDPI,
OP_FLDZ,
OP_FMUL,
OP_FMULP,
OP_FNOP,
OP_FPATAN,
OP_FPREM,
OP_FPREM1,
OP_FPTAN,
OP_FRNDINT,
OP_FRSTOR,
OP_FSCALE,
OP_FSIN,
OP_FSINCOS,
OP_FSQRT,
OP_FSAVE,
OP_FST,
OP_FSTCW,
OP_FSTENV,
OP_FSTP,
OP_FSTSW,
OP_FSUB,
OP_FSUBP,
OP_FSUBR,
OP_FSUBRP,
OP_FTST,
OP_FUCOM,
OP_FUCOMI,
OP_FUCOMIP,
OP_FUCOMP,
OP_FUCOMPP,
OP_FXAM,
OP_FXCH,
OP_FXTRACT,
OP_FYL2X,
OP_FYL2XP1
};
enum DIS_STATE {
STATE_GETOP,
STATE_CHECKDTYPE,
STATE_CHECKSTYPE,
STATE_DECODEX87,
STATE_FINALIZE,
STATE_COMPLETE,
STATE_ERROR
};
enum DIS_ACCESS {
ACCESS_NOARG, /* arg not present */
ACCESS_IMM, /* immediate */
ACCESS_REL, /* +/- immediate */
ACCESS_REG, /* register */
ACCESS_MEM /* [something] */
};
enum DIS_SIZE { /* for mem access, immediate and relative */
SIZEB,
SIZEW,
SIZED,
SIZEF,
SIZEQ,
SIZET,
SIZEPTR
};
enum X86REGS {
REG_EAX, REG_ECX, REG_EDX, REG_EBX, REG_ESP, REG_EBP, REG_ESI, REG_EDI,
REG_AX, REG_CX, REG_DX, REG_BX, REG_SP, REG_BP, REG_SI, REG_DI,
REG_AH, REG_CH, REG_DH, REG_BH, REG_AL, REG_CL, REG_DL, REG_BL,
REG_ES, REG_CS, REG_SS, REG_DS, REG_FS, REG_GS,
REG_CR0, REG_CR1, REG_CR2, REG_CR3, REG_CR4, REG_CR5, REG_CR6, REG_CR7,
REG_DR0, REG_DR1, REG_DR2, REG_DR3, REG_DR4, REG_DR5, REG_DR6, REG_DR7,
REG_ST0, REG_ST1, REG_ST2, REG_ST3, REG_ST4, REG_ST5, REG_ST6, REG_ST7,
REG_INVALID
};
struct DIS_ARGS {
enum DIS_ACCESS access;
enum DIS_SIZE size;
enum X86REGS reg;
union {
uint8_t b;
int8_t rb;
uint16_t w;
int16_t rw;
uint32_t d;
int32_t rd;
/* uint48_t f; FIXME */
uint64_t q;
int64_t rq;
struct {
enum X86REGS r1; /* scaled */
enum X86REGS r2; /* added */
uint8_t scale; /* r1 multiplier */
int32_t disp;
} marg;
} arg;
};
/* FIXME: pack this thing and make macroes to access it in different compilers */
struct DISASMED {
uint16_t table_op;
uint16_t real_op;
enum DIS_STATE state;
uint32_t opsize;
uint32_t adsize;
uint32_t segment;
struct DIS_ARGS args[3];
uint8_t cur;
};
#endif