mirror of
https://github.com/alliedmodders/sourcemod.git
synced 2025-12-08 19:08:35 +00:00
remove libudis86
This commit is contained in:
parent
4e15a92984
commit
3f9fef777e
@ -1,478 +0,0 @@
|
|||||||
#include "asm.h"
|
|
||||||
#include "libudis86/udis86.h"
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#ifndef WIN32
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <dlfcn.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "libudis86/udis86.h"
|
|
||||||
|
|
||||||
#define REG_EAX 0
|
|
||||||
#define REG_ECX 1
|
|
||||||
#define REG_EDX 2
|
|
||||||
#define REG_EBX 3
|
|
||||||
|
|
||||||
#define IA32_MOV_REG_IMM 0xB8 // encoding is +r <imm32>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if a call to a fpic thunk has just been written into dest.
|
|
||||||
* If found replaces it with a direct mov that sets the required register to the value of pc.
|
|
||||||
*
|
|
||||||
* @param dest Destination buffer where a call opcode + addr (5 bytes) has just been written.
|
|
||||||
* @param pc The program counter value that needs to be set (usually the next address from the source).
|
|
||||||
*/
|
|
||||||
void check_thunks(unsigned char *dest, unsigned char *pc)
|
|
||||||
{
|
|
||||||
#if defined(_WIN32) || defined(__x86_64__)
|
|
||||||
return;
|
|
||||||
#else
|
|
||||||
/* Step write address back 4 to the start of the function address */
|
|
||||||
unsigned char *writeaddr = dest - 4;
|
|
||||||
unsigned char *calloffset = *(unsigned char **)writeaddr;
|
|
||||||
unsigned char *calladdr = (unsigned char *)(dest + (unsigned int)calloffset);
|
|
||||||
|
|
||||||
/* Lookup name of function being called */
|
|
||||||
if ((*calladdr == 0x8B) && (*(calladdr+2) == 0x24) && (*(calladdr+3) == 0xC3))
|
|
||||||
{
|
|
||||||
//a thunk maybe?
|
|
||||||
char movByte = IA32_MOV_REG_IMM;
|
|
||||||
|
|
||||||
/* Calculate the correct mov opcode */
|
|
||||||
switch (*(calladdr+1))
|
|
||||||
{
|
|
||||||
case 0x04:
|
|
||||||
{
|
|
||||||
movByte += REG_EAX;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 0x1C:
|
|
||||||
{
|
|
||||||
movByte += REG_EBX;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 0x0C:
|
|
||||||
{
|
|
||||||
movByte += REG_ECX;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 0x14:
|
|
||||||
{
|
|
||||||
movByte += REG_EDX;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
printf("Unknown thunk: %c\n", *(calladdr+1));
|
|
||||||
#ifndef NDEBUG
|
|
||||||
abort();
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Move our write address back one to where the call opcode was */
|
|
||||||
writeaddr--;
|
|
||||||
|
|
||||||
|
|
||||||
/* Write our mov */
|
|
||||||
*writeaddr = movByte;
|
|
||||||
writeaddr++;
|
|
||||||
|
|
||||||
/* Write the value - The provided program counter value */
|
|
||||||
*(void **)writeaddr = (void *)pc;
|
|
||||||
writeaddr += 4;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
int copy_bytes(unsigned char *func, unsigned char *dest, unsigned int required_len)
|
|
||||||
{
|
|
||||||
ud_t ud_obj;
|
|
||||||
ud_init(&ud_obj);
|
|
||||||
|
|
||||||
#if defined(_WIN64) || defined(__x86_64__)
|
|
||||||
ud_set_mode(&ud_obj, 64);
|
|
||||||
#else
|
|
||||||
ud_set_mode(&ud_obj, 32);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ud_set_input_buffer(&ud_obj, func, 20);
|
|
||||||
unsigned int bytecount = 0;
|
|
||||||
|
|
||||||
while (bytecount < required_len && ud_disassemble(&ud_obj))
|
|
||||||
{
|
|
||||||
unsigned int insn_len = ud_insn_len(&ud_obj);
|
|
||||||
bytecount += insn_len;
|
|
||||||
|
|
||||||
if (dest)
|
|
||||||
{
|
|
||||||
const uint8_t *opcode = ud_insn_ptr(&ud_obj);
|
|
||||||
if ((opcode[0] & 0xFE) == 0xE8) // Fix CALL/JMP offset
|
|
||||||
{
|
|
||||||
dest[0] = func[0];
|
|
||||||
dest++; func++;
|
|
||||||
if (ud_insn_opr(&ud_obj, 0)->size == 32)
|
|
||||||
{
|
|
||||||
*(int32_t *)dest = func + *(int32_t *)func - dest;
|
|
||||||
check_thunks(dest+4, func+4);
|
|
||||||
dest += sizeof(int32_t);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*(int16_t *)dest = func + *(int16_t *)func - dest;
|
|
||||||
dest += sizeof(int16_t);
|
|
||||||
}
|
|
||||||
func--;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
memcpy(dest, func, insn_len);
|
|
||||||
dest += insn_len;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func += insn_len;
|
|
||||||
}
|
|
||||||
|
|
||||||
return bytecount;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
//if dest is NULL, returns minimum number of bytes needed to be copied
|
|
||||||
//if dest is not NULL, it will copy the bytes to dest as well as fix CALLs and JMPs
|
|
||||||
//http://www.devmaster.net/forums/showthread.php?t=2311
|
|
||||||
int copy_bytes(unsigned char *func, unsigned char* dest, int required_len) {
|
|
||||||
int bytecount = 0;
|
|
||||||
|
|
||||||
while(bytecount < required_len && *func != 0xCC)
|
|
||||||
{
|
|
||||||
// prefixes F0h, F2h, F3h, 66h, 67h, D8h-DFh, 2Eh, 36h, 3Eh, 26h, 64h and 65h
|
|
||||||
int operandSize = 4;
|
|
||||||
int FPU = 0;
|
|
||||||
int twoByte = 0;
|
|
||||||
unsigned char opcode = 0x90;
|
|
||||||
unsigned char modRM = 0xFF;
|
|
||||||
while(*func == 0xF0 ||
|
|
||||||
*func == 0xF2 ||
|
|
||||||
*func == 0xF3 ||
|
|
||||||
(*func & 0xFC) == 0x64 ||
|
|
||||||
(*func & 0xF8) == 0xD8 ||
|
|
||||||
(*func & 0x7E) == 0x62)
|
|
||||||
{
|
|
||||||
if(*func == 0x66)
|
|
||||||
{
|
|
||||||
operandSize = 2;
|
|
||||||
}
|
|
||||||
else if((*func & 0xF8) == 0xD8)
|
|
||||||
{
|
|
||||||
FPU = *func;
|
|
||||||
if (dest)
|
|
||||||
*dest++ = *func++;
|
|
||||||
else
|
|
||||||
func++;
|
|
||||||
bytecount++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dest)
|
|
||||||
*dest++ = *func++;
|
|
||||||
else
|
|
||||||
func++;
|
|
||||||
bytecount++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// two-byte opcode byte
|
|
||||||
if(*func == 0x0F)
|
|
||||||
{
|
|
||||||
twoByte = 1;
|
|
||||||
if (dest)
|
|
||||||
*dest++ = *func++;
|
|
||||||
else
|
|
||||||
func++;
|
|
||||||
bytecount++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// opcode byte
|
|
||||||
opcode = *func++;
|
|
||||||
if (dest) *dest++ = opcode;
|
|
||||||
bytecount++;
|
|
||||||
|
|
||||||
// mod R/M byte
|
|
||||||
modRM = 0xFF;
|
|
||||||
if(FPU)
|
|
||||||
{
|
|
||||||
if((opcode & 0xC0) != 0xC0)
|
|
||||||
{
|
|
||||||
modRM = opcode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(!twoByte)
|
|
||||||
{
|
|
||||||
if((opcode & 0xC4) == 0x00 ||
|
|
||||||
((opcode & 0xF4) == 0x60 && ((opcode & 0x0A) == 0x02 || (opcode & 0x09) == 0x09)) ||
|
|
||||||
(opcode & 0xF0) == 0x80 ||
|
|
||||||
((opcode & 0xF8) == 0xC0 && (opcode & 0x0E) != 0x02) ||
|
|
||||||
(opcode & 0xFC) == 0xD0 ||
|
|
||||||
(opcode & 0xF6) == 0xF6)
|
|
||||||
{
|
|
||||||
modRM = *func++;
|
|
||||||
if (dest) *dest++ = modRM;
|
|
||||||
bytecount++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(((opcode & 0xF0) == 0x00 && (opcode & 0x0F) >= 0x04 && (opcode & 0x0D) != 0x0D) ||
|
|
||||||
(opcode & 0xF0) == 0x30 ||
|
|
||||||
opcode == 0x77 ||
|
|
||||||
(opcode & 0xF0) == 0x80 ||
|
|
||||||
((opcode & 0xF0) == 0xA0 && (opcode & 0x07) <= 0x02) ||
|
|
||||||
(opcode & 0xF8) == 0xC8)
|
|
||||||
{
|
|
||||||
// No mod R/M byte
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
modRM = *func++;
|
|
||||||
if (dest) *dest++ = modRM;
|
|
||||||
bytecount++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// SIB
|
|
||||||
if((modRM & 0x07) == 0x04 &&
|
|
||||||
(modRM & 0xC0) != 0xC0)
|
|
||||||
{
|
|
||||||
if (dest)
|
|
||||||
*dest++ = *func++; //SIB
|
|
||||||
else
|
|
||||||
func++;
|
|
||||||
bytecount++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// mod R/M displacement
|
|
||||||
|
|
||||||
// Dword displacement, no base
|
|
||||||
if((modRM & 0xC5) == 0x05) {
|
|
||||||
if (dest) {
|
|
||||||
*(unsigned int*)dest = *(unsigned int*)func;
|
|
||||||
dest += 4;
|
|
||||||
}
|
|
||||||
func += 4;
|
|
||||||
bytecount += 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Byte displacement
|
|
||||||
if((modRM & 0xC0) == 0x40) {
|
|
||||||
if (dest)
|
|
||||||
*dest++ = *func++;
|
|
||||||
else
|
|
||||||
func++;
|
|
||||||
bytecount++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dword displacement
|
|
||||||
if((modRM & 0xC0) == 0x80) {
|
|
||||||
if (dest) {
|
|
||||||
*(unsigned int*)dest = *(unsigned int*)func;
|
|
||||||
dest += 4;
|
|
||||||
}
|
|
||||||
func += 4;
|
|
||||||
bytecount += 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
// immediate
|
|
||||||
if(FPU)
|
|
||||||
{
|
|
||||||
// Can't have immediate operand
|
|
||||||
}
|
|
||||||
else if(!twoByte)
|
|
||||||
{
|
|
||||||
if((opcode & 0xC7) == 0x04 ||
|
|
||||||
(opcode & 0xFE) == 0x6A || // PUSH/POP/IMUL
|
|
||||||
(opcode & 0xF0) == 0x70 || // Jcc
|
|
||||||
opcode == 0x80 ||
|
|
||||||
opcode == 0x83 ||
|
|
||||||
(opcode & 0xFD) == 0xA0 || // MOV
|
|
||||||
opcode == 0xA8 || // TEST
|
|
||||||
(opcode & 0xF8) == 0xB0 || // MOV
|
|
||||||
(opcode & 0xFE) == 0xC0 || // RCL
|
|
||||||
opcode == 0xC6 || // MOV
|
|
||||||
opcode == 0xCD || // INT
|
|
||||||
(opcode & 0xFE) == 0xD4 || // AAD/AAM
|
|
||||||
(opcode & 0xF8) == 0xE0 || // LOOP/JCXZ
|
|
||||||
opcode == 0xEB ||
|
|
||||||
(opcode == 0xF6 && (modRM & 0x30) == 0x00)) // TEST
|
|
||||||
{
|
|
||||||
if (dest)
|
|
||||||
*dest++ = *func++;
|
|
||||||
else
|
|
||||||
func++;
|
|
||||||
bytecount++;
|
|
||||||
}
|
|
||||||
else if((opcode & 0xF7) == 0xC2) // RET
|
|
||||||
{
|
|
||||||
if (dest) {
|
|
||||||
*(unsigned short*)dest = *(unsigned short*)func;
|
|
||||||
dest += 2;
|
|
||||||
}
|
|
||||||
func += 2;
|
|
||||||
bytecount += 2;
|
|
||||||
}
|
|
||||||
else if((opcode & 0xFC) == 0x80 ||
|
|
||||||
(opcode & 0xC7) == 0x05 ||
|
|
||||||
(opcode & 0xF8) == 0xB8 ||
|
|
||||||
(opcode & 0xFE) == 0xE8 || // CALL/Jcc
|
|
||||||
(opcode & 0xFE) == 0x68 ||
|
|
||||||
(opcode & 0xFC) == 0xA0 ||
|
|
||||||
(opcode & 0xEE) == 0xA8 ||
|
|
||||||
opcode == 0xC7 ||
|
|
||||||
(opcode == 0xF7 && (modRM & 0x30) == 0x00))
|
|
||||||
{
|
|
||||||
if (dest) {
|
|
||||||
//Fix CALL/JMP offset
|
|
||||||
if ((opcode & 0xFE) == 0xE8) {
|
|
||||||
if (operandSize == 4)
|
|
||||||
{
|
|
||||||
*(long*)dest = ((func + *(long*)func) - dest);
|
|
||||||
|
|
||||||
//pRED* edit. func is the current address of the call address, +4 is the next instruction, so the value of $pc
|
|
||||||
check_thunks(dest+4, func+4);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
*(short*)dest = ((func + *(short*)func) - dest);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
if (operandSize == 4)
|
|
||||||
*(unsigned long*)dest = *(unsigned long*)func;
|
|
||||||
else
|
|
||||||
*(unsigned short*)dest = *(unsigned short*)func;
|
|
||||||
}
|
|
||||||
dest += operandSize;
|
|
||||||
}
|
|
||||||
func += operandSize;
|
|
||||||
bytecount += operandSize;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(opcode == 0xBA || // BT
|
|
||||||
opcode == 0x0F || // 3DNow!
|
|
||||||
(opcode & 0xFC) == 0x70 || // PSLLW
|
|
||||||
(opcode & 0xF7) == 0xA4 || // SHLD
|
|
||||||
opcode == 0xC2 ||
|
|
||||||
opcode == 0xC4 ||
|
|
||||||
opcode == 0xC5 ||
|
|
||||||
opcode == 0xC6)
|
|
||||||
{
|
|
||||||
if (dest)
|
|
||||||
*dest++ = *func++;
|
|
||||||
else
|
|
||||||
func++;
|
|
||||||
}
|
|
||||||
else if((opcode & 0xF0) == 0x80) // Jcc -i
|
|
||||||
{
|
|
||||||
if (dest) {
|
|
||||||
if (operandSize == 4)
|
|
||||||
*(unsigned long*)dest = *(unsigned long*)func;
|
|
||||||
else
|
|
||||||
*(unsigned short*)dest = *(unsigned short*)func;
|
|
||||||
|
|
||||||
dest += operandSize;
|
|
||||||
}
|
|
||||||
func += operandSize;
|
|
||||||
bytecount += operandSize;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return bytecount;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//insert a specific JMP instruction at the given location
|
|
||||||
void inject_jmp(void* src, void* dest) {
|
|
||||||
*(unsigned char*)src = OP_JMP;
|
|
||||||
*(long*)((unsigned char*)src+1) = (long)((unsigned char*)dest - ((unsigned char*)src + OP_JMP_SIZE));
|
|
||||||
}
|
|
||||||
|
|
||||||
//fill a given block with NOPs
|
|
||||||
void fill_nop(void* src, unsigned int len) {
|
|
||||||
unsigned char* src2 = (unsigned char*)src;
|
|
||||||
while (len) {
|
|
||||||
*src2++ = OP_NOP;
|
|
||||||
--len;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void* eval_jump(void* src) {
|
|
||||||
unsigned char* addr = (unsigned char*)src;
|
|
||||||
|
|
||||||
if (!addr) return 0;
|
|
||||||
|
|
||||||
//import table jump
|
|
||||||
if (addr[0] == OP_PREFIX && addr[1] == OP_JMP_SEG) {
|
|
||||||
addr += 2;
|
|
||||||
addr = *(unsigned char**)addr;
|
|
||||||
//TODO: if addr points into the IAT
|
|
||||||
return *(void**)addr;
|
|
||||||
}
|
|
||||||
|
|
||||||
//8bit offset
|
|
||||||
else if (addr[0] == OP_JMP_BYTE) {
|
|
||||||
addr = &addr[OP_JMP_BYTE_SIZE] + *(char*)&addr[1];
|
|
||||||
//mangled 32bit jump?
|
|
||||||
if (addr[0] == OP_JMP) {
|
|
||||||
addr = addr + *(int*)&addr[1];
|
|
||||||
}
|
|
||||||
return addr;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
//32bit offset
|
|
||||||
else if (addr[0] == OP_JMP) {
|
|
||||||
addr = &addr[OP_JMP_SIZE] + *(int*)&addr[1];
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
return addr;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
from ms detours package
|
|
||||||
static bool detour_is_imported(PBYTE pbCode, PBYTE pbAddress)
|
|
||||||
{
|
|
||||||
MEMORY_BASIC_INFORMATION mbi;
|
|
||||||
VirtualQuery((PVOID)pbCode, &mbi, sizeof(mbi));
|
|
||||||
__try {
|
|
||||||
PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)mbi.AllocationBase;
|
|
||||||
if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)((PBYTE)pDosHeader +
|
|
||||||
pDosHeader->e_lfanew);
|
|
||||||
if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pbAddress >= ((PBYTE)pDosHeader +
|
|
||||||
pNtHeader->OptionalHeader
|
|
||||||
.DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress) &&
|
|
||||||
pbAddress < ((PBYTE)pDosHeader +
|
|
||||||
pNtHeader->OptionalHeader
|
|
||||||
.DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress +
|
|
||||||
pNtHeader->OptionalHeader
|
|
||||||
.DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].Size)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
__except(EXCEPTION_EXECUTE_HANDLER) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
@ -1,38 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#define OP_JMP 0xE9
|
|
||||||
#define OP_JMP_SIZE 5
|
|
||||||
#define X64_ABS_SIZE 14
|
|
||||||
|
|
||||||
#define OP_NOP 0x90
|
|
||||||
#define OP_NOP_SIZE 1
|
|
||||||
|
|
||||||
#define OP_PREFIX 0xFF
|
|
||||||
#define OP_JMP_SEG 0x25
|
|
||||||
|
|
||||||
#define OP_JMP_BYTE 0xEB
|
|
||||||
#define OP_JMP_BYTE_SIZE 2
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void check_thunks(unsigned char *dest, unsigned char *pc);
|
|
||||||
|
|
||||||
//if dest is NULL, returns minimum number of bytes needed to be copied
|
|
||||||
//if dest is not NULL, it will copy the bytes to dest as well as fix CALLs and JMPs
|
|
||||||
//http://www.devmaster.net/forums/showthread.php?t=2311
|
|
||||||
int copy_bytes(unsigned char *func, unsigned char* dest, unsigned int required_len);
|
|
||||||
|
|
||||||
//insert a specific JMP instruction at the given location
|
|
||||||
void inject_jmp(void* src, void* dest);
|
|
||||||
|
|
||||||
//fill a given block with NOPs
|
|
||||||
void fill_nop(void* src, unsigned int len);
|
|
||||||
|
|
||||||
//evaluate a JMP at the target
|
|
||||||
void* eval_jump(void* src);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
File diff suppressed because it is too large
Load Diff
@ -1,195 +0,0 @@
|
|||||||
/* 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
|
|
||||||
*/
|
|
||||||
@ -1,105 +0,0 @@
|
|||||||
/* 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_is_gpr(const struct ud_operand *opr);
|
|
||||||
|
|
||||||
extern enum ud_mnemonic_code ud_insn_mnemonic(const struct ud *u);
|
|
||||||
|
|
||||||
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 */
|
|
||||||
File diff suppressed because it is too large
Load Diff
@ -1,678 +0,0 @@
|
|||||||
#ifndef UD_ITAB_H
|
|
||||||
#define UD_ITAB_H
|
|
||||||
|
|
||||||
/* itab.h -- generated by udis86:scripts/ud_itab.py, do no edit */
|
|
||||||
|
|
||||||
/* ud_table_type -- lookup table types (see decode.c) */
|
|
||||||
enum ud_table_type {
|
|
||||||
UD_TAB__OPC_TABLE,
|
|
||||||
UD_TAB__OPC_X87,
|
|
||||||
UD_TAB__OPC_MOD,
|
|
||||||
UD_TAB__OPC_VEX_M,
|
|
||||||
UD_TAB__OPC_VEX_P,
|
|
||||||
UD_TAB__OPC_RM,
|
|
||||||
UD_TAB__OPC_VENDOR,
|
|
||||||
UD_TAB__OPC_OSIZE,
|
|
||||||
UD_TAB__OPC_MODE,
|
|
||||||
UD_TAB__OPC_3DNOW,
|
|
||||||
UD_TAB__OPC_REG,
|
|
||||||
UD_TAB__OPC_ASIZE,
|
|
||||||
UD_TAB__OPC_SSE
|
|
||||||
};
|
|
||||||
|
|
||||||
/* ud_mnemonic -- mnemonic constants */
|
|
||||||
enum ud_mnemonic_code {
|
|
||||||
UD_Iinvalid,
|
|
||||||
UD_I3dnow,
|
|
||||||
UD_Inone,
|
|
||||||
UD_Idb,
|
|
||||||
UD_Ipause,
|
|
||||||
UD_Iaaa,
|
|
||||||
UD_Iaad,
|
|
||||||
UD_Iaam,
|
|
||||||
UD_Iaas,
|
|
||||||
UD_Iadc,
|
|
||||||
UD_Iadd,
|
|
||||||
UD_Iaddpd,
|
|
||||||
UD_Iaddps,
|
|
||||||
UD_Iaddsd,
|
|
||||||
UD_Iaddss,
|
|
||||||
UD_Iand,
|
|
||||||
UD_Iandpd,
|
|
||||||
UD_Iandps,
|
|
||||||
UD_Iandnpd,
|
|
||||||
UD_Iandnps,
|
|
||||||
UD_Iarpl,
|
|
||||||
UD_Imovsxd,
|
|
||||||
UD_Ibound,
|
|
||||||
UD_Ibsf,
|
|
||||||
UD_Ibsr,
|
|
||||||
UD_Ibswap,
|
|
||||||
UD_Ibt,
|
|
||||||
UD_Ibtc,
|
|
||||||
UD_Ibtr,
|
|
||||||
UD_Ibts,
|
|
||||||
UD_Icall,
|
|
||||||
UD_Icbw,
|
|
||||||
UD_Icwde,
|
|
||||||
UD_Icdqe,
|
|
||||||
UD_Iclc,
|
|
||||||
UD_Icld,
|
|
||||||
UD_Iclflush,
|
|
||||||
UD_Iclgi,
|
|
||||||
UD_Icli,
|
|
||||||
UD_Iclts,
|
|
||||||
UD_Icmc,
|
|
||||||
UD_Icmovo,
|
|
||||||
UD_Icmovno,
|
|
||||||
UD_Icmovb,
|
|
||||||
UD_Icmovae,
|
|
||||||
UD_Icmovz,
|
|
||||||
UD_Icmovnz,
|
|
||||||
UD_Icmovbe,
|
|
||||||
UD_Icmova,
|
|
||||||
UD_Icmovs,
|
|
||||||
UD_Icmovns,
|
|
||||||
UD_Icmovp,
|
|
||||||
UD_Icmovnp,
|
|
||||||
UD_Icmovl,
|
|
||||||
UD_Icmovge,
|
|
||||||
UD_Icmovle,
|
|
||||||
UD_Icmovg,
|
|
||||||
UD_Icmp,
|
|
||||||
UD_Icmppd,
|
|
||||||
UD_Icmpps,
|
|
||||||
UD_Icmpsb,
|
|
||||||
UD_Icmpsw,
|
|
||||||
UD_Icmpsd,
|
|
||||||
UD_Icmpsq,
|
|
||||||
UD_Icmpss,
|
|
||||||
UD_Icmpxchg,
|
|
||||||
UD_Icmpxchg8b,
|
|
||||||
UD_Icmpxchg16b,
|
|
||||||
UD_Icomisd,
|
|
||||||
UD_Icomiss,
|
|
||||||
UD_Icpuid,
|
|
||||||
UD_Icvtdq2pd,
|
|
||||||
UD_Icvtdq2ps,
|
|
||||||
UD_Icvtpd2dq,
|
|
||||||
UD_Icvtpd2pi,
|
|
||||||
UD_Icvtpd2ps,
|
|
||||||
UD_Icvtpi2ps,
|
|
||||||
UD_Icvtpi2pd,
|
|
||||||
UD_Icvtps2dq,
|
|
||||||
UD_Icvtps2pi,
|
|
||||||
UD_Icvtps2pd,
|
|
||||||
UD_Icvtsd2si,
|
|
||||||
UD_Icvtsd2ss,
|
|
||||||
UD_Icvtsi2ss,
|
|
||||||
UD_Icvtss2si,
|
|
||||||
UD_Icvtss2sd,
|
|
||||||
UD_Icvttpd2pi,
|
|
||||||
UD_Icvttpd2dq,
|
|
||||||
UD_Icvttps2dq,
|
|
||||||
UD_Icvttps2pi,
|
|
||||||
UD_Icvttsd2si,
|
|
||||||
UD_Icvtsi2sd,
|
|
||||||
UD_Icvttss2si,
|
|
||||||
UD_Icwd,
|
|
||||||
UD_Icdq,
|
|
||||||
UD_Icqo,
|
|
||||||
UD_Idaa,
|
|
||||||
UD_Idas,
|
|
||||||
UD_Idec,
|
|
||||||
UD_Idiv,
|
|
||||||
UD_Idivpd,
|
|
||||||
UD_Idivps,
|
|
||||||
UD_Idivsd,
|
|
||||||
UD_Idivss,
|
|
||||||
UD_Iemms,
|
|
||||||
UD_Ienter,
|
|
||||||
UD_If2xm1,
|
|
||||||
UD_Ifabs,
|
|
||||||
UD_Ifadd,
|
|
||||||
UD_Ifaddp,
|
|
||||||
UD_Ifbld,
|
|
||||||
UD_Ifbstp,
|
|
||||||
UD_Ifchs,
|
|
||||||
UD_Ifclex,
|
|
||||||
UD_Ifcmovb,
|
|
||||||
UD_Ifcmove,
|
|
||||||
UD_Ifcmovbe,
|
|
||||||
UD_Ifcmovu,
|
|
||||||
UD_Ifcmovnb,
|
|
||||||
UD_Ifcmovne,
|
|
||||||
UD_Ifcmovnbe,
|
|
||||||
UD_Ifcmovnu,
|
|
||||||
UD_Ifucomi,
|
|
||||||
UD_Ifcom,
|
|
||||||
UD_Ifcom2,
|
|
||||||
UD_Ifcomp3,
|
|
||||||
UD_Ifcomi,
|
|
||||||
UD_Ifucomip,
|
|
||||||
UD_Ifcomip,
|
|
||||||
UD_Ifcomp,
|
|
||||||
UD_Ifcomp5,
|
|
||||||
UD_Ifcompp,
|
|
||||||
UD_Ifcos,
|
|
||||||
UD_Ifdecstp,
|
|
||||||
UD_Ifdiv,
|
|
||||||
UD_Ifdivp,
|
|
||||||
UD_Ifdivr,
|
|
||||||
UD_Ifdivrp,
|
|
||||||
UD_Ifemms,
|
|
||||||
UD_Iffree,
|
|
||||||
UD_Iffreep,
|
|
||||||
UD_Ificom,
|
|
||||||
UD_Ificomp,
|
|
||||||
UD_Ifild,
|
|
||||||
UD_Ifincstp,
|
|
||||||
UD_Ifninit,
|
|
||||||
UD_Ifiadd,
|
|
||||||
UD_Ifidivr,
|
|
||||||
UD_Ifidiv,
|
|
||||||
UD_Ifisub,
|
|
||||||
UD_Ifisubr,
|
|
||||||
UD_Ifist,
|
|
||||||
UD_Ifistp,
|
|
||||||
UD_Ifisttp,
|
|
||||||
UD_Ifld,
|
|
||||||
UD_Ifld1,
|
|
||||||
UD_Ifldl2t,
|
|
||||||
UD_Ifldl2e,
|
|
||||||
UD_Ifldpi,
|
|
||||||
UD_Ifldlg2,
|
|
||||||
UD_Ifldln2,
|
|
||||||
UD_Ifldz,
|
|
||||||
UD_Ifldcw,
|
|
||||||
UD_Ifldenv,
|
|
||||||
UD_Ifmul,
|
|
||||||
UD_Ifmulp,
|
|
||||||
UD_Ifimul,
|
|
||||||
UD_Ifnop,
|
|
||||||
UD_Ifpatan,
|
|
||||||
UD_Ifprem,
|
|
||||||
UD_Ifprem1,
|
|
||||||
UD_Ifptan,
|
|
||||||
UD_Ifrndint,
|
|
||||||
UD_Ifrstor,
|
|
||||||
UD_Ifnsave,
|
|
||||||
UD_Ifscale,
|
|
||||||
UD_Ifsin,
|
|
||||||
UD_Ifsincos,
|
|
||||||
UD_Ifsqrt,
|
|
||||||
UD_Ifstp,
|
|
||||||
UD_Ifstp1,
|
|
||||||
UD_Ifstp8,
|
|
||||||
UD_Ifstp9,
|
|
||||||
UD_Ifst,
|
|
||||||
UD_Ifnstcw,
|
|
||||||
UD_Ifnstenv,
|
|
||||||
UD_Ifnstsw,
|
|
||||||
UD_Ifsub,
|
|
||||||
UD_Ifsubp,
|
|
||||||
UD_Ifsubr,
|
|
||||||
UD_Ifsubrp,
|
|
||||||
UD_Iftst,
|
|
||||||
UD_Ifucom,
|
|
||||||
UD_Ifucomp,
|
|
||||||
UD_Ifucompp,
|
|
||||||
UD_Ifxam,
|
|
||||||
UD_Ifxch,
|
|
||||||
UD_Ifxch4,
|
|
||||||
UD_Ifxch7,
|
|
||||||
UD_Ifxrstor,
|
|
||||||
UD_Ifxsave,
|
|
||||||
UD_Ifxtract,
|
|
||||||
UD_Ifyl2x,
|
|
||||||
UD_Ifyl2xp1,
|
|
||||||
UD_Ihlt,
|
|
||||||
UD_Iidiv,
|
|
||||||
UD_Iin,
|
|
||||||
UD_Iimul,
|
|
||||||
UD_Iinc,
|
|
||||||
UD_Iinsb,
|
|
||||||
UD_Iinsw,
|
|
||||||
UD_Iinsd,
|
|
||||||
UD_Iint1,
|
|
||||||
UD_Iint3,
|
|
||||||
UD_Iint,
|
|
||||||
UD_Iinto,
|
|
||||||
UD_Iinvd,
|
|
||||||
UD_Iinvept,
|
|
||||||
UD_Iinvlpg,
|
|
||||||
UD_Iinvlpga,
|
|
||||||
UD_Iinvvpid,
|
|
||||||
UD_Iiretw,
|
|
||||||
UD_Iiretd,
|
|
||||||
UD_Iiretq,
|
|
||||||
UD_Ijo,
|
|
||||||
UD_Ijno,
|
|
||||||
UD_Ijb,
|
|
||||||
UD_Ijae,
|
|
||||||
UD_Ijz,
|
|
||||||
UD_Ijnz,
|
|
||||||
UD_Ijbe,
|
|
||||||
UD_Ija,
|
|
||||||
UD_Ijs,
|
|
||||||
UD_Ijns,
|
|
||||||
UD_Ijp,
|
|
||||||
UD_Ijnp,
|
|
||||||
UD_Ijl,
|
|
||||||
UD_Ijge,
|
|
||||||
UD_Ijle,
|
|
||||||
UD_Ijg,
|
|
||||||
UD_Ijcxz,
|
|
||||||
UD_Ijecxz,
|
|
||||||
UD_Ijrcxz,
|
|
||||||
UD_Ijmp,
|
|
||||||
UD_Ilahf,
|
|
||||||
UD_Ilar,
|
|
||||||
UD_Ilddqu,
|
|
||||||
UD_Ildmxcsr,
|
|
||||||
UD_Ilds,
|
|
||||||
UD_Ilea,
|
|
||||||
UD_Iles,
|
|
||||||
UD_Ilfs,
|
|
||||||
UD_Ilgs,
|
|
||||||
UD_Ilidt,
|
|
||||||
UD_Ilss,
|
|
||||||
UD_Ileave,
|
|
||||||
UD_Ilfence,
|
|
||||||
UD_Ilgdt,
|
|
||||||
UD_Illdt,
|
|
||||||
UD_Ilmsw,
|
|
||||||
UD_Ilock,
|
|
||||||
UD_Ilodsb,
|
|
||||||
UD_Ilodsw,
|
|
||||||
UD_Ilodsd,
|
|
||||||
UD_Ilodsq,
|
|
||||||
UD_Iloopne,
|
|
||||||
UD_Iloope,
|
|
||||||
UD_Iloop,
|
|
||||||
UD_Ilsl,
|
|
||||||
UD_Iltr,
|
|
||||||
UD_Imaskmovq,
|
|
||||||
UD_Imaxpd,
|
|
||||||
UD_Imaxps,
|
|
||||||
UD_Imaxsd,
|
|
||||||
UD_Imaxss,
|
|
||||||
UD_Imfence,
|
|
||||||
UD_Iminpd,
|
|
||||||
UD_Iminps,
|
|
||||||
UD_Iminsd,
|
|
||||||
UD_Iminss,
|
|
||||||
UD_Imonitor,
|
|
||||||
UD_Imontmul,
|
|
||||||
UD_Imov,
|
|
||||||
UD_Imovapd,
|
|
||||||
UD_Imovaps,
|
|
||||||
UD_Imovd,
|
|
||||||
UD_Imovhpd,
|
|
||||||
UD_Imovhps,
|
|
||||||
UD_Imovlhps,
|
|
||||||
UD_Imovlpd,
|
|
||||||
UD_Imovlps,
|
|
||||||
UD_Imovhlps,
|
|
||||||
UD_Imovmskpd,
|
|
||||||
UD_Imovmskps,
|
|
||||||
UD_Imovntdq,
|
|
||||||
UD_Imovnti,
|
|
||||||
UD_Imovntpd,
|
|
||||||
UD_Imovntps,
|
|
||||||
UD_Imovntq,
|
|
||||||
UD_Imovq,
|
|
||||||
UD_Imovsb,
|
|
||||||
UD_Imovsw,
|
|
||||||
UD_Imovsd,
|
|
||||||
UD_Imovsq,
|
|
||||||
UD_Imovss,
|
|
||||||
UD_Imovsx,
|
|
||||||
UD_Imovupd,
|
|
||||||
UD_Imovups,
|
|
||||||
UD_Imovzx,
|
|
||||||
UD_Imul,
|
|
||||||
UD_Imulpd,
|
|
||||||
UD_Imulps,
|
|
||||||
UD_Imulsd,
|
|
||||||
UD_Imulss,
|
|
||||||
UD_Imwait,
|
|
||||||
UD_Ineg,
|
|
||||||
UD_Inop,
|
|
||||||
UD_Inot,
|
|
||||||
UD_Ior,
|
|
||||||
UD_Iorpd,
|
|
||||||
UD_Iorps,
|
|
||||||
UD_Iout,
|
|
||||||
UD_Ioutsb,
|
|
||||||
UD_Ioutsw,
|
|
||||||
UD_Ioutsd,
|
|
||||||
UD_Ipacksswb,
|
|
||||||
UD_Ipackssdw,
|
|
||||||
UD_Ipackuswb,
|
|
||||||
UD_Ipaddb,
|
|
||||||
UD_Ipaddw,
|
|
||||||
UD_Ipaddd,
|
|
||||||
UD_Ipaddsb,
|
|
||||||
UD_Ipaddsw,
|
|
||||||
UD_Ipaddusb,
|
|
||||||
UD_Ipaddusw,
|
|
||||||
UD_Ipand,
|
|
||||||
UD_Ipandn,
|
|
||||||
UD_Ipavgb,
|
|
||||||
UD_Ipavgw,
|
|
||||||
UD_Ipcmpeqb,
|
|
||||||
UD_Ipcmpeqw,
|
|
||||||
UD_Ipcmpeqd,
|
|
||||||
UD_Ipcmpgtb,
|
|
||||||
UD_Ipcmpgtw,
|
|
||||||
UD_Ipcmpgtd,
|
|
||||||
UD_Ipextrb,
|
|
||||||
UD_Ipextrd,
|
|
||||||
UD_Ipextrq,
|
|
||||||
UD_Ipextrw,
|
|
||||||
UD_Ipinsrb,
|
|
||||||
UD_Ipinsrw,
|
|
||||||
UD_Ipinsrd,
|
|
||||||
UD_Ipinsrq,
|
|
||||||
UD_Ipmaddwd,
|
|
||||||
UD_Ipmaxsw,
|
|
||||||
UD_Ipmaxub,
|
|
||||||
UD_Ipminsw,
|
|
||||||
UD_Ipminub,
|
|
||||||
UD_Ipmovmskb,
|
|
||||||
UD_Ipmulhuw,
|
|
||||||
UD_Ipmulhw,
|
|
||||||
UD_Ipmullw,
|
|
||||||
UD_Ipop,
|
|
||||||
UD_Ipopa,
|
|
||||||
UD_Ipopad,
|
|
||||||
UD_Ipopfw,
|
|
||||||
UD_Ipopfd,
|
|
||||||
UD_Ipopfq,
|
|
||||||
UD_Ipor,
|
|
||||||
UD_Iprefetch,
|
|
||||||
UD_Iprefetchnta,
|
|
||||||
UD_Iprefetcht0,
|
|
||||||
UD_Iprefetcht1,
|
|
||||||
UD_Iprefetcht2,
|
|
||||||
UD_Ipsadbw,
|
|
||||||
UD_Ipshufw,
|
|
||||||
UD_Ipsllw,
|
|
||||||
UD_Ipslld,
|
|
||||||
UD_Ipsllq,
|
|
||||||
UD_Ipsraw,
|
|
||||||
UD_Ipsrad,
|
|
||||||
UD_Ipsrlw,
|
|
||||||
UD_Ipsrld,
|
|
||||||
UD_Ipsrlq,
|
|
||||||
UD_Ipsubb,
|
|
||||||
UD_Ipsubw,
|
|
||||||
UD_Ipsubd,
|
|
||||||
UD_Ipsubsb,
|
|
||||||
UD_Ipsubsw,
|
|
||||||
UD_Ipsubusb,
|
|
||||||
UD_Ipsubusw,
|
|
||||||
UD_Ipunpckhbw,
|
|
||||||
UD_Ipunpckhwd,
|
|
||||||
UD_Ipunpckhdq,
|
|
||||||
UD_Ipunpcklbw,
|
|
||||||
UD_Ipunpcklwd,
|
|
||||||
UD_Ipunpckldq,
|
|
||||||
UD_Ipi2fw,
|
|
||||||
UD_Ipi2fd,
|
|
||||||
UD_Ipf2iw,
|
|
||||||
UD_Ipf2id,
|
|
||||||
UD_Ipfnacc,
|
|
||||||
UD_Ipfpnacc,
|
|
||||||
UD_Ipfcmpge,
|
|
||||||
UD_Ipfmin,
|
|
||||||
UD_Ipfrcp,
|
|
||||||
UD_Ipfrsqrt,
|
|
||||||
UD_Ipfsub,
|
|
||||||
UD_Ipfadd,
|
|
||||||
UD_Ipfcmpgt,
|
|
||||||
UD_Ipfmax,
|
|
||||||
UD_Ipfrcpit1,
|
|
||||||
UD_Ipfrsqit1,
|
|
||||||
UD_Ipfsubr,
|
|
||||||
UD_Ipfacc,
|
|
||||||
UD_Ipfcmpeq,
|
|
||||||
UD_Ipfmul,
|
|
||||||
UD_Ipfrcpit2,
|
|
||||||
UD_Ipmulhrw,
|
|
||||||
UD_Ipswapd,
|
|
||||||
UD_Ipavgusb,
|
|
||||||
UD_Ipush,
|
|
||||||
UD_Ipusha,
|
|
||||||
UD_Ipushad,
|
|
||||||
UD_Ipushfw,
|
|
||||||
UD_Ipushfd,
|
|
||||||
UD_Ipushfq,
|
|
||||||
UD_Ipxor,
|
|
||||||
UD_Ircl,
|
|
||||||
UD_Ircr,
|
|
||||||
UD_Irol,
|
|
||||||
UD_Iror,
|
|
||||||
UD_Ircpps,
|
|
||||||
UD_Ircpss,
|
|
||||||
UD_Irdmsr,
|
|
||||||
UD_Irdpmc,
|
|
||||||
UD_Irdtsc,
|
|
||||||
UD_Irdtscp,
|
|
||||||
UD_Irepne,
|
|
||||||
UD_Irep,
|
|
||||||
UD_Iret,
|
|
||||||
UD_Iretf,
|
|
||||||
UD_Irsm,
|
|
||||||
UD_Irsqrtps,
|
|
||||||
UD_Irsqrtss,
|
|
||||||
UD_Isahf,
|
|
||||||
UD_Isalc,
|
|
||||||
UD_Isar,
|
|
||||||
UD_Ishl,
|
|
||||||
UD_Ishr,
|
|
||||||
UD_Isbb,
|
|
||||||
UD_Iscasb,
|
|
||||||
UD_Iscasw,
|
|
||||||
UD_Iscasd,
|
|
||||||
UD_Iscasq,
|
|
||||||
UD_Iseto,
|
|
||||||
UD_Isetno,
|
|
||||||
UD_Isetb,
|
|
||||||
UD_Isetae,
|
|
||||||
UD_Isetz,
|
|
||||||
UD_Isetnz,
|
|
||||||
UD_Isetbe,
|
|
||||||
UD_Iseta,
|
|
||||||
UD_Isets,
|
|
||||||
UD_Isetns,
|
|
||||||
UD_Isetp,
|
|
||||||
UD_Isetnp,
|
|
||||||
UD_Isetl,
|
|
||||||
UD_Isetge,
|
|
||||||
UD_Isetle,
|
|
||||||
UD_Isetg,
|
|
||||||
UD_Isfence,
|
|
||||||
UD_Isgdt,
|
|
||||||
UD_Ishld,
|
|
||||||
UD_Ishrd,
|
|
||||||
UD_Ishufpd,
|
|
||||||
UD_Ishufps,
|
|
||||||
UD_Isidt,
|
|
||||||
UD_Isldt,
|
|
||||||
UD_Ismsw,
|
|
||||||
UD_Isqrtps,
|
|
||||||
UD_Isqrtpd,
|
|
||||||
UD_Isqrtsd,
|
|
||||||
UD_Isqrtss,
|
|
||||||
UD_Istc,
|
|
||||||
UD_Istd,
|
|
||||||
UD_Istgi,
|
|
||||||
UD_Isti,
|
|
||||||
UD_Iskinit,
|
|
||||||
UD_Istmxcsr,
|
|
||||||
UD_Istosb,
|
|
||||||
UD_Istosw,
|
|
||||||
UD_Istosd,
|
|
||||||
UD_Istosq,
|
|
||||||
UD_Istr,
|
|
||||||
UD_Isub,
|
|
||||||
UD_Isubpd,
|
|
||||||
UD_Isubps,
|
|
||||||
UD_Isubsd,
|
|
||||||
UD_Isubss,
|
|
||||||
UD_Iswapgs,
|
|
||||||
UD_Isyscall,
|
|
||||||
UD_Isysenter,
|
|
||||||
UD_Isysexit,
|
|
||||||
UD_Isysret,
|
|
||||||
UD_Itest,
|
|
||||||
UD_Iucomisd,
|
|
||||||
UD_Iucomiss,
|
|
||||||
UD_Iud2,
|
|
||||||
UD_Iunpckhpd,
|
|
||||||
UD_Iunpckhps,
|
|
||||||
UD_Iunpcklps,
|
|
||||||
UD_Iunpcklpd,
|
|
||||||
UD_Iverr,
|
|
||||||
UD_Iverw,
|
|
||||||
UD_Ivmcall,
|
|
||||||
UD_Ivmclear,
|
|
||||||
UD_Ivmxon,
|
|
||||||
UD_Ivmptrld,
|
|
||||||
UD_Ivmptrst,
|
|
||||||
UD_Ivmlaunch,
|
|
||||||
UD_Ivmresume,
|
|
||||||
UD_Ivmxoff,
|
|
||||||
UD_Ivmread,
|
|
||||||
UD_Ivmwrite,
|
|
||||||
UD_Ivmrun,
|
|
||||||
UD_Ivmmcall,
|
|
||||||
UD_Ivmload,
|
|
||||||
UD_Ivmsave,
|
|
||||||
UD_Iwait,
|
|
||||||
UD_Iwbinvd,
|
|
||||||
UD_Iwrmsr,
|
|
||||||
UD_Ixadd,
|
|
||||||
UD_Ixchg,
|
|
||||||
UD_Ixgetbv,
|
|
||||||
UD_Ixlatb,
|
|
||||||
UD_Ixor,
|
|
||||||
UD_Ixorpd,
|
|
||||||
UD_Ixorps,
|
|
||||||
UD_Ixcryptecb,
|
|
||||||
UD_Ixcryptcbc,
|
|
||||||
UD_Ixcryptctr,
|
|
||||||
UD_Ixcryptcfb,
|
|
||||||
UD_Ixcryptofb,
|
|
||||||
UD_Ixrstor,
|
|
||||||
UD_Ixsave,
|
|
||||||
UD_Ixsetbv,
|
|
||||||
UD_Ixsha1,
|
|
||||||
UD_Ixsha256,
|
|
||||||
UD_Ixstore,
|
|
||||||
UD_Iaesdec,
|
|
||||||
UD_Iaesdeclast,
|
|
||||||
UD_Iaesenc,
|
|
||||||
UD_Iaesenclast,
|
|
||||||
UD_Iaesimc,
|
|
||||||
UD_Iaeskeygenassist,
|
|
||||||
UD_Ipclmulqdq,
|
|
||||||
UD_Igetsec,
|
|
||||||
UD_Imovdqa,
|
|
||||||
UD_Imaskmovdqu,
|
|
||||||
UD_Imovdq2q,
|
|
||||||
UD_Imovdqu,
|
|
||||||
UD_Imovq2dq,
|
|
||||||
UD_Ipaddq,
|
|
||||||
UD_Ipsubq,
|
|
||||||
UD_Ipmuludq,
|
|
||||||
UD_Ipshufhw,
|
|
||||||
UD_Ipshuflw,
|
|
||||||
UD_Ipshufd,
|
|
||||||
UD_Ipslldq,
|
|
||||||
UD_Ipsrldq,
|
|
||||||
UD_Ipunpckhqdq,
|
|
||||||
UD_Ipunpcklqdq,
|
|
||||||
UD_Iaddsubpd,
|
|
||||||
UD_Iaddsubps,
|
|
||||||
UD_Ihaddpd,
|
|
||||||
UD_Ihaddps,
|
|
||||||
UD_Ihsubpd,
|
|
||||||
UD_Ihsubps,
|
|
||||||
UD_Imovddup,
|
|
||||||
UD_Imovshdup,
|
|
||||||
UD_Imovsldup,
|
|
||||||
UD_Ipabsb,
|
|
||||||
UD_Ipabsw,
|
|
||||||
UD_Ipabsd,
|
|
||||||
UD_Ipshufb,
|
|
||||||
UD_Iphaddw,
|
|
||||||
UD_Iphaddd,
|
|
||||||
UD_Iphaddsw,
|
|
||||||
UD_Ipmaddubsw,
|
|
||||||
UD_Iphsubw,
|
|
||||||
UD_Iphsubd,
|
|
||||||
UD_Iphsubsw,
|
|
||||||
UD_Ipsignb,
|
|
||||||
UD_Ipsignd,
|
|
||||||
UD_Ipsignw,
|
|
||||||
UD_Ipmulhrsw,
|
|
||||||
UD_Ipalignr,
|
|
||||||
UD_Ipblendvb,
|
|
||||||
UD_Ipmuldq,
|
|
||||||
UD_Ipminsb,
|
|
||||||
UD_Ipminsd,
|
|
||||||
UD_Ipminuw,
|
|
||||||
UD_Ipminud,
|
|
||||||
UD_Ipmaxsb,
|
|
||||||
UD_Ipmaxsd,
|
|
||||||
UD_Ipmaxud,
|
|
||||||
UD_Ipmaxuw,
|
|
||||||
UD_Ipmulld,
|
|
||||||
UD_Iphminposuw,
|
|
||||||
UD_Iroundps,
|
|
||||||
UD_Iroundpd,
|
|
||||||
UD_Iroundss,
|
|
||||||
UD_Iroundsd,
|
|
||||||
UD_Iblendpd,
|
|
||||||
UD_Ipblendw,
|
|
||||||
UD_Iblendps,
|
|
||||||
UD_Iblendvpd,
|
|
||||||
UD_Iblendvps,
|
|
||||||
UD_Idpps,
|
|
||||||
UD_Idppd,
|
|
||||||
UD_Impsadbw,
|
|
||||||
UD_Iextractps,
|
|
||||||
UD_Iinsertps,
|
|
||||||
UD_Imovntdqa,
|
|
||||||
UD_Ipackusdw,
|
|
||||||
UD_Ipmovsxbw,
|
|
||||||
UD_Ipmovsxbd,
|
|
||||||
UD_Ipmovsxbq,
|
|
||||||
UD_Ipmovsxwd,
|
|
||||||
UD_Ipmovsxwq,
|
|
||||||
UD_Ipmovsxdq,
|
|
||||||
UD_Ipmovzxbw,
|
|
||||||
UD_Ipmovzxbd,
|
|
||||||
UD_Ipmovzxbq,
|
|
||||||
UD_Ipmovzxwd,
|
|
||||||
UD_Ipmovzxwq,
|
|
||||||
UD_Ipmovzxdq,
|
|
||||||
UD_Ipcmpeqq,
|
|
||||||
UD_Ipopcnt,
|
|
||||||
UD_Iptest,
|
|
||||||
UD_Ipcmpestri,
|
|
||||||
UD_Ipcmpestrm,
|
|
||||||
UD_Ipcmpgtq,
|
|
||||||
UD_Ipcmpistri,
|
|
||||||
UD_Ipcmpistrm,
|
|
||||||
UD_Imovbe,
|
|
||||||
UD_Icrc32,
|
|
||||||
UD_MAX_MNEMONIC_CODE
|
|
||||||
} UD_ATTR_PACKED;
|
|
||||||
|
|
||||||
extern const char * ud_mnemonics_str[];
|
|
||||||
|
|
||||||
#endif /* UD_ITAB_H */
|
|
||||||
@ -1,224 +0,0 @@
|
|||||||
/* udis86 - libudis86/syn-att.c
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
#include "types.h"
|
|
||||||
#include "extern.h"
|
|
||||||
#include "decode.h"
|
|
||||||
#include "itab.h"
|
|
||||||
#include "syn.h"
|
|
||||||
#include "udint.h"
|
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
|
||||||
* opr_cast() - Prints an operand cast.
|
|
||||||
* -----------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
opr_cast(struct ud* u, struct ud_operand* op)
|
|
||||||
{
|
|
||||||
switch(op->size) {
|
|
||||||
case 16 : case 32 :
|
|
||||||
ud_asmprintf(u, "*"); break;
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
|
||||||
* gen_operand() - Generates assembly output for each operand.
|
|
||||||
* -----------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
gen_operand(struct ud* u, struct ud_operand* op)
|
|
||||||
{
|
|
||||||
switch(op->type) {
|
|
||||||
case UD_OP_CONST:
|
|
||||||
ud_asmprintf(u, "$0x%x", op->lval.udword);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case UD_OP_REG:
|
|
||||||
ud_asmprintf(u, "%%%s", ud_reg_tab[op->base - UD_R_AL]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case UD_OP_MEM:
|
|
||||||
if (u->br_far) {
|
|
||||||
opr_cast(u, op);
|
|
||||||
}
|
|
||||||
if (u->pfx_seg) {
|
|
||||||
ud_asmprintf(u, "%%%s:", ud_reg_tab[u->pfx_seg - UD_R_AL]);
|
|
||||||
}
|
|
||||||
if (op->offset != 0) {
|
|
||||||
ud_syn_print_mem_disp(u, op, 0);
|
|
||||||
}
|
|
||||||
if (op->base) {
|
|
||||||
ud_asmprintf(u, "(%%%s", ud_reg_tab[op->base - UD_R_AL]);
|
|
||||||
}
|
|
||||||
if (op->index) {
|
|
||||||
if (op->base) {
|
|
||||||
ud_asmprintf(u, ",");
|
|
||||||
} else {
|
|
||||||
ud_asmprintf(u, "(");
|
|
||||||
}
|
|
||||||
ud_asmprintf(u, "%%%s", ud_reg_tab[op->index - UD_R_AL]);
|
|
||||||
}
|
|
||||||
if (op->scale) {
|
|
||||||
ud_asmprintf(u, ",%d", op->scale);
|
|
||||||
}
|
|
||||||
if (op->base || op->index) {
|
|
||||||
ud_asmprintf(u, ")");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case UD_OP_IMM:
|
|
||||||
ud_asmprintf(u, "$");
|
|
||||||
ud_syn_print_imm(u, op);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case UD_OP_JIMM:
|
|
||||||
ud_syn_print_addr(u, ud_syn_rel_target(u, op));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case UD_OP_PTR:
|
|
||||||
switch (op->size) {
|
|
||||||
case 32:
|
|
||||||
ud_asmprintf(u, "$0x%x, $0x%x", op->lval.ptr.seg,
|
|
||||||
op->lval.ptr.off & 0xFFFF);
|
|
||||||
break;
|
|
||||||
case 48:
|
|
||||||
ud_asmprintf(u, "$0x%x, $0x%x", op->lval.ptr.seg,
|
|
||||||
op->lval.ptr.off);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default: return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* =============================================================================
|
|
||||||
* translates to AT&T syntax
|
|
||||||
* =============================================================================
|
|
||||||
*/
|
|
||||||
extern void
|
|
||||||
ud_translate_att(struct ud *u)
|
|
||||||
{
|
|
||||||
int size = 0;
|
|
||||||
int star = 0;
|
|
||||||
|
|
||||||
/* check if P_OSO prefix is used */
|
|
||||||
if (! P_OSO(u->itab_entry->prefix) && u->pfx_opr) {
|
|
||||||
switch (u->dis_mode) {
|
|
||||||
case 16:
|
|
||||||
ud_asmprintf(u, "o32 ");
|
|
||||||
break;
|
|
||||||
case 32:
|
|
||||||
case 64:
|
|
||||||
ud_asmprintf(u, "o16 ");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check if P_ASO prefix was used */
|
|
||||||
if (! P_ASO(u->itab_entry->prefix) && u->pfx_adr) {
|
|
||||||
switch (u->dis_mode) {
|
|
||||||
case 16:
|
|
||||||
ud_asmprintf(u, "a32 ");
|
|
||||||
break;
|
|
||||||
case 32:
|
|
||||||
ud_asmprintf(u, "a16 ");
|
|
||||||
break;
|
|
||||||
case 64:
|
|
||||||
ud_asmprintf(u, "a32 ");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (u->pfx_lock)
|
|
||||||
ud_asmprintf(u, "lock ");
|
|
||||||
if (u->pfx_rep) {
|
|
||||||
ud_asmprintf(u, "rep ");
|
|
||||||
} else if (u->pfx_rep) {
|
|
||||||
ud_asmprintf(u, "repe ");
|
|
||||||
} else if (u->pfx_repne) {
|
|
||||||
ud_asmprintf(u, "repne ");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* special instructions */
|
|
||||||
switch (u->mnemonic) {
|
|
||||||
case UD_Iretf:
|
|
||||||
ud_asmprintf(u, "lret ");
|
|
||||||
break;
|
|
||||||
case UD_Idb:
|
|
||||||
ud_asmprintf(u, ".byte 0x%x", u->operand[0].lval.ubyte);
|
|
||||||
return;
|
|
||||||
case UD_Ijmp:
|
|
||||||
case UD_Icall:
|
|
||||||
if (u->br_far) ud_asmprintf(u, "l");
|
|
||||||
if (u->operand[0].type == UD_OP_REG) {
|
|
||||||
star = 1;
|
|
||||||
}
|
|
||||||
ud_asmprintf(u, "%s", ud_lookup_mnemonic(u->mnemonic));
|
|
||||||
break;
|
|
||||||
case UD_Ibound:
|
|
||||||
case UD_Ienter:
|
|
||||||
if (u->operand[0].type != UD_NONE)
|
|
||||||
gen_operand(u, &u->operand[0]);
|
|
||||||
if (u->operand[1].type != UD_NONE) {
|
|
||||||
ud_asmprintf(u, ",");
|
|
||||||
gen_operand(u, &u->operand[1]);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
default:
|
|
||||||
ud_asmprintf(u, "%s", ud_lookup_mnemonic(u->mnemonic));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (size == 8)
|
|
||||||
ud_asmprintf(u, "b");
|
|
||||||
else if (size == 16)
|
|
||||||
ud_asmprintf(u, "w");
|
|
||||||
else if (size == 64)
|
|
||||||
ud_asmprintf(u, "q");
|
|
||||||
|
|
||||||
if (star) {
|
|
||||||
ud_asmprintf(u, " *");
|
|
||||||
} else {
|
|
||||||
ud_asmprintf(u, " ");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (u->operand[2].type != UD_NONE) {
|
|
||||||
gen_operand(u, &u->operand[2]);
|
|
||||||
ud_asmprintf(u, ", ");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (u->operand[1].type != UD_NONE) {
|
|
||||||
gen_operand(u, &u->operand[1]);
|
|
||||||
ud_asmprintf(u, ", ");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (u->operand[0].type != UD_NONE)
|
|
||||||
gen_operand(u, &u->operand[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
vim: set ts=2 sw=2 expandtab
|
|
||||||
*/
|
|
||||||
@ -1,213 +0,0 @@
|
|||||||
/* udis86 - libudis86/syn-intel.c
|
|
||||||
*
|
|
||||||
* Copyright (c) 2002-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.
|
|
||||||
*/
|
|
||||||
#include "types.h"
|
|
||||||
#include "extern.h"
|
|
||||||
#include "decode.h"
|
|
||||||
#include "itab.h"
|
|
||||||
#include "syn.h"
|
|
||||||
#include "udint.h"
|
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
|
||||||
* opr_cast() - Prints an operand cast.
|
|
||||||
* -----------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
opr_cast(struct ud* u, struct ud_operand* op)
|
|
||||||
{
|
|
||||||
if (u->br_far) {
|
|
||||||
ud_asmprintf(u, "far ");
|
|
||||||
}
|
|
||||||
switch(op->size) {
|
|
||||||
case 8: ud_asmprintf(u, "byte " ); break;
|
|
||||||
case 16: ud_asmprintf(u, "word " ); break;
|
|
||||||
case 32: ud_asmprintf(u, "dword "); break;
|
|
||||||
case 64: ud_asmprintf(u, "qword "); break;
|
|
||||||
case 80: ud_asmprintf(u, "tword "); break;
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
|
||||||
* gen_operand() - Generates assembly output for each operand.
|
|
||||||
* -----------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
static void gen_operand(struct ud* u, struct ud_operand* op, int syn_cast)
|
|
||||||
{
|
|
||||||
switch(op->type) {
|
|
||||||
case UD_OP_REG:
|
|
||||||
ud_asmprintf(u, "%s", ud_reg_tab[op->base - UD_R_AL]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case UD_OP_MEM:
|
|
||||||
if (syn_cast) {
|
|
||||||
opr_cast(u, op);
|
|
||||||
}
|
|
||||||
ud_asmprintf(u, "[");
|
|
||||||
if (u->pfx_seg) {
|
|
||||||
ud_asmprintf(u, "%s:", ud_reg_tab[u->pfx_seg - UD_R_AL]);
|
|
||||||
}
|
|
||||||
if (op->base) {
|
|
||||||
ud_asmprintf(u, "%s", ud_reg_tab[op->base - UD_R_AL]);
|
|
||||||
}
|
|
||||||
if (op->index) {
|
|
||||||
ud_asmprintf(u, "%s%s", op->base != UD_NONE? "+" : "",
|
|
||||||
ud_reg_tab[op->index - UD_R_AL]);
|
|
||||||
if (op->scale) {
|
|
||||||
ud_asmprintf(u, "*%d", op->scale);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (op->offset != 0) {
|
|
||||||
ud_syn_print_mem_disp(u, op, (op->base != UD_NONE ||
|
|
||||||
op->index != UD_NONE) ? 1 : 0);
|
|
||||||
}
|
|
||||||
ud_asmprintf(u, "]");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case UD_OP_IMM:
|
|
||||||
ud_syn_print_imm(u, op);
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
|
||||||
case UD_OP_JIMM:
|
|
||||||
ud_syn_print_addr(u, ud_syn_rel_target(u, op));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case UD_OP_PTR:
|
|
||||||
switch (op->size) {
|
|
||||||
case 32:
|
|
||||||
ud_asmprintf(u, "word 0x%x:0x%x", op->lval.ptr.seg,
|
|
||||||
op->lval.ptr.off & 0xFFFF);
|
|
||||||
break;
|
|
||||||
case 48:
|
|
||||||
ud_asmprintf(u, "dword 0x%x:0x%x", op->lval.ptr.seg,
|
|
||||||
op->lval.ptr.off);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case UD_OP_CONST:
|
|
||||||
if (syn_cast) opr_cast(u, op);
|
|
||||||
ud_asmprintf(u, "%d", op->lval.udword);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default: return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* =============================================================================
|
|
||||||
* translates to intel syntax
|
|
||||||
* =============================================================================
|
|
||||||
*/
|
|
||||||
extern void
|
|
||||||
ud_translate_intel(struct ud* u)
|
|
||||||
{
|
|
||||||
/* check if P_OSO prefix is used */
|
|
||||||
if (!P_OSO(u->itab_entry->prefix) && u->pfx_opr) {
|
|
||||||
switch (u->dis_mode) {
|
|
||||||
case 16: ud_asmprintf(u, "o32 "); break;
|
|
||||||
case 32:
|
|
||||||
case 64: ud_asmprintf(u, "o16 "); break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check if P_ASO prefix was used */
|
|
||||||
if (!P_ASO(u->itab_entry->prefix) && u->pfx_adr) {
|
|
||||||
switch (u->dis_mode) {
|
|
||||||
case 16: ud_asmprintf(u, "a32 "); break;
|
|
||||||
case 32: ud_asmprintf(u, "a16 "); break;
|
|
||||||
case 64: ud_asmprintf(u, "a32 "); break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (u->pfx_seg &&
|
|
||||||
u->operand[0].type != UD_OP_MEM &&
|
|
||||||
u->operand[1].type != UD_OP_MEM ) {
|
|
||||||
ud_asmprintf(u, "%s ", ud_reg_tab[u->pfx_seg - UD_R_AL]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (u->pfx_lock) {
|
|
||||||
ud_asmprintf(u, "lock ");
|
|
||||||
}
|
|
||||||
if (u->pfx_rep) {
|
|
||||||
ud_asmprintf(u, "rep ");
|
|
||||||
} else if (u->pfx_repe) {
|
|
||||||
ud_asmprintf(u, "repe ");
|
|
||||||
} else if (u->pfx_repne) {
|
|
||||||
ud_asmprintf(u, "repne ");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* print the instruction mnemonic */
|
|
||||||
ud_asmprintf(u, "%s", ud_lookup_mnemonic(u->mnemonic));
|
|
||||||
|
|
||||||
if (u->operand[0].type != UD_NONE) {
|
|
||||||
int cast = 0;
|
|
||||||
ud_asmprintf(u, " ");
|
|
||||||
if (u->operand[0].type == UD_OP_MEM) {
|
|
||||||
if (u->operand[1].type == UD_OP_IMM ||
|
|
||||||
u->operand[1].type == UD_OP_CONST ||
|
|
||||||
u->operand[1].type == UD_NONE ||
|
|
||||||
(u->operand[0].size != u->operand[1].size &&
|
|
||||||
u->operand[1].type != UD_OP_REG)) {
|
|
||||||
cast = 1;
|
|
||||||
} else if (u->operand[1].type == UD_OP_REG &&
|
|
||||||
u->operand[1].base == UD_R_CL) {
|
|
||||||
switch (u->mnemonic) {
|
|
||||||
case UD_Ircl:
|
|
||||||
case UD_Irol:
|
|
||||||
case UD_Iror:
|
|
||||||
case UD_Ircr:
|
|
||||||
case UD_Ishl:
|
|
||||||
case UD_Ishr:
|
|
||||||
case UD_Isar:
|
|
||||||
cast = 1;
|
|
||||||
break;
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
gen_operand(u, &u->operand[0], cast);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (u->operand[1].type != UD_NONE) {
|
|
||||||
int cast = 0;
|
|
||||||
ud_asmprintf(u, ", ");
|
|
||||||
if (u->operand[1].type == UD_OP_MEM &&
|
|
||||||
u->operand[0].size != u->operand[1].size &&
|
|
||||||
!ud_opr_is_sreg(&u->operand[0])) {
|
|
||||||
cast = 1;
|
|
||||||
}
|
|
||||||
gen_operand(u, &u->operand[1], cast);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (u->operand[2].type != UD_NONE) {
|
|
||||||
ud_asmprintf(u, ", ");
|
|
||||||
gen_operand(u, &u->operand[2], 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
vim: set ts=2 sw=2 expandtab
|
|
||||||
*/
|
|
||||||
@ -1,207 +0,0 @@
|
|||||||
/* udis86 - libudis86/syn.c
|
|
||||||
*
|
|
||||||
* Copyright (c) 2002-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.
|
|
||||||
*/
|
|
||||||
#include "types.h"
|
|
||||||
#include "decode.h"
|
|
||||||
#include "syn.h"
|
|
||||||
#include "udint.h"
|
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
|
||||||
* Intel Register Table - Order Matters (types.h)!
|
|
||||||
* -----------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
const char* ud_reg_tab[] =
|
|
||||||
{
|
|
||||||
"al", "cl", "dl", "bl",
|
|
||||||
"ah", "ch", "dh", "bh",
|
|
||||||
"spl", "bpl", "sil", "dil",
|
|
||||||
"r8b", "r9b", "r10b", "r11b",
|
|
||||||
"r12b", "r13b", "r14b", "r15b",
|
|
||||||
|
|
||||||
"ax", "cx", "dx", "bx",
|
|
||||||
"sp", "bp", "si", "di",
|
|
||||||
"r8w", "r9w", "r10w", "r11w",
|
|
||||||
"r12w", "r13w" , "r14w", "r15w",
|
|
||||||
|
|
||||||
"eax", "ecx", "edx", "ebx",
|
|
||||||
"esp", "ebp", "esi", "edi",
|
|
||||||
"r8d", "r9d", "r10d", "r11d",
|
|
||||||
"r12d", "r13d", "r14d", "r15d",
|
|
||||||
|
|
||||||
"rax", "rcx", "rdx", "rbx",
|
|
||||||
"rsp", "rbp", "rsi", "rdi",
|
|
||||||
"r8", "r9", "r10", "r11",
|
|
||||||
"r12", "r13", "r14", "r15",
|
|
||||||
|
|
||||||
"es", "cs", "ss", "ds",
|
|
||||||
"fs", "gs",
|
|
||||||
|
|
||||||
"cr0", "cr1", "cr2", "cr3",
|
|
||||||
"cr4", "cr5", "cr6", "cr7",
|
|
||||||
"cr8", "cr9", "cr10", "cr11",
|
|
||||||
"cr12", "cr13", "cr14", "cr15",
|
|
||||||
|
|
||||||
"dr0", "dr1", "dr2", "dr3",
|
|
||||||
"dr4", "dr5", "dr6", "dr7",
|
|
||||||
"dr8", "dr9", "dr10", "dr11",
|
|
||||||
"dr12", "dr13", "dr14", "dr15",
|
|
||||||
|
|
||||||
"mm0", "mm1", "mm2", "mm3",
|
|
||||||
"mm4", "mm5", "mm6", "mm7",
|
|
||||||
|
|
||||||
"st0", "st1", "st2", "st3",
|
|
||||||
"st4", "st5", "st6", "st7",
|
|
||||||
|
|
||||||
"xmm0", "xmm1", "xmm2", "xmm3",
|
|
||||||
"xmm4", "xmm5", "xmm6", "xmm7",
|
|
||||||
"xmm8", "xmm9", "xmm10", "xmm11",
|
|
||||||
"xmm12", "xmm13", "xmm14", "xmm15",
|
|
||||||
|
|
||||||
"rip"
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
uint64_t
|
|
||||||
ud_syn_rel_target(struct ud *u, struct ud_operand *opr)
|
|
||||||
{
|
|
||||||
const uint64_t trunc_mask = 0xffffffffffffffffull >> (64 - u->opr_mode);
|
|
||||||
switch (opr->size) {
|
|
||||||
case 8 : return (u->pc + opr->lval.sbyte) & trunc_mask;
|
|
||||||
case 16: return (u->pc + opr->lval.sword) & trunc_mask;
|
|
||||||
case 32: return (u->pc + opr->lval.sdword) & trunc_mask;
|
|
||||||
default: UD_ASSERT(!"invalid relative offset size.");
|
|
||||||
return 0ull;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* asmprintf
|
|
||||||
* Printf style function for printing translated assembly
|
|
||||||
* output. Returns the number of characters written and
|
|
||||||
* moves the buffer pointer forward. On an overflow,
|
|
||||||
* returns a negative number and truncates the output.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
ud_asmprintf(struct ud *u, const char *fmt, ...)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
int avail;
|
|
||||||
va_list ap;
|
|
||||||
va_start(ap, fmt);
|
|
||||||
avail = u->asm_buf_size - u->asm_buf_fill - 1 /* nullchar */;
|
|
||||||
ret = vsnprintf((char*) u->asm_buf + u->asm_buf_fill, avail, fmt, ap);
|
|
||||||
if (ret < 0 || ret > avail) {
|
|
||||||
u->asm_buf_fill = u->asm_buf_size - 1;
|
|
||||||
} else {
|
|
||||||
u->asm_buf_fill += ret;
|
|
||||||
}
|
|
||||||
va_end(ap);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
ud_syn_print_addr(struct ud *u, uint64_t addr)
|
|
||||||
{
|
|
||||||
const char *name = NULL;
|
|
||||||
if (u->sym_resolver) {
|
|
||||||
int64_t offset = 0;
|
|
||||||
name = u->sym_resolver(u, addr, &offset);
|
|
||||||
if (name) {
|
|
||||||
if (offset) {
|
|
||||||
ud_asmprintf(u, "%s%+" FMT64 "d", name, offset);
|
|
||||||
} else {
|
|
||||||
ud_asmprintf(u, "%s", name);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ud_asmprintf(u, "0x%" FMT64 "x", addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
ud_syn_print_imm(struct ud* u, const struct ud_operand *op)
|
|
||||||
{
|
|
||||||
uint64_t v;
|
|
||||||
if (op->_oprcode == OP_sI && op->size != u->opr_mode) {
|
|
||||||
if (op->size == 8) {
|
|
||||||
v = (int64_t)op->lval.sbyte;
|
|
||||||
} else {
|
|
||||||
UD_ASSERT(op->size == 32);
|
|
||||||
v = (int64_t)op->lval.sdword;
|
|
||||||
}
|
|
||||||
if (u->opr_mode < 64) {
|
|
||||||
v = v & ((1ull << u->opr_mode) - 1ull);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
switch (op->size) {
|
|
||||||
case 8 : v = op->lval.ubyte; break;
|
|
||||||
case 16: v = op->lval.uword; break;
|
|
||||||
case 32: v = op->lval.udword; break;
|
|
||||||
case 64: v = op->lval.uqword; break;
|
|
||||||
default: UD_ASSERT(!"invalid offset"); v = 0; /* keep cc happy */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ud_asmprintf(u, "0x%" FMT64 "x", v);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
ud_syn_print_mem_disp(struct ud* u, const struct ud_operand *op, int sign)
|
|
||||||
{
|
|
||||||
UD_ASSERT(op->offset != 0);
|
|
||||||
if (op->base == UD_NONE && op->index == UD_NONE) {
|
|
||||||
uint64_t v;
|
|
||||||
UD_ASSERT(op->scale == UD_NONE && op->offset != 8);
|
|
||||||
/* unsigned mem-offset */
|
|
||||||
switch (op->offset) {
|
|
||||||
case 16: v = op->lval.uword; break;
|
|
||||||
case 32: v = op->lval.udword; break;
|
|
||||||
case 64: v = op->lval.uqword; break;
|
|
||||||
default: UD_ASSERT(!"invalid offset"); v = 0; /* keep cc happy */
|
|
||||||
}
|
|
||||||
ud_asmprintf(u, "0x%" FMT64 "x", v);
|
|
||||||
} else {
|
|
||||||
int64_t v;
|
|
||||||
UD_ASSERT(op->offset != 64);
|
|
||||||
switch (op->offset) {
|
|
||||||
case 8 : v = op->lval.sbyte; break;
|
|
||||||
case 16: v = op->lval.sword; break;
|
|
||||||
case 32: v = op->lval.sdword; break;
|
|
||||||
default: UD_ASSERT(!"invalid offset"); v = 0; /* keep cc happy */
|
|
||||||
}
|
|
||||||
if (v < 0) {
|
|
||||||
ud_asmprintf(u, "-0x%" FMT64 "x", -v);
|
|
||||||
} else if (v > 0) {
|
|
||||||
ud_asmprintf(u, "%s0x%" FMT64 "x", sign? "+" : "", v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
vim: set ts=2 sw=2 expandtab
|
|
||||||
*/
|
|
||||||
@ -1,53 +0,0 @@
|
|||||||
/* udis86 - libudis86/syn.h
|
|
||||||
*
|
|
||||||
* Copyright (c) 2002-2009
|
|
||||||
* 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_SYN_H
|
|
||||||
#define UD_SYN_H
|
|
||||||
|
|
||||||
#include "types.h"
|
|
||||||
#ifndef __UD_STANDALONE__
|
|
||||||
# include <stdarg.h>
|
|
||||||
#endif /* __UD_STANDALONE__ */
|
|
||||||
|
|
||||||
extern const char* ud_reg_tab[];
|
|
||||||
|
|
||||||
uint64_t ud_syn_rel_target(struct ud*, struct ud_operand*);
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
int ud_asmprintf(struct ud *u, const char *fmt, ...)
|
|
||||||
__attribute__ ((format (printf, 2, 3)));
|
|
||||||
#else
|
|
||||||
int ud_asmprintf(struct ud *u, const char *fmt, ...);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void ud_syn_print_addr(struct ud *u, uint64_t addr);
|
|
||||||
void ud_syn_print_imm(struct ud* u, const struct ud_operand *op);
|
|
||||||
void ud_syn_print_mem_disp(struct ud* u, const struct ud_operand *, int sign);
|
|
||||||
|
|
||||||
#endif /* UD_SYN_H */
|
|
||||||
|
|
||||||
/*
|
|
||||||
vim: set ts=2 sw=2 expandtab
|
|
||||||
*/
|
|
||||||
@ -1,250 +0,0 @@
|
|||||||
/* udis86 - libudis86/types.h
|
|
||||||
*
|
|
||||||
* Copyright (c) 2002-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_TYPES_H
|
|
||||||
#define UD_TYPES_H
|
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
|
||||||
/* -D__KERNEL__ is automatically passed on the command line when
|
|
||||||
building something as part of the Linux kernel */
|
|
||||||
# include <linux/kernel.h>
|
|
||||||
# include <linux/string.h>
|
|
||||||
# ifndef __UD_STANDALONE__
|
|
||||||
# define __UD_STANDALONE__ 1
|
|
||||||
#endif
|
|
||||||
#endif /* __KERNEL__ */
|
|
||||||
|
|
||||||
#if defined(_MSC_VER) || defined(__BORLANDC__)
|
|
||||||
# include <stdint.h>
|
|
||||||
# include <stdio.h>
|
|
||||||
# define inline __inline /* MS Visual Studio requires __inline
|
|
||||||
instead of inline for C code */
|
|
||||||
#elif !defined(__UD_STANDALONE__)
|
|
||||||
# include <stdio.h>
|
|
||||||
# include <inttypes.h>
|
|
||||||
#endif /* !__UD_STANDALONE__ */
|
|
||||||
|
|
||||||
/* gcc specific extensions */
|
|
||||||
#ifdef __GNUC__
|
|
||||||
# define UD_ATTR_PACKED __attribute__((packed))
|
|
||||||
#else
|
|
||||||
# define UD_ATTR_PACKED
|
|
||||||
#endif /* UD_ATTR_PACKED */
|
|
||||||
|
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
|
||||||
* All possible "types" of objects in udis86. Order is Important!
|
|
||||||
* -----------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
enum ud_type
|
|
||||||
{
|
|
||||||
UD_NONE,
|
|
||||||
|
|
||||||
/* 8 bit GPRs */
|
|
||||||
UD_R_AL, UD_R_CL, UD_R_DL, UD_R_BL,
|
|
||||||
UD_R_AH, UD_R_CH, UD_R_DH, UD_R_BH,
|
|
||||||
UD_R_SPL, UD_R_BPL, UD_R_SIL, UD_R_DIL,
|
|
||||||
UD_R_R8B, UD_R_R9B, UD_R_R10B, UD_R_R11B,
|
|
||||||
UD_R_R12B, UD_R_R13B, UD_R_R14B, UD_R_R15B,
|
|
||||||
|
|
||||||
/* 16 bit GPRs */
|
|
||||||
UD_R_AX, UD_R_CX, UD_R_DX, UD_R_BX,
|
|
||||||
UD_R_SP, UD_R_BP, UD_R_SI, UD_R_DI,
|
|
||||||
UD_R_R8W, UD_R_R9W, UD_R_R10W, UD_R_R11W,
|
|
||||||
UD_R_R12W, UD_R_R13W, UD_R_R14W, UD_R_R15W,
|
|
||||||
|
|
||||||
/* 32 bit GPRs */
|
|
||||||
UD_R_EAX, UD_R_ECX, UD_R_EDX, UD_R_EBX,
|
|
||||||
UD_R_ESP, UD_R_EBP, UD_R_ESI, UD_R_EDI,
|
|
||||||
UD_R_R8D, UD_R_R9D, UD_R_R10D, UD_R_R11D,
|
|
||||||
UD_R_R12D, UD_R_R13D, UD_R_R14D, UD_R_R15D,
|
|
||||||
|
|
||||||
/* 64 bit GPRs */
|
|
||||||
UD_R_RAX, UD_R_RCX, UD_R_RDX, UD_R_RBX,
|
|
||||||
UD_R_RSP, UD_R_RBP, UD_R_RSI, UD_R_RDI,
|
|
||||||
UD_R_R8, UD_R_R9, UD_R_R10, UD_R_R11,
|
|
||||||
UD_R_R12, UD_R_R13, UD_R_R14, UD_R_R15,
|
|
||||||
|
|
||||||
/* segment registers */
|
|
||||||
UD_R_ES, UD_R_CS, UD_R_SS, UD_R_DS,
|
|
||||||
UD_R_FS, UD_R_GS,
|
|
||||||
|
|
||||||
/* control registers*/
|
|
||||||
UD_R_CR0, UD_R_CR1, UD_R_CR2, UD_R_CR3,
|
|
||||||
UD_R_CR4, UD_R_CR5, UD_R_CR6, UD_R_CR7,
|
|
||||||
UD_R_CR8, UD_R_CR9, UD_R_CR10, UD_R_CR11,
|
|
||||||
UD_R_CR12, UD_R_CR13, UD_R_CR14, UD_R_CR15,
|
|
||||||
|
|
||||||
/* debug registers */
|
|
||||||
UD_R_DR0, UD_R_DR1, UD_R_DR2, UD_R_DR3,
|
|
||||||
UD_R_DR4, UD_R_DR5, UD_R_DR6, UD_R_DR7,
|
|
||||||
UD_R_DR8, UD_R_DR9, UD_R_DR10, UD_R_DR11,
|
|
||||||
UD_R_DR12, UD_R_DR13, UD_R_DR14, UD_R_DR15,
|
|
||||||
|
|
||||||
/* mmx registers */
|
|
||||||
UD_R_MM0, UD_R_MM1, UD_R_MM2, UD_R_MM3,
|
|
||||||
UD_R_MM4, UD_R_MM5, UD_R_MM6, UD_R_MM7,
|
|
||||||
|
|
||||||
/* x87 registers */
|
|
||||||
UD_R_ST0, UD_R_ST1, UD_R_ST2, UD_R_ST3,
|
|
||||||
UD_R_ST4, UD_R_ST5, UD_R_ST6, UD_R_ST7,
|
|
||||||
|
|
||||||
/* extended multimedia registers */
|
|
||||||
UD_R_XMM0, UD_R_XMM1, UD_R_XMM2, UD_R_XMM3,
|
|
||||||
UD_R_XMM4, UD_R_XMM5, UD_R_XMM6, UD_R_XMM7,
|
|
||||||
UD_R_XMM8, UD_R_XMM9, UD_R_XMM10, UD_R_XMM11,
|
|
||||||
UD_R_XMM12, UD_R_XMM13, UD_R_XMM14, UD_R_XMM15,
|
|
||||||
|
|
||||||
UD_R_RIP,
|
|
||||||
|
|
||||||
/* Operand Types */
|
|
||||||
UD_OP_REG, UD_OP_MEM, UD_OP_PTR, UD_OP_IMM,
|
|
||||||
UD_OP_JIMM, UD_OP_CONST
|
|
||||||
};
|
|
||||||
|
|
||||||
#include "itab.h"
|
|
||||||
|
|
||||||
union ud_lval {
|
|
||||||
int8_t sbyte;
|
|
||||||
uint8_t ubyte;
|
|
||||||
int16_t sword;
|
|
||||||
uint16_t uword;
|
|
||||||
int32_t sdword;
|
|
||||||
uint32_t udword;
|
|
||||||
int64_t sqword;
|
|
||||||
uint64_t uqword;
|
|
||||||
struct {
|
|
||||||
uint16_t seg;
|
|
||||||
uint32_t off;
|
|
||||||
} ptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
|
||||||
* struct ud_operand - Disassembled instruction Operand.
|
|
||||||
* -----------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
struct ud_operand {
|
|
||||||
enum ud_type type;
|
|
||||||
uint8_t size;
|
|
||||||
enum ud_type base;
|
|
||||||
enum ud_type index;
|
|
||||||
uint8_t scale;
|
|
||||||
uint8_t offset;
|
|
||||||
union ud_lval lval;
|
|
||||||
/*
|
|
||||||
* internal use only
|
|
||||||
*/
|
|
||||||
uint64_t _legacy; /* this will be removed in 1.8 */
|
|
||||||
uint8_t _oprcode;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
|
||||||
* struct ud - The udis86 object.
|
|
||||||
* -----------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
struct ud
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* input buffering
|
|
||||||
*/
|
|
||||||
int (*inp_hook) (struct ud*);
|
|
||||||
#ifndef __UD_STANDALONE__
|
|
||||||
FILE* inp_file;
|
|
||||||
#endif
|
|
||||||
const uint8_t* inp_buf;
|
|
||||||
size_t inp_buf_size;
|
|
||||||
size_t inp_buf_index;
|
|
||||||
uint8_t inp_curr;
|
|
||||||
size_t inp_ctr;
|
|
||||||
uint8_t inp_sess[64];
|
|
||||||
int inp_end;
|
|
||||||
|
|
||||||
void (*translator)(struct ud*);
|
|
||||||
uint64_t insn_offset;
|
|
||||||
char insn_hexcode[64];
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Assembly output buffer
|
|
||||||
*/
|
|
||||||
char *asm_buf;
|
|
||||||
size_t asm_buf_size;
|
|
||||||
size_t asm_buf_fill;
|
|
||||||
char asm_buf_int[128];
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Symbol resolver for use in the translation phase.
|
|
||||||
*/
|
|
||||||
const char* (*sym_resolver)(struct ud*, uint64_t addr, int64_t *offset);
|
|
||||||
|
|
||||||
uint8_t dis_mode;
|
|
||||||
uint64_t pc;
|
|
||||||
uint8_t vendor;
|
|
||||||
enum ud_mnemonic_code mnemonic;
|
|
||||||
struct ud_operand operand[3];
|
|
||||||
uint8_t error;
|
|
||||||
uint8_t pfx_rex;
|
|
||||||
uint8_t pfx_seg;
|
|
||||||
uint8_t pfx_opr;
|
|
||||||
uint8_t pfx_adr;
|
|
||||||
uint8_t pfx_lock;
|
|
||||||
uint8_t pfx_str;
|
|
||||||
uint8_t pfx_rep;
|
|
||||||
uint8_t pfx_repe;
|
|
||||||
uint8_t pfx_repne;
|
|
||||||
uint8_t opr_mode;
|
|
||||||
uint8_t adr_mode;
|
|
||||||
uint8_t br_far;
|
|
||||||
uint8_t br_near;
|
|
||||||
uint8_t have_modrm;
|
|
||||||
uint8_t modrm;
|
|
||||||
uint8_t primary_opcode;
|
|
||||||
void * user_opaque_data;
|
|
||||||
struct ud_itab_entry * itab_entry;
|
|
||||||
struct ud_lookup_table_list_entry *le;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
|
||||||
* Type-definitions
|
|
||||||
* -----------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
typedef enum ud_type ud_type_t;
|
|
||||||
typedef enum ud_mnemonic_code ud_mnemonic_code_t;
|
|
||||||
|
|
||||||
typedef struct ud ud_t;
|
|
||||||
typedef struct ud_operand ud_operand_t;
|
|
||||||
|
|
||||||
#define UD_SYN_INTEL ud_translate_intel
|
|
||||||
#define UD_SYN_ATT ud_translate_att
|
|
||||||
#define UD_EOI (-1)
|
|
||||||
#define UD_INP_CACHE_SZ 32
|
|
||||||
#define UD_VENDOR_AMD 0
|
|
||||||
#define UD_VENDOR_INTEL 1
|
|
||||||
#define UD_VENDOR_ANY 2
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
vim: set ts=2 sw=2 expandtab
|
|
||||||
*/
|
|
||||||
@ -1,89 +0,0 @@
|
|||||||
/* udis86 - libudis86/udint.h -- definitions for internal use only
|
|
||||||
*
|
|
||||||
* 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 _UDINT_H_
|
|
||||||
#define _UDINT_H_
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
# include <config.h>
|
|
||||||
#endif /* HAVE_CONFIG_H */
|
|
||||||
|
|
||||||
#if defined(UD_DEBUG) && HAVE_ASSERT_H
|
|
||||||
# include <assert.h>
|
|
||||||
# define UD_ASSERT(_x) assert(_x)
|
|
||||||
#else
|
|
||||||
# define UD_ASSERT(_x)
|
|
||||||
#endif /* !HAVE_ASSERT_H */
|
|
||||||
|
|
||||||
#if defined(UD_DEBUG)
|
|
||||||
#define UDERR(u, msg) \
|
|
||||||
do { \
|
|
||||||
(u)->error = 1; \
|
|
||||||
fprintf(stderr, "decode-error: %s:%d: %s", \
|
|
||||||
__FILE__, __LINE__, (msg)); \
|
|
||||||
} while (0)
|
|
||||||
#else
|
|
||||||
#define UDERR(u, m) \
|
|
||||||
do { \
|
|
||||||
(u)->error = 1; \
|
|
||||||
} while (0)
|
|
||||||
#endif /* !LOGERR */
|
|
||||||
|
|
||||||
#define UD_RETURN_ON_ERROR(u) \
|
|
||||||
do { \
|
|
||||||
if ((u)->error != 0) { \
|
|
||||||
return (u)->error; \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define UD_RETURN_WITH_ERROR(u, m) \
|
|
||||||
do { \
|
|
||||||
UDERR(u, m); \
|
|
||||||
return (u)->error; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#ifndef __UD_STANDALONE__
|
|
||||||
# define UD_NON_STANDALONE(x) x
|
|
||||||
#else
|
|
||||||
# define UD_NON_STANDALONE(x)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* printf formatting int64 specifier */
|
|
||||||
#ifdef FMT64
|
|
||||||
# undef FMT64
|
|
||||||
#endif
|
|
||||||
#if defined(_MSC_VER) || defined(__BORLANDC__)
|
|
||||||
# define FMT64 "I64"
|
|
||||||
#else
|
|
||||||
# if defined(__APPLE__)
|
|
||||||
# define FMT64 "ll"
|
|
||||||
# elif defined(__amd64__) || defined(__x86_64__)
|
|
||||||
# define FMT64 "l"
|
|
||||||
# else
|
|
||||||
# define FMT64 "ll"
|
|
||||||
# endif /* !x64 */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _UDINT_H_ */
|
|
||||||
@ -1,457 +0,0 @@
|
|||||||
/* udis86 - libudis86/udis86.c
|
|
||||||
*
|
|
||||||
* Copyright (c) 2002-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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "udint.h"
|
|
||||||
#include "extern.h"
|
|
||||||
#include "decode.h"
|
|
||||||
|
|
||||||
#if !defined(__UD_STANDALONE__)
|
|
||||||
# if HAVE_STRING_H
|
|
||||||
# include <string.h>
|
|
||||||
# endif
|
|
||||||
#endif /* !__UD_STANDALONE__ */
|
|
||||||
|
|
||||||
static void ud_inp_init(struct ud *u);
|
|
||||||
|
|
||||||
/* =============================================================================
|
|
||||||
* ud_init
|
|
||||||
* Initializes ud_t object.
|
|
||||||
* =============================================================================
|
|
||||||
*/
|
|
||||||
extern void
|
|
||||||
ud_init(struct ud* u)
|
|
||||||
{
|
|
||||||
memset((void*)u, 0, sizeof(struct ud));
|
|
||||||
ud_set_mode(u, 16);
|
|
||||||
u->mnemonic = UD_Iinvalid;
|
|
||||||
ud_set_pc(u, 0);
|
|
||||||
#ifndef __UD_STANDALONE__
|
|
||||||
ud_set_input_file(u, stdin);
|
|
||||||
#endif /* __UD_STANDALONE__ */
|
|
||||||
|
|
||||||
ud_set_asm_buffer(u, u->asm_buf_int, sizeof(u->asm_buf_int));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* =============================================================================
|
|
||||||
* ud_disassemble
|
|
||||||
* Disassembles one instruction and returns the number of
|
|
||||||
* bytes disassembled. A zero means end of disassembly.
|
|
||||||
* =============================================================================
|
|
||||||
*/
|
|
||||||
extern unsigned int
|
|
||||||
ud_disassemble(struct ud* u)
|
|
||||||
{
|
|
||||||
int len;
|
|
||||||
if (u->inp_end) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if ((len = ud_decode(u)) > 0) {
|
|
||||||
if (u->translator != NULL) {
|
|
||||||
u->asm_buf[0] = '\0';
|
|
||||||
u->translator(u);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* =============================================================================
|
|
||||||
* ud_set_mode() - Set Disassemly Mode.
|
|
||||||
* =============================================================================
|
|
||||||
*/
|
|
||||||
extern void
|
|
||||||
ud_set_mode(struct ud* u, uint8_t m)
|
|
||||||
{
|
|
||||||
switch(m) {
|
|
||||||
case 16:
|
|
||||||
case 32:
|
|
||||||
case 64: u->dis_mode = m ; return;
|
|
||||||
default: u->dis_mode = 16; return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* =============================================================================
|
|
||||||
* ud_set_vendor() - Set vendor.
|
|
||||||
* =============================================================================
|
|
||||||
*/
|
|
||||||
extern void
|
|
||||||
ud_set_vendor(struct ud* u, unsigned v)
|
|
||||||
{
|
|
||||||
switch(v) {
|
|
||||||
case UD_VENDOR_INTEL:
|
|
||||||
u->vendor = v;
|
|
||||||
break;
|
|
||||||
case UD_VENDOR_ANY:
|
|
||||||
u->vendor = v;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
u->vendor = UD_VENDOR_AMD;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* =============================================================================
|
|
||||||
* ud_set_pc() - Sets code origin.
|
|
||||||
* =============================================================================
|
|
||||||
*/
|
|
||||||
extern void
|
|
||||||
ud_set_pc(struct ud* u, uint64_t o)
|
|
||||||
{
|
|
||||||
u->pc = o;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* =============================================================================
|
|
||||||
* ud_set_syntax() - Sets the output syntax.
|
|
||||||
* =============================================================================
|
|
||||||
*/
|
|
||||||
extern void
|
|
||||||
ud_set_syntax(struct ud* u, void (*t)(struct ud*))
|
|
||||||
{
|
|
||||||
u->translator = t;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* =============================================================================
|
|
||||||
* ud_insn() - returns the disassembled instruction
|
|
||||||
* =============================================================================
|
|
||||||
*/
|
|
||||||
const char*
|
|
||||||
ud_insn_asm(const struct ud* u)
|
|
||||||
{
|
|
||||||
return u->asm_buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* =============================================================================
|
|
||||||
* ud_insn_offset() - Returns the offset.
|
|
||||||
* =============================================================================
|
|
||||||
*/
|
|
||||||
uint64_t
|
|
||||||
ud_insn_off(const struct ud* u)
|
|
||||||
{
|
|
||||||
return u->insn_offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* =============================================================================
|
|
||||||
* ud_insn_hex() - Returns hex form of disassembled instruction.
|
|
||||||
* =============================================================================
|
|
||||||
*/
|
|
||||||
const char*
|
|
||||||
ud_insn_hex(struct ud* u)
|
|
||||||
{
|
|
||||||
u->insn_hexcode[0] = 0;
|
|
||||||
if (!u->error) {
|
|
||||||
unsigned int i;
|
|
||||||
const unsigned char *src_ptr = ud_insn_ptr(u);
|
|
||||||
char* src_hex;
|
|
||||||
src_hex = (char*) u->insn_hexcode;
|
|
||||||
/* for each byte used to decode instruction */
|
|
||||||
for (i = 0; i < ud_insn_len(u) && i < sizeof(u->insn_hexcode) / 2;
|
|
||||||
++i, ++src_ptr) {
|
|
||||||
sprintf(src_hex, "%02x", *src_ptr & 0xFF);
|
|
||||||
src_hex += 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return u->insn_hexcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* =============================================================================
|
|
||||||
* ud_insn_ptr
|
|
||||||
* Returns a pointer to buffer containing the bytes that were
|
|
||||||
* disassembled.
|
|
||||||
* =============================================================================
|
|
||||||
*/
|
|
||||||
extern const uint8_t*
|
|
||||||
ud_insn_ptr(const struct ud* u)
|
|
||||||
{
|
|
||||||
return (u->inp_buf == NULL) ?
|
|
||||||
u->inp_sess : u->inp_buf + (u->inp_buf_index - u->inp_ctr);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* =============================================================================
|
|
||||||
* ud_insn_len
|
|
||||||
* Returns the count of bytes disassembled.
|
|
||||||
* =============================================================================
|
|
||||||
*/
|
|
||||||
extern unsigned int
|
|
||||||
ud_insn_len(const struct ud* u)
|
|
||||||
{
|
|
||||||
return u->inp_ctr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* =============================================================================
|
|
||||||
* ud_insn_get_opr
|
|
||||||
* Return the operand struct representing the nth operand of
|
|
||||||
* the currently disassembled instruction. Returns NULL if
|
|
||||||
* there's no such operand.
|
|
||||||
* =============================================================================
|
|
||||||
*/
|
|
||||||
const struct ud_operand*
|
|
||||||
ud_insn_opr(const struct ud *u, unsigned int n)
|
|
||||||
{
|
|
||||||
if (n > 2 || u->operand[n].type == UD_NONE) {
|
|
||||||
return NULL;
|
|
||||||
} else {
|
|
||||||
return &u->operand[n];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* =============================================================================
|
|
||||||
* ud_opr_is_sreg
|
|
||||||
* Returns non-zero if the given operand is of a segment register type.
|
|
||||||
* =============================================================================
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
ud_opr_is_sreg(const struct ud_operand *opr)
|
|
||||||
{
|
|
||||||
return opr->type == UD_OP_REG &&
|
|
||||||
opr->base >= UD_R_ES &&
|
|
||||||
opr->base <= UD_R_GS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* =============================================================================
|
|
||||||
* ud_opr_is_sreg
|
|
||||||
* Returns non-zero if the given operand is of a general purpose
|
|
||||||
* register type.
|
|
||||||
* =============================================================================
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
ud_opr_is_gpr(const struct ud_operand *opr)
|
|
||||||
{
|
|
||||||
return opr->type == UD_OP_REG &&
|
|
||||||
opr->base >= UD_R_AL &&
|
|
||||||
opr->base <= UD_R_R15;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* =============================================================================
|
|
||||||
* ud_set_user_opaque_data
|
|
||||||
* ud_get_user_opaque_data
|
|
||||||
* Get/set user opaqute data pointer
|
|
||||||
* =============================================================================
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
ud_set_user_opaque_data(struct ud * u, void* opaque)
|
|
||||||
{
|
|
||||||
u->user_opaque_data = opaque;
|
|
||||||
}
|
|
||||||
|
|
||||||
void*
|
|
||||||
ud_get_user_opaque_data(const struct ud *u)
|
|
||||||
{
|
|
||||||
return u->user_opaque_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* =============================================================================
|
|
||||||
* ud_set_asm_buffer
|
|
||||||
* Allow the user to set an assembler output buffer. If `buf` is NULL,
|
|
||||||
* we switch back to the internal buffer.
|
|
||||||
* =============================================================================
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
ud_set_asm_buffer(struct ud *u, char *buf, size_t size)
|
|
||||||
{
|
|
||||||
if (buf == NULL) {
|
|
||||||
ud_set_asm_buffer(u, u->asm_buf_int, sizeof(u->asm_buf_int));
|
|
||||||
} else {
|
|
||||||
u->asm_buf = buf;
|
|
||||||
u->asm_buf_size = size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* =============================================================================
|
|
||||||
* ud_set_sym_resolver
|
|
||||||
* Set symbol resolver for relative targets used in the translation
|
|
||||||
* phase.
|
|
||||||
*
|
|
||||||
* The resolver is a function that takes a uint64_t address and returns a
|
|
||||||
* symbolic name for the that address. The function also takes a second
|
|
||||||
* argument pointing to an integer that the client can optionally set to a
|
|
||||||
* non-zero value for offsetted targets. (symbol+offset) The function may
|
|
||||||
* also return NULL, in which case the translator only prints the target
|
|
||||||
* address.
|
|
||||||
*
|
|
||||||
* The function pointer maybe NULL which resets symbol resolution.
|
|
||||||
* =============================================================================
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
ud_set_sym_resolver(struct ud *u, const char* (*resolver)(struct ud*,
|
|
||||||
uint64_t addr,
|
|
||||||
int64_t *offset))
|
|
||||||
{
|
|
||||||
u->sym_resolver = resolver;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* =============================================================================
|
|
||||||
* ud_insn_mnemonic
|
|
||||||
* Return the current instruction mnemonic.
|
|
||||||
* =============================================================================
|
|
||||||
*/
|
|
||||||
enum ud_mnemonic_code
|
|
||||||
ud_insn_mnemonic(const struct ud *u)
|
|
||||||
{
|
|
||||||
return u->mnemonic;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* =============================================================================
|
|
||||||
* ud_lookup_mnemonic
|
|
||||||
* Looks up mnemonic code in the mnemonic string table.
|
|
||||||
* Returns NULL if the mnemonic code is invalid.
|
|
||||||
* =============================================================================
|
|
||||||
*/
|
|
||||||
const char*
|
|
||||||
ud_lookup_mnemonic(enum ud_mnemonic_code c)
|
|
||||||
{
|
|
||||||
if (c < UD_MAX_MNEMONIC_CODE) {
|
|
||||||
return ud_mnemonics_str[c];
|
|
||||||
} else {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ud_inp_init
|
|
||||||
* Initializes the input system.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
ud_inp_init(struct ud *u)
|
|
||||||
{
|
|
||||||
u->inp_hook = NULL;
|
|
||||||
u->inp_buf = NULL;
|
|
||||||
u->inp_buf_size = 0;
|
|
||||||
u->inp_buf_index = 0;
|
|
||||||
u->inp_curr = 0;
|
|
||||||
u->inp_ctr = 0;
|
|
||||||
u->inp_end = 0;
|
|
||||||
UD_NON_STANDALONE(u->inp_file = NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* =============================================================================
|
|
||||||
* ud_inp_set_hook
|
|
||||||
* Sets input hook.
|
|
||||||
* =============================================================================
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
ud_set_input_hook(register struct ud* u, int (*hook)(struct ud*))
|
|
||||||
{
|
|
||||||
ud_inp_init(u);
|
|
||||||
u->inp_hook = hook;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* =============================================================================
|
|
||||||
* ud_inp_set_buffer
|
|
||||||
* Set buffer as input.
|
|
||||||
* =============================================================================
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
ud_set_input_buffer(register struct ud* u, const uint8_t* buf, size_t len)
|
|
||||||
{
|
|
||||||
ud_inp_init(u);
|
|
||||||
u->inp_buf = buf;
|
|
||||||
u->inp_buf_size = len;
|
|
||||||
u->inp_buf_index = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __UD_STANDALONE__
|
|
||||||
/* =============================================================================
|
|
||||||
* ud_input_set_file
|
|
||||||
* Set FILE as input.
|
|
||||||
* =============================================================================
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
inp_file_hook(struct ud* u)
|
|
||||||
{
|
|
||||||
return fgetc(u->inp_file);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
ud_set_input_file(register struct ud* u, FILE* f)
|
|
||||||
{
|
|
||||||
ud_inp_init(u);
|
|
||||||
u->inp_hook = inp_file_hook;
|
|
||||||
u->inp_file = f;
|
|
||||||
}
|
|
||||||
#endif /* __UD_STANDALONE__ */
|
|
||||||
|
|
||||||
|
|
||||||
/* =============================================================================
|
|
||||||
* ud_input_skip
|
|
||||||
* Skip n input bytes.
|
|
||||||
* ============================================================================
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
ud_input_skip(struct ud* u, size_t n)
|
|
||||||
{
|
|
||||||
if (u->inp_end) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (u->inp_buf == NULL) {
|
|
||||||
while (n--) {
|
|
||||||
int c = u->inp_hook(u);
|
|
||||||
if (c == UD_EOI) {
|
|
||||||
goto eoi;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
if (n > u->inp_buf_size ||
|
|
||||||
u->inp_buf_index > u->inp_buf_size - n) {
|
|
||||||
u->inp_buf_index = u->inp_buf_size;
|
|
||||||
goto eoi;
|
|
||||||
}
|
|
||||||
u->inp_buf_index += n;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
eoi:
|
|
||||||
u->inp_end = 1;
|
|
||||||
UDERR(u, "cannot skip, eoi received\b");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* =============================================================================
|
|
||||||
* ud_input_end
|
|
||||||
* Returns non-zero on end-of-input.
|
|
||||||
* =============================================================================
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
ud_input_end(const struct ud *u)
|
|
||||||
{
|
|
||||||
return u->inp_end;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* vim:set ts=2 sw=2 expandtab */
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
/* udis86 - udis86.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 UDIS86_H
|
|
||||||
#define UDIS86_H
|
|
||||||
|
|
||||||
#include "libudis86/types.h"
|
|
||||||
#include "libudis86/extern.h"
|
|
||||||
#include "libudis86/itab.h"
|
|
||||||
|
|
||||||
#endif
|
|
||||||
Loading…
Reference in New Issue
Block a user