diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2008-07-26 23:46:10 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2008-07-26 23:46:10 (GMT) |
commit | dbf4d1f93e54251568854bff0ebc9c84f60857f6 (patch) | |
tree | 72fa507ada7ba5b7351f711a7f16a8d3f7d32524 /src/arch | |
parent | c4f9b35d4ccb5bb82c4927daddd34d7a828bff3c (diff) |
Parsed x86 binary data and displayed the result.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@6 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/arch')
-rw-r--r-- | src/arch/Makefile.am | 22 | ||||
-rw-r--r-- | src/arch/instruction-int.h | 59 | ||||
-rw-r--r-- | src/arch/instruction.c | 64 | ||||
-rw-r--r-- | src/arch/instruction.h | 43 | ||||
-rw-r--r-- | src/arch/operand-int.h | 51 | ||||
-rw-r--r-- | src/arch/operand.c | 55 | ||||
-rw-r--r-- | src/arch/operand.h | 44 | ||||
-rw-r--r-- | src/arch/processor-int.h | 66 | ||||
-rw-r--r-- | src/arch/processor.c | 95 | ||||
-rw-r--r-- | src/arch/processor.h | 49 | ||||
-rw-r--r-- | src/arch/x86/Makefile.am | 20 | ||||
-rw-r--r-- | src/arch/x86/instruction.h | 65 | ||||
-rw-r--r-- | src/arch/x86/op_int.c | 63 | ||||
-rw-r--r-- | src/arch/x86/opcodes.h | 40 | ||||
-rw-r--r-- | src/arch/x86/processor.c | 228 | ||||
-rw-r--r-- | src/arch/x86/processor.h | 42 |
16 files changed, 1006 insertions, 0 deletions
diff --git a/src/arch/Makefile.am b/src/arch/Makefile.am new file mode 100644 index 0000000..7f231de --- /dev/null +++ b/src/arch/Makefile.am @@ -0,0 +1,22 @@ + +lib_LIBRARIES = libarch.a + +libarch_a_SOURCES = \ + instruction-int.h \ + instruction.h instruction.c \ + operand-int.h \ + operand.h operand.c \ + processor-int.h \ + processor.h processor.c + +libarch_a_CFLAGS = $(AM_CFLAGS) + + +INCLUDES = + +AM_CPPFLAGS = + +AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) + + +SUBDIRS = x86 diff --git a/src/arch/instruction-int.h b/src/arch/instruction-int.h new file mode 100644 index 0000000..11180dc --- /dev/null +++ b/src/arch/instruction-int.h @@ -0,0 +1,59 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * instruction.h - prototypes pour la définition générique interne des instructions + * + * Copyright (C) 2008 Cyrille Bagard + * + * This file is part of OpenIDA. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#ifndef _ARCH_INSTRUCTION_INT_H +#define _ARCH_INSTRUCTION_INT_H + + +#include "instruction.h" +#include "operand.h" + + +#include "operand-int.h" /* TODO: remove me */ + + + + +#define MAX_OPERANDS 4 + + +#define DB_OPCODE 0x00 + + +/* Définition générique d'une instruction */ +struct _asm_instr +{ + char opcode; + + asm_operand operands[MAX_OPERANDS]; + unsigned int operands_count; /* Nbre. d'opérandes utilisées */ + + +}; + +#define ASM_INSTRUCTION(instr) ((asm_instr *)instr) + + + + +#endif /* _ARCH_INSTRUCTION_INT_H */ diff --git a/src/arch/instruction.c b/src/arch/instruction.c new file mode 100644 index 0000000..1af3b97 --- /dev/null +++ b/src/arch/instruction.c @@ -0,0 +1,64 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * instruction.c - gestion générique des instructions + * + * Copyright (C) 2008 Cyrille Bagard + * + * This file is part of OpenIDA. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#include "instruction.h" + + +#include <malloc.h> + + +#include "instruction-int.h" + + + +/****************************************************************************** +* * +* Paramètres : data = flux de données à analyser. * +* pos = position courante dans ce flux. [OUT] * +* len = taille totale des données à analyser. * +* * +* Description : Crée une instruction de type 'db' à partir de données. * +* * +* Retour : Instruction mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +asm_instr *create_db_instruction(const char *data, off_t *pos, off_t len) +{ + asm_instr *result; /* Représentation à renvoyer */ + + result = (asm_instr *)calloc(1, sizeof(asm_instr)); + + result->opcode = DB_OPCODE; + + /* TODO: check result */ + fill_db_operand(&result->operands[0], data[(*pos)++]); + + result->operands_count = 1; + + return result; + +} + diff --git a/src/arch/instruction.h b/src/arch/instruction.h new file mode 100644 index 0000000..3be2bf7 --- /dev/null +++ b/src/arch/instruction.h @@ -0,0 +1,43 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * instruction.h - prototypes pour la gestion générique des instructions + * + * Copyright (C) 2008 Cyrille Bagard + * + * This file is part of OpenIDA. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#ifndef _ARCH_INSTRUCTION_H +#define _ARCH_INSTRUCTION_H + + +#include <sys/types.h> + + + +/* Définition générique d'une instruction */ +typedef struct _asm_instr asm_instr; + + + +/* Crée une instruction de type 'db' à partir de données. */ +asm_instr *create_db_instruction(const char *, off_t *, off_t); + + + + +#endif /* _ARCH_INSTRUCTION_H */ diff --git a/src/arch/operand-int.h b/src/arch/operand-int.h new file mode 100644 index 0000000..f09d9a9 --- /dev/null +++ b/src/arch/operand-int.h @@ -0,0 +1,51 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * operand-int.h - prototypes pour la définition générique interne des opérandes + * + * Copyright (C) 2008 Cyrille Bagard + * + * This file is part of OpenIDA. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#ifndef _ARCH_OPERAND_INT_H +#define _ARCH_OPERAND_INT_H + + +#include <stdint.h> + + + + +/* Définition générique d'une opérande */ +struct _asm_operand +{ + + + union + { + uint8_t val8; /* Valeur sur 8 bits */ + + + } value; + + + +}; + + + +#endif /* _ARCH_OPERAND_INT_H */ diff --git a/src/arch/operand.c b/src/arch/operand.c new file mode 100644 index 0000000..98460c9 --- /dev/null +++ b/src/arch/operand.c @@ -0,0 +1,55 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * operand.c - gestion générique des opérandes + * + * Copyright (C) 2008 Cyrille Bagard + * + * This file is part of OpenIDA. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#include "operand.h" + + +#include "operand-int.h" + + + + + + +/****************************************************************************** +* * +* Paramètres : operand = structure dont le contenu est à définir. * +* value = valeur immédiate à renseigner. * +* * +* Description : Crée une opérande pour l'instruction 'db'. * +* * +* Retour : true si l'opérande a été définie avec succès, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool fill_db_operand(asm_operand *operand, uint8_t value) +{ + operand->value.val8 = value; + + return true; + +} + + diff --git a/src/arch/operand.h b/src/arch/operand.h new file mode 100644 index 0000000..81c9a53 --- /dev/null +++ b/src/arch/operand.h @@ -0,0 +1,44 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * operand.h - prototypes pour la gestion générique des opérandes + * + * Copyright (C) 2008 Cyrille Bagard + * + * This file is part of OpenIDA. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#ifndef _ARCH_OPERAND_H +#define _ARCH_OPERAND_H + + +#include <stdbool.h> +#include <stdint.h> + + + +/* Définition générique d'une opérande */ +typedef struct _asm_operand asm_operand; + + + +/* Crée une opérande pour l'instruction 'db'. */ +bool fill_db_operand(asm_operand *, uint8_t); + + + + +#endif /* _ARCH_OPERAND_H */ diff --git a/src/arch/processor-int.h b/src/arch/processor-int.h new file mode 100644 index 0000000..602bab6 --- /dev/null +++ b/src/arch/processor-int.h @@ -0,0 +1,66 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * processor.h - prototypes pour la définition générique interne des architectures + * + * Copyright (C) 2008 Cyrille Bagard + * + * This file is part of OpenIDA. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#ifndef _ARCH_PROCESSOR_INT_H +#define _ARCH_PROCESSOR_INT_H + + +#include <sys/types.h> + + +#include "instruction.h" +#include "processor.h" + + + + +typedef int AsmSyntax; + + +/* Décode une instruction dans un flux de données. */ +typedef asm_instr * (* fetch_instruction) (const asm_processor *, const char *, off_t *, off_t); + +/* Traduit une instruction en version humainement lisible. */ +typedef void (* print_instruction) (const asm_processor *, const asm_instr *, char *, size_t, AsmSyntax); + + + +/* Définition générique d'une architecture */ +struct _asm_processor +{ + + fetch_instruction fetch_instr; /* Lecture d'une instruction */ + + print_instruction print_instr; /* Version lisible d'une instr.*/ + + +}; + + +#define ASM_PROCESSOR(proc) ((asm_processor *)proc) + + + + + +#endif /* _ARCH_PROCESSOR_INT_H */ diff --git a/src/arch/processor.c b/src/arch/processor.c new file mode 100644 index 0000000..fc59fdb --- /dev/null +++ b/src/arch/processor.c @@ -0,0 +1,95 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * processor.c - gestion générique des architectures + * + * Copyright (C) 2008 Cyrille Bagard + * + * This file is part of OpenIDA. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#include "processor.h" + + +#include "processor-int.h" + + + + + +/****************************************************************************** +* * +* Paramètres : proc = architecture visée par la procédure. * +* data = flux de données à analyser. * +* pos = position courante dans ce flux. [OUT] * +* len = taille totale des données à analyser. * +* * +* Description : Décode une instruction dans un flux de données. * +* * +* Retour : Instruction mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +asm_instr *decode_instruction(const asm_processor *proc, const char *data, off_t *pos, off_t len) +{ + asm_instr *result; /* Représentation à renvoyer */ + + + + + result = proc->fetch_instr(proc, data, pos, len); + + +#define NULL ((void *)0) + + + if (result == NULL) + result = create_db_instruction(data, pos, len); + + + + + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : proc = architecture visée par la procédure. * +* instr = instruction à traiter. * +* buffer = tampon de sortie mis à disposition. [OUT] * +* len = taille de ce tampon. * +* syntax = type de représentation demandée. * +* * +* Description : Traduit une instruction en version humainement lisible. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void print_hinstruction(const asm_processor *proc, const asm_instr *instr, char *buffer, size_t len/*, AsmSyntax syntax*/) +{ + proc->print_instr(proc, instr, buffer, len, 0); + +} + + diff --git a/src/arch/processor.h b/src/arch/processor.h new file mode 100644 index 0000000..1023d45 --- /dev/null +++ b/src/arch/processor.h @@ -0,0 +1,49 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * processor.h - prototypes pour la gestion générique des architectures + * + * Copyright (C) 2008 Cyrille Bagard + * + * This file is part of OpenIDA. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#ifndef _ARCH_PROCESSOR_H +#define _ARCH_PROCESSOR_H + + +#include <sys/types.h> + + +#include "instruction.h" + + + +/* Définition générique d'une architecture */ +typedef struct _asm_processor asm_processor; + + + +/* Décode une instruction dans un flux de données. */ +asm_instr *decode_instruction(const asm_processor *, const char *, off_t *, off_t); + +/* Traduit une instruction en version humainement lisible. */ +void print_hinstruction(const asm_processor *, const asm_instr *, char *, size_t); + + + + +#endif /* _ARCH_PROCESSOR_H */ diff --git a/src/arch/x86/Makefile.am b/src/arch/x86/Makefile.am new file mode 100644 index 0000000..6fe55c8 --- /dev/null +++ b/src/arch/x86/Makefile.am @@ -0,0 +1,20 @@ + +lib_LIBRARIES = libarchx86.a + +libarchx86_a_SOURCES = \ + instruction.h \ + op_int.c \ + opcodes.h \ + processor.h processor.c + +libarchx86_a_CFLAGS = $(AM_CFLAGS) + + +INCLUDES = + +AM_CPPFLAGS = + +AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) + + +SUBDIRS = diff --git a/src/arch/x86/instruction.h b/src/arch/x86/instruction.h new file mode 100644 index 0000000..47617ea --- /dev/null +++ b/src/arch/x86/instruction.h @@ -0,0 +1,65 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * instruction.h - prototypes pour la gestion des instructions de l'architecture x86 + * + * Copyright (C) 2008 Cyrille Bagard + * + * This file is part of OpenIDA. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#ifndef _ARCH_X86_INSTRUCTION_H +#define _ARCH_X86_INSTRUCTION_H + + +#include "../instruction.h" +#include "../instruction-int.h" + + + +/* Définition d'une instruction x86 */ +typedef struct _asm_x86_instr asm_x86_instr; + + + +/* Enumération de tous les opcodes */ +typedef enum _X86Opcodes +{ + X86_OP_INT, /* int (0xcd) */ + + + X86_OP_COUNT + +} X86Opcodes; + + + + +/* Définition d'une instruction x86 */ +struct _asm_x86_instr +{ + asm_instr base; /* A laisser en premier... */ + + X86Opcodes type; + +}; + + + + + + +#endif /* _ARCH_X86_INSTRUCTION_H */ diff --git a/src/arch/x86/op_int.c b/src/arch/x86/op_int.c new file mode 100644 index 0000000..e7805e1 --- /dev/null +++ b/src/arch/x86/op_int.c @@ -0,0 +1,63 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * op_int.c - décodage des instructions d'interruption + * + * Copyright (C) 2008 Cyrille Bagard + * + * This file is part of OpenIDA. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#include <malloc.h> + + +#include "instruction.h" +#include "../instruction-int.h" + + + + +/****************************************************************************** +* * +* Paramètres : data = flux de données à analyser. * +* pos = position courante dans ce flux. [OUT] * +* len = taille totale des données à analyser. * +* * +* Description : Décode une instruction de type 'int'. * +* * +* Retour : Instruction mise en place ou NULL. * +* * +* Remarques : - * +* * +******************************************************************************/ + +asm_x86_instr *read_instr_int(const char *data, off_t *pos, off_t len) +{ + asm_x86_instr *result; + + result = (asm_x86_instr *)calloc(1, sizeof(asm_x86_instr)); + + ASM_INSTRUCTION(result)->opcode = data[(*pos)++]; + + /* TODO: check result */ + fill_db_operand(&ASM_INSTRUCTION(result)->operands[0], data[(*pos)++]); + + ASM_INSTRUCTION(result)->operands_count = 1; + + return result; + +} + diff --git a/src/arch/x86/opcodes.h b/src/arch/x86/opcodes.h new file mode 100644 index 0000000..17316e7 --- /dev/null +++ b/src/arch/x86/opcodes.h @@ -0,0 +1,40 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * opcodes.h - prototypes pour la liste de tous les opcodes de l'architecture x86 + * + * Copyright (C) 2008 Cyrille Bagard + * + * This file is part of OpenIDA. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#ifndef _ARCH_X86_OPCODES_H +#define _ARCH_X86_OPCODES_H + + +#include <sys/types.h> + + +#include "../instruction.h" + + + +/* Décode une instruction de type 'int'. */ +asm_x86_instr *read_instr_int(const char *, off_t *, off_t); + + + +#endif /* _ARCH_X86_OPCODES_H */ diff --git a/src/arch/x86/processor.c b/src/arch/x86/processor.c new file mode 100644 index 0000000..4ef1377 --- /dev/null +++ b/src/arch/x86/processor.c @@ -0,0 +1,228 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * processor.c - gestion de l'architecture x86 + * + * Copyright (C) 2008 Cyrille Bagard + * + * This file is part of OpenIDA. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#include "processor.h" + + +#include "../processor-int.h" +#include "instruction.h" +#include "opcodes.h" + + +#include <malloc.h> + + + +typedef asm_x86_instr * (* read_instr) (const char *, off_t *, off_t); + + +/* Carte d'identité d'un opcode */ +typedef struct _x86_opcode +{ + char opcode; /* Opcode + préfixe eventuel */ + const char *name; /* Désignation humaine */ + read_instr read; /* Décodage de l'instruction */ + +} x86_opcode; + + +#define register_opcode(target, bin, n, func) \ +do {\ +target.opcode = bin; \ +target.name = n; \ +target.read = func; \ +} while (0) + + +/* Définition générique d'une architecture */ +typedef struct _asm_x86_processor +{ + asm_processor base; /* A laisser en premier... */ + + x86_opcode opcodes[X86_OP_COUNT]; /* Liste des opcodes supportés */ + +} asm_x86_processor; + + + + + +/* Enregistre toutes les instructions reconnues pour x86. */ +void x86_register_instructions(asm_x86_processor *); + + +/* Décode une instruction dans un flux de données. */ +asm_instr *x86_fetch_instruction(const asm_x86_processor *, const char *, off_t *, off_t); + +/* Traduit une instruction en version humainement lisible. */ +void x86_print_instruction(const asm_x86_processor *, const asm_x86_instr *, char *, size_t, AsmSyntax); + + + + + +/****************************************************************************** +* * +* Paramètres : - * +* * +* Description : Crée le support de l'architecture x86. * +* * +* Retour : Architecture mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +asm_processor *create_x86_processor(void) +{ + asm_x86_processor *result; /* Architecture à retourner */ + + result = (asm_x86_processor *)calloc(1, sizeof(asm_x86_processor)); + + x86_register_instructions(result); + + ASM_PROCESSOR(result)->fetch_instr = x86_fetch_instruction; + ASM_PROCESSOR(result)->print_instr = x86_print_instruction; + + return ASM_PROCESSOR(result); + +} + + + + + +/****************************************************************************** +* * +* Paramètres : proc = architecture visée par la procédure. * +* * +* Description : Enregistre toutes les instructions reconnues pour x86. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void x86_register_instructions(asm_x86_processor *proc) +{ + + + + register_opcode(proc->opcodes[X86_OP_INT], 0xcd, "int", read_instr_int); + + + + + +} + + + + +/****************************************************************************** +* * +* Paramètres : proc = architecture visée par la procédure. * +* data = flux de données à analyser. * +* pos = position courante dans ce flux. [OUT] * +* len = taille totale des données à analyser. * +* * +* Description : Décode une instruction dans un flux de données. * +* * +* Retour : Instruction mise en place ou NULL. * +* * +* Remarques : - * +* * +******************************************************************************/ + +asm_instr *x86_fetch_instruction(const asm_x86_processor *proc, const char *data, off_t *pos, off_t len) +{ + asm_x86_instr *result; /* Résultat à faire remonter */ + X86Opcodes i; /* Boucle de parcours */ + + result = NULL; + + //printf("--------\n"); + + for (i = 0; i < X86_OP_COUNT; i++) + { + + /* + printf(" cmp :: 0x%02hhx vs 0x%02hhx ? %d\n", + data[*pos], proc->opcodes[i].opcode, + data[*pos] == proc->opcodes[i].opcode); + */ + + if (data[*pos] == proc->opcodes[i].opcode) + { + result = proc->opcodes[i].read(data, pos, len); + if (result != NULL) result->type = i; + break; + } + + } + + + return ASM_INSTRUCTION(result); + +} + + +/****************************************************************************** +* * +* Paramètres : proc = architecture visée par la procédure. * +* instr = instruction à traiter. * +* buffer = tampon de sortie mis à disposition. [OUT] * +* len = taille de ce tampon. * +* syntax = type de représentation demandée. * +* * +* Description : Traduit une instruction en version humainement lisible. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void x86_print_instruction(const asm_x86_processor *proc, const asm_x86_instr *instr, char *buffer, size_t len, AsmSyntax syntax) +{ + + if (ASM_INSTRUCTION(instr)->opcode == DB_OPCODE) + + + snprintf(buffer, len, "db\t0x%02hhx", ASM_INSTRUCTION(instr)->operands[0].value.val8); + + + else + + snprintf(buffer, len, "%s\t0x%02hhx", proc->opcodes[instr->type].name, ASM_INSTRUCTION(instr)->operands[0].value.val8); + + +} + + + + + + + diff --git a/src/arch/x86/processor.h b/src/arch/x86/processor.h new file mode 100644 index 0000000..0bd587d --- /dev/null +++ b/src/arch/x86/processor.h @@ -0,0 +1,42 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * processor.h - prototypes pour la gestion de l'architecture x86 + * + * Copyright (C) 2008 Cyrille Bagard + * + * This file is part of OpenIDA. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#ifndef _ARCH_X86_PROCESSOR_H +#define _ARCH_X86_PROCESSOR_H + + +#include "../instruction.h" +#include "../processor.h" + + + +/* Crée le support de l'architecture x86. */ +asm_processor *create_x86_processor(void); + + + + + + + +#endif /* _ARCH_X86_PROCESSOR_H */ |