diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2009-09-30 00:00:43 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2009-09-30 00:00:43 (GMT) |
commit | 3c6968d4d5a8918c456cdea28a7c6195368d996e (patch) | |
tree | e6909254a8033cdabd116f287db2893e938a636d /src | |
parent | 1beaa1af679d49d99696ec907662b764f7ba1867 (diff) |
Parsed and replaced ModRM operands.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@121 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src')
-rwxr-xr-x | src/analysis/Makefile.am | 2 | ||||
-rw-r--r-- | src/analysis/binary.c | 2 | ||||
-rw-r--r-- | src/analysis/exporter.c | 7 | ||||
-rw-r--r-- | src/analysis/exporter.h | 2 | ||||
-rw-r--r-- | src/analysis/routine.c (renamed from src/analysis/prototype.c) | 123 | ||||
-rw-r--r-- | src/analysis/routine.h (renamed from src/analysis/prototype.h) | 14 | ||||
-rw-r--r-- | src/analysis/variable.c | 201 | ||||
-rw-r--r-- | src/analysis/variable.h | 44 | ||||
-rw-r--r-- | src/arch/immediate.c | 68 | ||||
-rw-r--r-- | src/arch/immediate.h | 3 | ||||
-rw-r--r-- | src/format/exe_format.h | 2 | ||||
-rw-r--r-- | src/format/format.h | 1 | ||||
-rw-r--r-- | src/format/mangling/demangler-int.h | 1 | ||||
-rw-r--r-- | src/format/mangling/demangler.h | 2 | ||||
-rw-r--r-- | src/format/symbol.c | 3 | ||||
-rw-r--r-- | src/format/symbol.h | 1 | ||||
-rw-r--r-- | src/plugins/pglist.c | 2 | ||||
-rw-r--r-- | src/plugins/plugin.c | 2 |
18 files changed, 457 insertions, 23 deletions
diff --git a/src/analysis/Makefile.am b/src/analysis/Makefile.am index 7dca420..d7f0f0e 100755 --- a/src/analysis/Makefile.am +++ b/src/analysis/Makefile.am @@ -10,8 +10,8 @@ libanalysis_la_SOURCES = \ line_code.h line_code.c \ line_comment.h line_comment.c \ line_prologue.h line_prologue.c \ - prototype.h prototype.c \ roptions.h roptions.c \ + routine.h routine.c \ variable.h variable.c libanalysis_la_LDFLAGS = diff --git a/src/analysis/binary.c b/src/analysis/binary.c index 4fe8f06..97b916e 100644 --- a/src/analysis/binary.c +++ b/src/analysis/binary.c @@ -38,7 +38,7 @@ #include "line_code.h" /* TODO : supprimer ? */ #include "line_comment.h" /* TODO : supprimer ? */ #include "line_prologue.h" -#include "prototype.h" +#include "routine.h" #include "../common/extstr.h" #include "../glibext/delayed-int.h" #include "../format/format.h" diff --git a/src/analysis/exporter.c b/src/analysis/exporter.c index 8a41abf..54673d3 100644 --- a/src/analysis/exporter.c +++ b/src/analysis/exporter.c @@ -123,6 +123,13 @@ static void g_content_exporter_class_init(GContentExporterClass *klass) klass->tags[RTT_STRING] = tag; gtk_text_tag_table_add(table, tag); + tag = gtk_text_tag_new(NULL); + + g_object_set(G_OBJECT(tag), "foreground", "black", NULL); + + klass->tags[RTT_VAR_NAME] = tag; + gtk_text_tag_table_add(table, tag); + } diff --git a/src/analysis/exporter.h b/src/analysis/exporter.h index 9e8d54a..60c37b1 100644 --- a/src/analysis/exporter.h +++ b/src/analysis/exporter.h @@ -51,6 +51,8 @@ typedef enum _RenderingTagType RTT_SEGMENT, /* Indication de segment */ RTT_STRING, /* Chaîne de caractères avec " */ + RTT_VAR_NAME, /* Nom de variable */ + RTT_COUNT } RenderingTagType; diff --git a/src/analysis/prototype.c b/src/analysis/routine.c index 72ee809..4bbd712 100644 --- a/src/analysis/prototype.c +++ b/src/analysis/routine.c @@ -1,6 +1,6 @@ /* OpenIDA - Outil d'analyse de fichiers binaires - * prototype.c - manipulation des prototypes de fonctions et de variables + * routine.c - manipulation des prototypes de fonctions et de variables * * Copyright (C) 2008 Cyrille Bagard * @@ -21,11 +21,12 @@ */ -#include "prototype.h" +#include "routine.h" #include <malloc.h> #include <string.h> +#include <stdlib.h> #include "../common/extstr.h" @@ -47,8 +48,14 @@ struct _GBinRoutine char *name; /* Désignation humaine */ variable **args_types; /* Types d'arguments */ + size_t old_args_count; /* Nombre d'arguments */ + + GUnknownVariable **args; /* Arguments de la routines */ size_t args_count; /* Nombre d'arguments */ + GUnknownVariable **locals; /* Variables locales du code */ + size_t locals_count; /* Nombre de variables locales */ + }; @@ -153,7 +160,7 @@ void g_binary_routine_finalize(GBinRoutine *routine) if (routine->name != NULL) free(routine->name); - for (i = 0; i < routine->args_count; i++) + for (i = 0; i < routine->old_args_count; i++) delete_var(routine->args_types[i]); free(routine); @@ -392,12 +399,114 @@ void g_binary_routine_set_return_type(GBinRoutine *routine, variable *var) void g_binary_routine_add_arg(GBinRoutine *routine, variable *var) { - routine->args_count++; + routine->old_args_count++; routine->args_types = (variable **)realloc(routine->args_types, - routine->args_count * sizeof(variable *)); + routine->old_args_count * sizeof(variable *)); + + routine->args_types[routine->old_args_count - 1] = var; + +} + + +/****************************************************************************** +* * +* Paramètres : routine = routine à mettre à jour. * +* offset = position abstraite à retrouver. * +* local = indique le type de variable à manipuler. * +* * +* Description : S'assure qu'une variable est bien associée à une routine. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_binary_routine_register_if_needed(GBinRoutine *routine, size_t offset, bool local) +{ + GUnknownVariable ***list; /* Liste à manipuler */ + size_t *count; /* Taille de la liste */ + bool found; /* Indication de présence */ + size_t i; /* Boucle de parcours */ + GUnknownVariable *new; /* Nouvelle variable à intégrer*/ + + if (local) + { + list = &routine->locals; + count = &routine->locals_count; + } + else + { + list = &routine->args; + count = &routine->args_count; + } + + found = false; + + for (i = 0; i < *count && !found; i++) + found = g_unknown_variable_contains_offset((*list)[i], offset); + + if (!found) + { + /* Construction */ + + new = g_unknown_variable_new(); + + g_unknown_variable_set_offset(new, offset); - routine->args_types[routine->args_count - 1] = var; + /* Ajout */ + + (*list)= (variable **)realloc(*list, ++(*count) * sizeof(GUnknownVariable *)); + (*list)[*count - 1] = new; + + qsort(*list, *count, sizeof(GUnknownVariable *), g_unknown_variable_compare); + + + } + +} + + +/****************************************************************************** +* * +* Paramètres : routine = routine à mettre à jour. * +* offset = position abstraite à retrouver. * +* local = indique le type de variable à manipuler. * +* * +* Description : Donne l'indice d'une variable dans la liste d'une routine. * +* * +* Retour : Indice de la variable dans la liste adaptée. * +* * +* Remarques : - * +* * +******************************************************************************/ + +size_t g_binary_routine_get_var_index_from_offset(const GBinRoutine *routine, size_t offset, bool local) +{ + size_t result; /* Indice à renvoyer */ + GUnknownVariable ***list; /* Liste à manipuler */ + size_t *count; /* Taille de la liste */ + size_t i; /* Boucle de parcours */ + + result = SIZE_MAX; + + if (local) + { + list = &routine->locals; + count = &routine->locals_count; + } + else + { + list = &routine->args; + count = &routine->args_count; + } + + for (i = 0; i < *count && result == SIZE_MAX; i++) + if (g_unknown_variable_contains_offset((*list)[i], offset)) + result = i; + + return result; } @@ -454,7 +563,7 @@ char *g_binary_routine_to_string(const GBinRoutine *routine) result = stradd(result, "("); - for (i = 0; i < routine->args_count; i++) + for (i = 0; i < routine->old_args_count; i++) { if (i > 0) result = stradd(result, ", "); diff --git a/src/analysis/prototype.h b/src/analysis/routine.h index 2a9439e..4e47b5e 100644 --- a/src/analysis/prototype.h +++ b/src/analysis/routine.h @@ -1,6 +1,6 @@ /* OpenIDA - Outil d'analyse de fichiers binaires - * prototype.h - prototypes pour la manipulation des prototypes de fonctions et de variables + * routine.h - prototypes pour la manipulation des prototypes de fonctions et de variables * * Copyright (C) 2008 Cyrille Bagard * @@ -21,8 +21,8 @@ */ -#ifndef _ANALYSIS_PROTOTYPE_H -#define _ANALYSIS_PROTOTYPE_H +#ifndef _ANALYSIS_ROUTINE_H +#define _ANALYSIS_ROUTINE_H #include <glib-object.h> @@ -97,9 +97,15 @@ void g_binary_routine_set_return_type(GBinRoutine *, variable *); /* Ajoute un argument à une routine. */ void g_binary_routine_add_arg(GBinRoutine *, variable *); +/* S'assure qu'une variable est bien associée à une routine. */ +void g_binary_routine_register_if_needed(GBinRoutine *, size_t, bool); + +/* Donne l'indice d'une variable dans la liste d'une routine. */ +size_t g_binary_routine_get_var_index_from_offset(const GBinRoutine *, size_t, bool); + /* Décrit le prototype de la routine sous forme de caractères. */ char *g_binary_routine_to_string(const GBinRoutine *); -#endif /* _ANALYSIS_PROTOTYPE_H */ +#endif /* _ANALYSIS_ROUTINE_H */ diff --git a/src/analysis/variable.c b/src/analysis/variable.c index 058c152..01c780e 100644 --- a/src/analysis/variable.c +++ b/src/analysis/variable.c @@ -25,7 +25,7 @@ #include <malloc.h> -#include <stdbool.h> +#include <stdint.h> #include <string.h> @@ -33,6 +33,205 @@ + +/* -------------------- BASE DE VARIABLES OU VARIABLES INCONNUES -------------------- */ + + +/* Base de variable (instance) */ +struct _GUnknownVariable +{ + GObject parent; /* A laisser en premier */ + + size_t offset; /* Position abstraite associée */ + size_t size; /* Taille en mémoire */ + +}; + +/* Base de variable (classe) */ +struct _GUnknownVariableClass +{ + GObjectClass parent; /* A laisser en premier */ + +}; + + +/* Initialise la classe des bases de variables. */ +static void g_unknown_variable_class_init(GUnknownVariableClass *); + +/* Initialise l'instande d'une base de variable. */ +static void g_unknown_variable_init(GUnknownVariable *); + + + +/* ---------------------------------------------------------------------------------- */ +/* BASE DE VARIABLES OU VARIABLES INCONNUES */ +/* ---------------------------------------------------------------------------------- */ + + +/* Indique le type défini pour une base de variable. */ +G_DEFINE_TYPE(GUnknownVariable, g_unknown_variable, G_TYPE_OBJECT); + + +/****************************************************************************** +* * +* Paramètres : klass = classe à initialiser. * +* * +* Description : Initialise la classe des bases de variables. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_unknown_variable_class_init(GUnknownVariableClass *klass) +{ + +} + + +/****************************************************************************** +* * +* Paramètres : var = instance à initialiser. * +* * +* Description : Initialise l'instande d'une base de variable. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_unknown_variable_init(GUnknownVariable *var) +{ + var->offset = SIZE_MAX; + var->size = SIZE_MAX; + +} + + +/****************************************************************************** +* * +* Paramètres : - * +* * +* Description : Crée une représentation de variable de type inconnu. * +* * +* Retour : Variable mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GUnknownVariable *g_unknown_variable_new(void) +{ + GUnknownVariable *result; /* Variable à retourner */ + + result = g_object_new(G_TYPE_UNKNOWN_VARIABLE, NULL); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : a = premières informations à consulter. * +* b = secondes informations à consulter. * +* * +* Description : Etablit la comparaison ascendante entre deux variables. * +* * +* Retour : Bilan : -1 (a < b), 0 (a == b) ou 1 (a > b). * +* * +* Remarques : - * +* * +******************************************************************************/ + +int g_unknown_variable_compare(const GUnknownVariable **a, const GUnknownVariable **b) +{ + int result; /* Bilan à renvoyer */ + + if ((*a)->offset < (*b)->offset) result = -1; + else if((*a)->offset > (*b)->offset) result = 1; + else result = 0; + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : var = variable à manipuler. * +* offset = position (abstraite ou non) à enregistrer. * +* * +* Description : Définit la position associée à une variable. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_unknown_variable_set_offset(GUnknownVariable *var, size_t offset) +{ + var->offset = offset; + +} + + +/****************************************************************************** +* * +* Paramètres : var = variable à manipuler. * +* * +* Description : Fournit la position associée à une variable. * +* * +* Retour : Position de la variable. * +* * +* Remarques : - * +* * +******************************************************************************/ + +size_t g_unknown_variable_get_offset(const GUnknownVariable *var) +{ + return var->offset; + +} + + +/****************************************************************************** +* * +* Paramètres : var = variable à manipuler. * +* offset = position (abstraite ou non) à traiter. * +* * +* Description : Indique si une position est contenue dans une variable. * +* * +* Retour : Bilan de la consultation. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_unknown_variable_contains_offset(const GUnknownVariable *var, size_t offset) +{ + bool result; /* Bilan à retourner */ + + if (var->offset == SIZE_MAX) + return false; + + if (var->size == SIZE_MAX) + result = (var->offset == offset); + + else result = (var->offset <= offset && offset < (var->offset + var->size)); + + return result; + +} + + + + + + /* ---------------------------- TYPES DE DONNEES SIMPLES ---------------------------- */ diff --git a/src/analysis/variable.h b/src/analysis/variable.h index 8b50cf4..f2bbb87 100644 --- a/src/analysis/variable.h +++ b/src/analysis/variable.h @@ -25,6 +25,50 @@ #define _ANALYSIS_VARIABLE_H +#include <stdbool.h> +#include <glib-object.h> + + + +/* -------------------- BASE DE VARIABLES OU VARIABLES INCONNUES -------------------- */ + + +#define G_TYPE_UNKNOWN_VARIABLE g_unknown_variable_get_type() +#define G_UNKNOWN_VARIABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_unknown_variable_get_type(), GUnknownVariable)) +#define G_IS_UNKNOWN_VARIABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_unknown_variable_get_type())) +#define G_UNKNOWN_VARIABLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_UNKNOWN_VARIABLE, GUnknownVariableClass)) +#define G_IS_UNKNOWN_VARIABLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_UNKNOWN_VARIABLE)) +#define G_UNKNOWN_VARIABLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_UNKNOWN_VARIABLE, GUnknownVariableClass)) + + +/* Base de variable (instance) */ +typedef struct _GUnknownVariable GUnknownVariable; + +/* Base de variable (classe) */ +typedef struct _GUnknownVariableClass GUnknownVariableClass; + + +/* Indique le type défini pour une base de variable. */ +GType g_unknown_variable_get_type(void); + +/* Crée une représentation de variable de type inconnu. */ +GUnknownVariable *g_unknown_variable_new(void); + +/* Etablit la comparaison ascendante entre deux variables. */ +int g_unknown_variable_compare(const GUnknownVariable **, const GUnknownVariable **); + +/* Définit la position associée à une variable. */ +void g_unknown_variable_set_offset(GUnknownVariable *, size_t); + +/* Fournit la position associée à une variable. */ +size_t g_unknown_variable_get_offset(const GUnknownVariable *); + +/* Indique si une position est contenue dans une variable. */ +bool g_unknown_variable_contains_offset(const GUnknownVariable *, size_t); + + + + /* Variable repésentant un argument ou un type de retour */ typedef struct _variable variable; diff --git a/src/arch/immediate.c b/src/arch/immediate.c index 54d8135..73a7648 100644 --- a/src/arch/immediate.c +++ b/src/arch/immediate.c @@ -313,8 +313,6 @@ bool g_imm_operand_is_negative(const GImmOperand *operand) { bool result; /* Bilan à renvoyer */ - result = false; - switch (operand->size) { case AOS_8_BITS_SIGNED: @@ -330,7 +328,7 @@ bool g_imm_operand_is_negative(const GImmOperand *operand) result = (operand->signed_imm.val64 & 0x8000000000000000ll); break; default: - /* Traitement non nécessaire */ + result = false; break; } @@ -561,3 +559,67 @@ bool g_imm_operand_to_vmpa_t(const GImmOperand *operand, vmpa_t *addr) return result; } + + +/****************************************************************************** +* * +* Paramètres : operand = opérande à traiter. * +* value = valeur résultante. [OUT] * +* negative = indique si la valeur était négative à l'origine. * +* * +* Description : Convertit une valeur immédiate en valeur de type size_t. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_imm_operand_to_size_t(const GImmOperand *operand, size_t *value, bool *negative) +{ + bool result; /* Bilan à renvoyer */ + + *negative = g_imm_operand_is_negative(operand); + + switch (operand->size) + { + case AOS_8_BITS_UNSIGNED: + result = (sizeof(size_t) >= 1); + if (result) *value = operand->unsigned_imm.val8; + break; + case AOS_16_BITS_UNSIGNED: + result = (sizeof(size_t) >= 2); + if (result) *value = operand->unsigned_imm.val16; + break; + case AOS_32_BITS_UNSIGNED: + result = (sizeof(size_t) >= 4); + if (result) *value = operand->unsigned_imm.val32; + break; + case AOS_64_BITS_UNSIGNED: + result = (sizeof(size_t) >= 8); + if (result) *value = operand->unsigned_imm.val64; + break; + case AOS_8_BITS_SIGNED: + result = (sizeof(size_t) >= 1); + if (result) *value = (*negative ? -1 : 1 ) * operand->signed_imm.val8; + break; + case AOS_16_BITS_SIGNED: + result = (sizeof(size_t) >= 2); + if (result) *value = (*negative ? -1 : 1 ) * operand->signed_imm.val16; + break; + case AOS_32_BITS_SIGNED: + result = (sizeof(size_t) >= 4); + if (result) *value = (*negative ? -1 : 1 ) * operand->signed_imm.val32; + break; + case AOS_64_BITS_SIGNED: + result = (sizeof(size_t) >= 8); + if (result) *value = (*negative ? -1 : 1 ) * operand->signed_imm.val64; + break; + default: + result = false; + break; + } + + return result; + +} diff --git a/src/arch/immediate.h b/src/arch/immediate.h index 1dcc548..d3e4624 100644 --- a/src/arch/immediate.h +++ b/src/arch/immediate.h @@ -63,6 +63,9 @@ bool g_imm_operand_is_negative(const GImmOperand *); /* Convertit une valeur immédiate en adresse de type vmpa_t. */ bool g_imm_operand_to_vmpa_t(const GImmOperand *, vmpa_t *); +/* Convertit une valeur immédiate en valeur de type size_t. */ +bool g_imm_operand_to_size_t(const GImmOperand *, size_t *, bool *); + #endif /* _ARCH_IMMEDIATE_H */ diff --git a/src/format/exe_format.h b/src/format/exe_format.h index b1cbb17..d61e51a 100644 --- a/src/format/exe_format.h +++ b/src/format/exe_format.h @@ -30,7 +30,7 @@ #include <sys/types.h> -#include "../analysis/prototype.h" +#include "../analysis/routine.h" #include "symbol.h" diff --git a/src/format/format.h b/src/format/format.h index c485e0b..a4de552 100644 --- a/src/format/format.h +++ b/src/format/format.h @@ -31,6 +31,7 @@ #include "symbol.h" +#include "../analysis/routine.h" diff --git a/src/format/mangling/demangler-int.h b/src/format/mangling/demangler-int.h index f137fa0..8b8772c 100644 --- a/src/format/mangling/demangler-int.h +++ b/src/format/mangling/demangler-int.h @@ -26,7 +26,6 @@ #include "demangler.h" -#include "../../analysis/prototype.h" diff --git a/src/format/mangling/demangler.h b/src/format/mangling/demangler.h index 3c9a6c1..fb23f16 100644 --- a/src/format/mangling/demangler.h +++ b/src/format/mangling/demangler.h @@ -28,7 +28,7 @@ #include <stdbool.h> -#include "../../analysis/prototype.h" +#include "../../analysis/routine.h" diff --git a/src/format/symbol.c b/src/format/symbol.c index 40efdd2..b5e329b 100644 --- a/src/format/symbol.c +++ b/src/format/symbol.c @@ -27,6 +27,9 @@ #include <string.h> +#include "../analysis/routine.h" + + /* Symbole d'exécutable (instance) */ struct _GBinSymbol diff --git a/src/format/symbol.h b/src/format/symbol.h index f4fe299..17fdbcf 100644 --- a/src/format/symbol.h +++ b/src/format/symbol.h @@ -28,7 +28,6 @@ #include <glib-object.h> -#include "../analysis/prototype.h" #include "../arch/archbase.h" diff --git a/src/plugins/pglist.c b/src/plugins/pglist.c index 6725fd8..6d47f57 100644 --- a/src/plugins/pglist.c +++ b/src/plugins/pglist.c @@ -77,7 +77,7 @@ bool init_all_plugins(GObject *ref) { _list.ref = ref; - browse_directory_for_plugins(&_list, PACKAGE_SOURCE_DIR "/plugins.disabled"); + browse_directory_for_plugins(&_list, PACKAGE_SOURCE_DIR "/plugins"); return true; diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c index 7c62146..e6e4a1a 100644 --- a/src/plugins/plugin.c +++ b/src/plugins/plugin.c @@ -135,7 +135,7 @@ GPluginModule *g_plugin_module_new(const gchar *filename, GObject *ref) result->module = g_module_open(filename, G_MODULE_BIND_LAZY); -#if 0 +#if 1 if (!g_module_symbol(result->module, "get_plugin_action", (gpointer *)&__get_action)) { printf("Err plugin get_action sym\n"); |