diff options
Diffstat (limited to 'src/analysis')
-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 |
8 files changed, 381 insertions, 14 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; |