summaryrefslogtreecommitdiff
path: root/src/analysis
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2009-03-11 22:59:46 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2009-03-11 22:59:46 (GMT)
commitc4231094c9c77c685371d726d28e65c0459486de (patch)
tree2d4bb57239cb46bd2b1194c853c3a7263e487455 /src/analysis
parent29a22c425f492427f45b71de937f2d99587c8d34 (diff)
Inserted comments into disassembled code.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@53 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/analysis')
-rw-r--r--src/analysis/line.c226
-rw-r--r--src/analysis/line.h31
-rw-r--r--src/analysis/prototype.c46
-rw-r--r--src/analysis/prototype.h9
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);