diff options
Diffstat (limited to 'src/analysis')
-rw-r--r-- | src/analysis/line.c | 226 | ||||
-rw-r--r-- | src/analysis/line.h | 31 | ||||
-rw-r--r-- | src/analysis/prototype.c | 46 | ||||
-rw-r--r-- | src/analysis/prototype.h | 9 |
4 files changed, 296 insertions, 16 deletions
diff --git a/src/analysis/line.c b/src/analysis/line.c index 052adea..f5f3d9c 100644 --- a/src/analysis/line.c +++ b/src/analysis/line.c @@ -55,6 +55,8 @@ struct _rendering_line { DL_LIST_ITEM; + uint64_t offset; /* Position en mémoire/physique*/ + RenderingLineType type; /* Type de représentation */ PangoLayout *layout; /* Moteur de rendu du code/txt */ @@ -75,7 +77,6 @@ void init_rendering_line(rendering_line *); - /* ------------------------- LIGNE EN TETE DE DESASSEMBLAGE ------------------------- */ @@ -94,6 +95,25 @@ void refresh_prologue_markup(prologue_line *); +/* ----------------------- COMMENTAIRES SUR UNE LIGNE ENTIERE ----------------------- */ + + +/* Ligne de commantaires entière */ +typedef struct _comment_line +{ + rendering_line basic; /* A laisser en premier */ + + char *comment; /* Texte à afficher */ + const disass_options *options; /* Options de représentation */ + +} comment_line; + + +/* Met à jour la ligne de représentation de commentaires. */ +void refresh_comment_markup(comment_line *); + + + /* ------------------------ LIGNE DE CODE EN LANGAGE MACHINE ------------------------ */ @@ -162,7 +182,7 @@ void init_rendering_line(rendering_line *line) * * * Retour : - * * * -* Remarques : - * +* Remarques : La ligne est considérée comme étant insérée au bon endroit. * * * ******************************************************************************/ @@ -173,6 +193,48 @@ void add_line_to_rendering_lines(rendering_line **lines, rendering_line *line) } +/****************************************************************************** +* * +* Paramètres : lines = liste de lignes à compléter, ou NULL. * +* line = nouvelle ligne à intégrer à l'ensemble. * +* first = position de la ligne en cas d'adresse partagée. * +* * +* Description : Insère une ligne dans un ensemble existant. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void insert_line_into_rendering_lines(rendering_line **lines, rendering_line *line, bool first) +{ + rendering_line *iter; /* Boucle de parcours */ + rendering_line *next; /* Prochaine ligne parcourue */ + + dl_list_for_each_safe(iter, DLL_HCAST(lines), next, rendering_line *) + { + if (first && iter->offset >= line->offset) break; + else if (!first) + { + /* TODO */; + } + + } + + if (iter == NULL) + dl_list_add_tail(line, DLL_HCAST(lines)); + + else + { + if (first) + dl_list_insert_before(line, iter, DLL_HCAST(lines)); + else + /* TODO */; + } + +} + @@ -295,6 +357,8 @@ rendering_line *create_prologue_line(const char *comment) init_rendering_line(RENDERING_LINE(result)); + RENDERING_LINE(result)->offset = 0; + RENDERING_LINE(result)->type = RLT_PROLOGUE; RENDERING_LINE(result)->refresh_markup = (refresh_markup_fc)refresh_prologue_markup; @@ -340,6 +404,154 @@ void refresh_prologue_markup(prologue_line *line) /* ---------------------------------------------------------------------------------- */ +/* COMMENTAIRES SUR UNE LIGNE ENTIERE */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : offset = position dans la mémoire ou le fichier. * +* type = type du commentaire. * +* comment = texte à afficher au final. * +* options = paramétrage du rendu. * +* * +* Description : Crée une ligne de commentaires entière. * +* * +* Retour : Adresse de la structure mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +rendering_line *create_comment_line(uint64_t offset, RenderingLineType type, const char *comment, const disass_options *options) +{ + comment_line *result; /* Structure à retourner */ + + result = (prologue_line *)calloc(1, sizeof(prologue_line)); + + init_rendering_line(RENDERING_LINE(result)); + + RENDERING_LINE(result)->offset = offset; + + RENDERING_LINE(result)->type = type; + + RENDERING_LINE(result)->refresh_markup = (refresh_markup_fc)refresh_comment_markup; + + result->comment = strdup(comment); + result->options = options; + + return RENDERING_LINE(result); + +} + + +/****************************************************************************** +* * +* Paramètres : line = ligne de représentation à actualiser. * +* * +* Description : Met à jour la ligne de représentation de commentaires. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void refresh_comment_markup(comment_line *line) +{ + size_t len; /* Taille du contenu */ + char *content; /* Contenu réellement imprimé */ + char buffer[CODE_BUFFER_LEN]; /* Zone tampon à utiliser */ + size_t clen; /* Taille du commentaire */ + + len = strlen("<tt>") + 1; + content = (char *)calloc(len, sizeof(char)); + strcpy(content, "<tt>"); + + /* Eventuelle adresse virtuelle */ + + if (line->options->show_address) + { + switch (ADM_32BITS /* FIXME */) + { + case ADM_32BITS: + snprintf(buffer, CODE_BUFFER_LEN, + "<span foreground='#333333'>0x%08llx</span>", + RENDERING_LINE(line)->offset); + break; + + case ADM_64BITS: + snprintf(buffer, CODE_BUFFER_LEN, + "<span foreground='#333333'>0x%16llx</span>", + RENDERING_LINE(line)->offset); + break; + + } + + len += strlen(buffer); + content = (char *)realloc(content, len * sizeof(char)); + strcat(content, buffer); + + } + + /* Eventuel code brut (sauté) */ + + if (line->options->show_code) + { + clen = (line->options->show_address ? strlen("\t") : 0); + clen += RENDERING_LINE(line)->max_bin_len; + + content = (char *)realloc(content, (len + clen) * sizeof(char)); + + if (line->options->show_address) + { + strcat(content, "\t"); + len += strlen("\t"); + } + + memset(&content[len - 1], RENDERING_LINE(line)->type == RLT_PROTOTYPE ? '-' : ' ', + RENDERING_LINE(line)->max_bin_len); + len += RENDERING_LINE(line)->max_bin_len; + + content[len] = '\0'; + + } + + /* Commentaire proprement dit */ + + clen = (line->options->show_address || line->options->show_code ? strlen("\t") : 0); + clen += strlen("<b><span foreground='#003300'>"); + clen += strlen("; ") + strlen(line->comment); + clen += strlen("</span></b>"); + + content = (char *)realloc(content, (len + clen) * sizeof(char)); + + if (line->options->show_address || line->options->show_code) + { + strcat(content, "\t"); + len += strlen("\t"); + clen -= strlen("\t"); + } + + snprintf(&content[len - 1], clen + 1, "<b><span foreground='#003300'>; %s</span></b>", line->comment); + + len += clen; + + /* Finalisation */ + + len += strlen("</tt>"); + content = (char *)realloc(content, len * sizeof(char)); + strcat(content, "</tt>"); + + pango_layout_set_markup(RENDERING_LINE(line)->layout, content, len - 1); + + free(content); + +} + + + +/* ---------------------------------------------------------------------------------- */ /* LIGNE DE CODE EN LANGAGE MACHINE */ /* ---------------------------------------------------------------------------------- */ @@ -357,7 +569,7 @@ void refresh_prologue_markup(prologue_line *line) * * ******************************************************************************/ -rendering_line *create_code_line(asm_instr *instr, const disass_options *options) +rendering_line *create_code_line(asm_instr *instr, uint64_t offset, const disass_options *options) { code_line *result; /* Structure à retourner */ @@ -365,6 +577,8 @@ rendering_line *create_code_line(asm_instr *instr, const disass_options *options init_rendering_line(RENDERING_LINE(result)); + RENDERING_LINE(result)->offset = offset; + RENDERING_LINE(result)->type = RLT_CODE; RENDERING_LINE(result)->get_bin_len = (get_bin_len_fc)get_code_binary_len; @@ -430,7 +644,7 @@ void refresh_code_markup(code_line *line) content = (char *)calloc(len, sizeof(char)); strcpy(content, "<tt>"); - if (line->options->show_address || line->options->show_code) + if (line->options->show_code) get_asm_instr_offset_and_length(line->instr, &bin_offset, &bin_len); /* Eventuelle adresse virtuelle */ @@ -442,13 +656,13 @@ void refresh_code_markup(code_line *line) case ADM_32BITS: snprintf(buffer, CODE_BUFFER_LEN, "<span foreground='#333333'>0x%08llx</span>", - bin_offset); + RENDERING_LINE(line)->offset); break; case ADM_64BITS: snprintf(buffer, CODE_BUFFER_LEN, "<span foreground='#333333'>0x%16llx</span>", - bin_offset); + RENDERING_LINE(line)->offset); break; } diff --git a/src/analysis/line.h b/src/analysis/line.h index cd2ec71..b0635bf 100644 --- a/src/analysis/line.h +++ b/src/analysis/line.h @@ -25,6 +25,7 @@ #define _ANALYSIS_LINE_H +#include <stdbool.h> #include <gtk/gtk.h> @@ -37,10 +38,21 @@ typedef enum _RenderingLineType { RLT_PROLOGUE, /* Description de l'analyse */ + RLT_PROTOTYPE, /* Prototype de fonction */ RLT_CODE /* Code en langage machine */ } RenderingLineType; +/* Passage de paramètres compact */ +typedef struct _disass_options +{ + bool show_address; /* Affichage de l'adresse ? */ + bool show_code; /* Affichage du code brut ? */ + + exe_format *format; /* Format du contenu bianire */ + asm_processor *proc; /* Architecture utilisée */ + +} disass_options; @@ -52,6 +64,9 @@ typedef struct _rendering_line rendering_line; /* Ajoute une ligne à un ensemble existant. */ void add_line_to_rendering_lines(rendering_line **, rendering_line *); +/* Insère une ligne dans un ensemble existant. */ +void insert_line_into_rendering_lines(rendering_line **, rendering_line *, bool); + /* Met à jour la nombre d'octets maximale par instruction. */ @@ -76,23 +91,19 @@ rendering_line *create_prologue_line(const char *); -/* ------------------------ LIGNE DE CODE EN LANGAGE MACHINE ------------------------ */ +/* ----------------------- COMMENTAIRES SUR UNE LIGNE ENTIERE ----------------------- */ -/* Passage de paramètres compact */ -typedef struct _disass_options -{ - bool show_address; /* Affichage de l'adresse ? */ - bool show_code; /* Affichage du code brut ? */ +/* Crée une ligne de commentaires entière. */ +rendering_line *create_comment_line(uint64_t, RenderingLineType, const char *, const disass_options *); - exe_format *format; /* Format du contenu bianire */ - asm_processor *proc; /* Architecture utilisée */ -} disass_options; + +/* ------------------------ LIGNE DE CODE EN LANGAGE MACHINE ------------------------ */ /* Crée une ligne de représentation de code binaire. */ -rendering_line *create_code_line(asm_instr *, const disass_options *); +rendering_line *create_code_line(asm_instr *, uint64_t, const disass_options *); diff --git a/src/analysis/prototype.c b/src/analysis/prototype.c index aa3ca2f..0d2ebf5 100644 --- a/src/analysis/prototype.c +++ b/src/analysis/prototype.c @@ -25,6 +25,7 @@ #include <malloc.h> +#include <string.h> #include "../common/extstr.h" @@ -34,6 +35,12 @@ /* Variable représentant un prototype de routine */ struct _bin_routine { + + uint64_t offset; /* Position physique/mémoire */ + + + + RoutineType type; /* Type de routine */ variable *ret_type; /* Type retourné */ @@ -103,6 +110,45 @@ void delete_binary_routine(bin_routine *routine) /****************************************************************************** * * * Paramètres : routine = routine à mettre à jour. * +* offset = position mémoire ou physique déclarée. * +* * +* Description : Définit la position physique / en mémoire d'une routine. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void set_binary_routine_offset(bin_routine *routine, uint64_t offset) +{ + routine->offset = offset; + +} + + +/****************************************************************************** +* * +* Paramètres : routine = routine à mettre à jour. * +* * +* Description : Fournit la position physique / en mémoire d'une routine. * +* * +* Retour : Position mémoire ou physique déclarée. * +* * +* Remarques : - * +* * +******************************************************************************/ + +uint64_t get_binary_routine_offset(const bin_routine *routine) +{ + return routine->offset; + +} + + +/****************************************************************************** +* * +* Paramètres : routine = routine à mettre à jour. * * type = type de routine spécifié. * * * * Description : Définit le type d'une routine. * diff --git a/src/analysis/prototype.h b/src/analysis/prototype.h index f86d541..891f294 100644 --- a/src/analysis/prototype.h +++ b/src/analysis/prototype.h @@ -25,6 +25,9 @@ #define _ANALYSIS_PROTOTYPE_H +#include <stdint.h> + + #include "variable.h" @@ -49,6 +52,12 @@ bin_routine *create_binary_routine(void); /* Supprime une représentation de routine de la mémoire. */ void delete_binary_routine(bin_routine *); +/* Définit la position physique / en mémoire d'une routine. */ +void set_binary_routine_offset(bin_routine *, uint64_t); + +/* Fournit la position physique / en mémoire d'une routine. */ +uint64_t get_binary_routine_offset(const bin_routine *); + /* Définit le type d'une routine. */ void set_binary_routine_type(bin_routine *, RoutineType); |