diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2009-06-16 22:46:35 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2009-06-16 22:46:35 (GMT) |
commit | 23c7cd436e2ec980a68e6d12a6d8a750e357763c (patch) | |
tree | 0c27434a3ab3946e9b4766ae8ebe28ab399d9d84 /src/analysis | |
parent | df1f4c4e1a5bb929f4345b1273d16558c0ba77de (diff) |
Made links between lines of code (x86 only).
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@79 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/analysis')
-rw-r--r-- | src/analysis/binary.c | 98 | ||||
-rw-r--r-- | src/analysis/line-int.h | 5 | ||||
-rw-r--r-- | src/analysis/line.c | 49 | ||||
-rw-r--r-- | src/analysis/line.h | 3 | ||||
-rw-r--r-- | src/analysis/line_code.c | 19 | ||||
-rw-r--r-- | src/analysis/line_code.h | 3 |
6 files changed, 176 insertions, 1 deletions
diff --git a/src/analysis/binary.c b/src/analysis/binary.c index 61d344e..6b5697a 100644 --- a/src/analysis/binary.c +++ b/src/analysis/binary.c @@ -87,6 +87,9 @@ GRenderingLine *build_binary_prologue(const char *, const uint8_t *, off_t); /* Procède au désassemblage basique d'un contenu binaire. */ void disassemble_openida_binary(openida_binary *); +/* Etablit les liens entres les différentes lignes de code. */ +void establish_links_in_openida_binary(const openida_binary *); + /****************************************************************************** @@ -665,7 +668,7 @@ void disassemble_openida_binary(openida_binary *binary) } - + establish_links_in_openida_binary(binary); line = g_rendering_line_find_by_address(binary->lines, NULL, get_exe_entry_point(binary->format)); if (line != NULL) g_rendering_line_add_flag(line, RLF_ENTRY_POINT); @@ -674,3 +677,96 @@ void disassemble_openida_binary(openida_binary *binary) } + + +/****************************************************************************** +* * +* Paramètres : binary = binaire dont le contenu est à lier. * +* * +* Description : Etablit les liens entres les différentes lignes de code. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void establish_links_in_openida_binary(const openida_binary *binary) +{ + GBinRoutine **routines; /* Liste des routines trouvées */ + size_t routines_count; /* Nombre de ces routines */ + size_t i; /* Boucle de parcours */ + vmpa_t start; /* Adresse de départ */ + vmpa_t end; /* Adresse de fin */ + GRenderingLine *iter; /* Boucle de parcours */ + GArchInstruction *instr; /* Instruction à ausculter */ + vmpa_t addr; /* Adresse référencée */ + InstructionLinkType type; /* Type de référence */ + GRenderingLine *target; /* Ligne visée par la référence*/ + + routines = get_all_exe_routines(binary->format, &routines_count); + + for (i = 0; i < routines_count; i++) + { + start = g_binary_routine_get_address(routines[i]); + end = start + g_binary_routine_get_size(routines[i]); + + for (iter = g_rendering_line_find_by_address(binary->lines, NULL, start); + iter != NULL; + iter = g_rendering_line_get_next_iter(binary->lines, iter, NULL)) + { + /* Si on sort de la zone... */ + if (get_rendering_line_address(iter) >= end) break; + + /* On ne traite que du code ici ! */ + if (!G_IS_CODE_LINE(iter)) continue; + + instr = g_code_line_get_instruction(G_CODE_LINE(iter)); + type = g_arch_instruction_get_link(instr, &addr); + + switch (type) + { + case ILT_NONE: + break; + + case ILT_JUMP: + + target = g_rendering_line_find_by_address(binary->lines, NULL, addr); + + if (target != NULL) + g_rendering_line_link_with(iter, target, type); + + break; + + case ILT_JUMP_IF_TRUE: + + target = g_rendering_line_find_by_address(binary->lines, NULL, addr); + + if (target != NULL) + { + g_rendering_line_link_with(iter, target, type); + + target = g_rendering_line_get_next_iter(binary->lines, iter, NULL); + if (target != NULL) + g_rendering_line_link_with(iter, target, ILT_JUMP_IF_FALSE); + + } + + break; + + case ILT_CALL: + + target = g_rendering_line_find_by_address(binary->lines, NULL, addr); + + if (target != NULL) + g_rendering_line_link_with(iter, target, type); + + break; + + } + + } + + } + +} diff --git a/src/analysis/line-int.h b/src/analysis/line-int.h index a70df85..97aa93c 100644 --- a/src/analysis/line-int.h +++ b/src/analysis/line-int.h @@ -51,6 +51,11 @@ struct _GRenderingLine RenderingLineType type; /* Type de représentation */ RenderingLineFlag flags; /* Extension d'informations */ + GRenderingLine **from; /* Origines des références */ + size_t from_count; /* Nombre de ces origines */ + GRenderingLine *to; /* Eventuelle ligne visée */ + InstructionLinkType link_type; /* Type de visée */ + PangoLayout *layout; /* Moteur de rendu du code/txt */ get_bin_len_fc get_bin_len; /* Nbre d'octets représentés */ diff --git a/src/analysis/line.c b/src/analysis/line.c index 08ef3c1..31a8a36 100644 --- a/src/analysis/line.c +++ b/src/analysis/line.c @@ -48,6 +48,9 @@ static void g_rendering_line_class_init(GRenderingLineClass *); /* Initialise une instance de ligne de représentation. */ static void g_rendering_line_init(GRenderingLine *); +/* Etablit un lien entre deux lignes de représentation. */ +static void g_rendering_line_add_link_reference(GRenderingLine *, GRenderingLine *); + /* Charge une image destinée à être rendue avec la ligne. */ static GdkPixbuf *g_rendering_line_render_icon(const GRenderingLine *, const char *, GtkIconSize); @@ -247,6 +250,52 @@ RenderingLineFlag g_rendering_line_get_flags(const GRenderingLine *line) /****************************************************************************** * * +* Paramètres : line = ligne dont les informations sont à consulter. * +* src = ligne visée par la liaison (côté origine). * +* * +* Description : Etablit un lien entre deux lignes de représentation. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_rendering_line_add_link_reference(GRenderingLine *line, GRenderingLine *src) +{ + line->from = (GRenderingLine **)realloc(line->from, ++line->from_count * sizeof(GRenderingLine *)); + + line->from[line->from_count - 1] = src; + +} + + +/****************************************************************************** +* * +* Paramètres : line = ligne dont les informations sont à consulter. * +* dest = ligne visée par la liaison (côté destination). * +* type = type de lien à construire. * +* * +* Description : Etablit un lien entre deux lignes de représentation. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_rendering_line_link_with(GRenderingLine *line, GRenderingLine *dest, InstructionLinkType type) +{ + g_rendering_line_add_link_reference(dest, line); + + line->to = dest; + line->link_type = type; + +} + + +/****************************************************************************** +* * * Paramètres : line = ligne dont les informations sont à consulter. * * stock_id = identifiant GTK de l'image à charger. * * size = taille de l'image souhaitée. * diff --git a/src/analysis/line.h b/src/analysis/line.h index 69deb57..b27bd9b 100644 --- a/src/analysis/line.h +++ b/src/analysis/line.h @@ -101,6 +101,9 @@ void g_rendering_line_toggle_flag(GRenderingLine *, RenderingLineFlag); /* Fournit les informations supplémentaires d'une ligne. */ RenderingLineFlag g_rendering_line_get_flags(const GRenderingLine *); +/* Etablit un lien entre deux lignes de représentation. */ +void g_rendering_line_link_with(GRenderingLine *, GRenderingLine *, InstructionLinkType); + /* Procède à l'initialisation des bases d'une représentation. */ void g_rendering_line_draw(GRenderingLine *, GdkDrawable *, GdkGC *, gint, gint, gint, gint); diff --git a/src/analysis/line_code.c b/src/analysis/line_code.c index cd7eba6..dcb8c5e 100644 --- a/src/analysis/line_code.c +++ b/src/analysis/line_code.c @@ -294,3 +294,22 @@ GRenderingLine *g_code_line_new(uint64_t offset, GArchInstruction *instr, const return G_RENDERING_LINE(result); } + + +/****************************************************************************** +* * +* Paramètres : line = line de rendu à consulter. * +* * +* Description : Fournit l'instruction associée à la ligne de code binaire. * +* * +* Retour : Adresse de l'instruction associée. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GArchInstruction *g_code_line_get_instruction(const GCodeLine *line) +{ + return line->instr; + +} diff --git a/src/analysis/line_code.h b/src/analysis/line_code.h index 8a06f28..9c9d8e9 100644 --- a/src/analysis/line_code.h +++ b/src/analysis/line_code.h @@ -54,6 +54,9 @@ GType g_code_line_get_type(void); /* Crée une ligne de code binaire. */ GRenderingLine *g_code_line_new(uint64_t, GArchInstruction *, const disass_options *); +/* Fournit l'instruction associée à la ligne de code binaire. */ +GArchInstruction *g_code_line_get_instruction(const GCodeLine *); + #endif /* _ANALYSIS_LINE_CODE_H */ |