forked from rentzsch/mach_override
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
A robust disassembler capable of disassembling most (all?) of the 32bit & 64bit Intel assembler instructions. The plan is to use this instead of our home-grown (and incomplete) disassembler.
- Loading branch information
Frerich Raabe
committed
Aug 21, 2013
1 parent
c07a999
commit b20fdef
Showing
15 changed files
with
12,130 additions
and
0 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,195 @@ | ||
/* udis86 - libudis86/decode.h | ||
* | ||
* Copyright (c) 2002-2009 Vivek Thampi | ||
* All rights reserved. | ||
* | ||
* Redistribution and use in source and binary forms, with or without modification, | ||
* are permitted provided that the following conditions are met: | ||
* | ||
* * Redistributions of source code must retain the above copyright notice, | ||
* this list of conditions and the following disclaimer. | ||
* * Redistributions in binary form must reproduce the above copyright notice, | ||
* this list of conditions and the following disclaimer in the documentation | ||
* and/or other materials provided with the distribution. | ||
* | ||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | ||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR | ||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
*/ | ||
#ifndef UD_DECODE_H | ||
#define UD_DECODE_H | ||
|
||
#include "types.h" | ||
#include "itab.h" | ||
|
||
#define MAX_INSN_LENGTH 15 | ||
|
||
/* itab prefix bits */ | ||
#define P_none ( 0 ) | ||
#define P_cast ( 1 << 0 ) | ||
#define P_CAST(n) ( ( n >> 0 ) & 1 ) | ||
#define P_rexb ( 1 << 1 ) | ||
#define P_REXB(n) ( ( n >> 1 ) & 1 ) | ||
#define P_inv64 ( 1 << 4 ) | ||
#define P_INV64(n) ( ( n >> 4 ) & 1 ) | ||
#define P_rexw ( 1 << 5 ) | ||
#define P_REXW(n) ( ( n >> 5 ) & 1 ) | ||
#define P_def64 ( 1 << 7 ) | ||
#define P_DEF64(n) ( ( n >> 7 ) & 1 ) | ||
#define P_rexr ( 1 << 8 ) | ||
#define P_REXR(n) ( ( n >> 8 ) & 1 ) | ||
#define P_oso ( 1 << 9 ) | ||
#define P_OSO(n) ( ( n >> 9 ) & 1 ) | ||
#define P_aso ( 1 << 10 ) | ||
#define P_ASO(n) ( ( n >> 10 ) & 1 ) | ||
#define P_rexx ( 1 << 11 ) | ||
#define P_REXX(n) ( ( n >> 11 ) & 1 ) | ||
#define P_ImpAddr ( 1 << 12 ) | ||
#define P_IMPADDR(n) ( ( n >> 12 ) & 1 ) | ||
#define P_seg ( 1 << 13 ) | ||
#define P_SEG(n) ( ( n >> 13 ) & 1 ) | ||
#define P_str ( 1 << 14 ) | ||
#define P_STR(n) ( ( n >> 14 ) & 1 ) | ||
#define P_strz ( 1 << 15 ) | ||
#define P_STR_ZF(n) ( ( n >> 15 ) & 1 ) | ||
|
||
/* operand type constants -- order is important! */ | ||
|
||
enum ud_operand_code { | ||
OP_NONE, | ||
|
||
OP_A, OP_E, OP_M, OP_G, | ||
OP_I, OP_F, | ||
|
||
OP_R0, OP_R1, OP_R2, OP_R3, | ||
OP_R4, OP_R5, OP_R6, OP_R7, | ||
|
||
OP_AL, OP_CL, OP_DL, | ||
OP_AX, OP_CX, OP_DX, | ||
OP_eAX, OP_eCX, OP_eDX, | ||
OP_rAX, OP_rCX, OP_rDX, | ||
|
||
OP_ES, OP_CS, OP_SS, OP_DS, | ||
OP_FS, OP_GS, | ||
|
||
OP_ST0, OP_ST1, OP_ST2, OP_ST3, | ||
OP_ST4, OP_ST5, OP_ST6, OP_ST7, | ||
|
||
OP_J, OP_S, OP_O, | ||
OP_I1, OP_I3, OP_sI, | ||
|
||
OP_V, OP_W, OP_Q, OP_P, | ||
OP_U, OP_N, OP_MU, | ||
|
||
OP_R, OP_C, OP_D, | ||
|
||
OP_MR | ||
} UD_ATTR_PACKED; | ||
|
||
|
||
/* operand size constants */ | ||
|
||
enum ud_operand_size { | ||
SZ_NA = 0, | ||
SZ_Z = 1, | ||
SZ_V = 2, | ||
SZ_RDQ = 7, | ||
|
||
/* the following values are used as is, | ||
* and thus hard-coded. changing them | ||
* will break internals | ||
*/ | ||
SZ_B = 8, | ||
SZ_W = 16, | ||
SZ_D = 32, | ||
SZ_Q = 64, | ||
SZ_T = 80, | ||
SZ_O = 128, | ||
|
||
SZ_Y = 17, | ||
|
||
/* | ||
* complex size types, that encode sizes for operands | ||
* of type MR (memory or register), for internal use | ||
* only. Id space 256 and above. | ||
*/ | ||
SZ_BD = (SZ_B << 8) | SZ_D, | ||
SZ_BV = (SZ_B << 8) | SZ_V, | ||
SZ_WD = (SZ_W << 8) | SZ_D, | ||
SZ_WV = (SZ_W << 8) | SZ_V, | ||
SZ_WY = (SZ_W << 8) | SZ_Y, | ||
SZ_DY = (SZ_D << 8) | SZ_Y, | ||
SZ_WO = (SZ_W << 8) | SZ_O, | ||
SZ_DO = (SZ_D << 8) | SZ_O, | ||
SZ_QO = (SZ_Q << 8) | SZ_O, | ||
|
||
} UD_ATTR_PACKED; | ||
|
||
|
||
/* resolve complex size type. | ||
*/ | ||
static inline enum ud_operand_size | ||
Mx_mem_size(enum ud_operand_size size) | ||
{ | ||
return (size >> 8) & 0xff; | ||
} | ||
|
||
static inline enum ud_operand_size | ||
Mx_reg_size(enum ud_operand_size size) | ||
{ | ||
return size & 0xff; | ||
} | ||
|
||
/* A single operand of an entry in the instruction table. | ||
* (internal use only) | ||
*/ | ||
struct ud_itab_entry_operand | ||
{ | ||
enum ud_operand_code type; | ||
enum ud_operand_size size; | ||
}; | ||
|
||
|
||
/* A single entry in an instruction table. | ||
*(internal use only) | ||
*/ | ||
struct ud_itab_entry | ||
{ | ||
enum ud_mnemonic_code mnemonic; | ||
struct ud_itab_entry_operand operand1; | ||
struct ud_itab_entry_operand operand2; | ||
struct ud_itab_entry_operand operand3; | ||
uint32_t prefix; | ||
}; | ||
|
||
struct ud_lookup_table_list_entry { | ||
const uint16_t *table; | ||
enum ud_table_type type; | ||
const char *meta; | ||
}; | ||
|
||
|
||
|
||
static inline int | ||
ud_opcode_field_sext(uint8_t primary_opcode) | ||
{ | ||
return (primary_opcode & 0x02) != 0; | ||
} | ||
|
||
extern struct ud_itab_entry ud_itab[]; | ||
extern struct ud_lookup_table_list_entry ud_lookup_table_list[]; | ||
|
||
#endif /* UD_DECODE_H */ | ||
|
||
/* vim:cindent | ||
* vim:expandtab | ||
* vim:ts=4 | ||
* vim:sw=4 | ||
*/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
/* udis86 - libudis86/extern.h | ||
* | ||
* Copyright (c) 2002-2009, 2013 Vivek Thampi | ||
* All rights reserved. | ||
* | ||
* Redistribution and use in source and binary forms, with or without modification, | ||
* are permitted provided that the following conditions are met: | ||
* | ||
* * Redistributions of source code must retain the above copyright notice, | ||
* this list of conditions and the following disclaimer. | ||
* * Redistributions in binary form must reproduce the above copyright notice, | ||
* this list of conditions and the following disclaimer in the documentation | ||
* and/or other materials provided with the distribution. | ||
* | ||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | ||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR | ||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
*/ | ||
#ifndef UD_EXTERN_H | ||
#define UD_EXTERN_H | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
#include "types.h" | ||
|
||
/* ============================= PUBLIC API ================================= */ | ||
|
||
extern void ud_init(struct ud*); | ||
|
||
extern void ud_set_mode(struct ud*, uint8_t); | ||
|
||
extern void ud_set_pc(struct ud*, uint64_t); | ||
|
||
extern void ud_set_input_hook(struct ud*, int (*)(struct ud*)); | ||
|
||
extern void ud_set_input_buffer(struct ud*, const uint8_t*, size_t); | ||
|
||
#ifndef __UD_STANDALONE__ | ||
extern void ud_set_input_file(struct ud*, FILE*); | ||
#endif /* __UD_STANDALONE__ */ | ||
|
||
extern void ud_set_vendor(struct ud*, unsigned); | ||
|
||
extern void ud_set_syntax(struct ud*, void (*)(struct ud*)); | ||
|
||
extern void ud_input_skip(struct ud*, size_t); | ||
|
||
extern int ud_input_end(const struct ud*); | ||
|
||
extern unsigned int ud_decode(struct ud*); | ||
|
||
extern unsigned int ud_disassemble(struct ud*); | ||
|
||
extern void ud_translate_intel(struct ud*); | ||
|
||
extern void ud_translate_att(struct ud*); | ||
|
||
extern const char* ud_insn_asm(const struct ud* u); | ||
|
||
extern const uint8_t* ud_insn_ptr(const struct ud* u); | ||
|
||
extern uint64_t ud_insn_off(const struct ud*); | ||
|
||
extern const char* ud_insn_hex(struct ud*); | ||
|
||
extern unsigned int ud_insn_len(const struct ud* u); | ||
|
||
extern const struct ud_operand* ud_insn_opr(const struct ud *u, unsigned int n); | ||
|
||
extern int ud_opr_is_sreg(const struct ud_operand *opr); | ||
|
||
extern int ud_opr_isgpr(const struct ud_operand *opr); | ||
|
||
extern const char* ud_lookup_mnemonic(enum ud_mnemonic_code c); | ||
|
||
extern void ud_set_user_opaque_data(struct ud*, void*); | ||
|
||
extern void* ud_get_user_opaque_data(const struct ud*); | ||
|
||
extern uint64_t ud_insn_sext_imm(const struct ud*, const struct ud_operand*); | ||
|
||
extern void ud_set_asm_buffer(struct ud *u, char *buf, size_t size); | ||
|
||
extern void ud_set_sym_resolver(struct ud *u, | ||
const char* (*resolver)(struct ud*, | ||
uint64_t addr, | ||
int64_t *offset)); | ||
|
||
/* ========================================================================== */ | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
#endif /* UD_EXTERN_H */ |
Oops, something went wrong.