diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2015-03-08 19:30:52 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2015-03-08 19:30:52 (GMT) |
commit | 68bb7efaf61e4f5ca2f2cffce84995ffd667c4cc (patch) | |
tree | 9b6a6f63ee20b08d8c2ac35849ee051d61787447 /src/analysis | |
parent | dc9e68505c4cc7ad208e63dbc7d0e0e8f582d0d9 (diff) |
Handle cross references as well as entry points.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@482 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/analysis')
-rw-r--r-- | src/analysis/disass/disassembler.c | 37 | ||||
-rw-r--r-- | src/analysis/disass/links.c | 147 | ||||
-rw-r--r-- | src/analysis/disass/links.h | 14 |
3 files changed, 196 insertions, 2 deletions
diff --git a/src/analysis/disass/disassembler.c b/src/analysis/disass/disassembler.c index de9830c..37e6996 100644 --- a/src/analysis/disass/disassembler.c +++ b/src/analysis/disass/disassembler.c @@ -262,6 +262,43 @@ static void g_delayed_disassembly_process(GDelayedDisassembly *disass, GtkExtSta + + + /** + * TODO : établir les couvertures de fonctions, + * pour être en mesure de disposer de résolution de type XXX+yyy lors + * de l'établissement des liens. + */ + + + + + /* Seconde étape */ + + id = gtk_extended_status_bar_push(statusbar, _("Establishing links..."), true); + + + /** + * + * Lequel choisir ??? + +G_BIN_FORMAT(disass->format) +G_BIN_FORMAT(g_loaded_binary_get_format(disass->binary) + + */ + + + establish_links_between_instructions(*disass->instrs, G_BIN_FORMAT(disass->format), statusbar, id); + + gtk_extended_status_bar_remove(statusbar, id); + + //run_plugins_on_binary(disass->binary, PGA_BINARY_LINKED, true); + + + + + + /* Septième étape */ //id = gtk_extended_status_bar_push(statusbar, _("Printing disassembled code..."), true); diff --git a/src/analysis/disass/links.c b/src/analysis/disass/links.c index dc870fc..022ace3 100644 --- a/src/analysis/disass/links.c +++ b/src/analysis/disass/links.c @@ -26,9 +26,150 @@ #include "../../arch/instruction.h" +#include "../../arch/target.h" +/* Complète un désassemblage accompli pour une instruction. */ +static void convert_immediate_into_target(GArchInstruction *, size_t, GBinFormat *); + + + + + + + + +/****************************************************************************** +* * +* Paramètres : instr = instruction désassemblée à traiter. * +* index = indice de l'opérande à traiter. * +* format = accès aux données du binaire d'origine. * +* * +* Description : Complète un désassemblage accompli pour une instruction. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void convert_immediate_into_target(GArchInstruction *instr, size_t index, GBinFormat *format) +{ + GArchOperand *op; /* Opérande numérique en place */ + virt_t addr; /* Adresse visée par le saut */ + MemoryDataSize msize; /* Taille de l'opérande */ + GArchOperand *new; /* Instruction de ciblage */ + + op = g_arch_instruction_get_operand(instr, index); + if (!G_IS_IMM_OPERAND(op)) return; + + if (g_imm_operand_to_virt_t(G_IMM_OPERAND(op), &addr)) + { + msize = g_imm_operand_get_size(G_IMM_OPERAND(op)); + + new = g_target_operand_new(msize, addr); + + if (!g_target_operand_resolve(G_TARGET_OPERAND(new), format)) + g_object_unref(G_OBJECT(new)); + else + g_arch_instruction_replace_operand(instr, new, op); + + } + +} + + +/****************************************************************************** +* * +* Paramètres : instr = instruction désassemblée à traiter. * +* list = ensemble d'instructions à relier. * +* format = accès aux données du binaire d'origine. * +* * +* Description : Complète un désassemblage accompli pour une instruction. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void establish_links_for_instruction(GArchInstruction *instr, GArchInstruction *list, GBinFormat *format) +{ + size_t count; /* Nombre d'opérandes présents */ + size_t i; /* Boucle de parcours */ + GArchOperand *op; /* Opérande numérique en place */ + virt_t virt; /* Adresse liée à une cible */ + vmpa2t addr; /* Localisation plus complète */ + GArchInstruction *target; /* Instruction visée au final */ + + count = g_arch_instruction_count_operands(instr); + + for (i = 0; i < count; i++) + { + convert_immediate_into_target(instr, i, format); + + op = g_arch_instruction_get_operand(instr, i); + if (!G_IS_TARGET_OPERAND(op)) continue; + + virt = g_target_operand_get_addr(G_TARGET_OPERAND(op)); + init_vmpa(&addr, VMPA_NO_PHYSICAL, virt); + + target = g_arch_instruction_find_by_address(list, &addr, true); + + if (target != NULL) + g_arch_instruction_link_with(instr, target, ILT_JUMP /* FIXME */); + + } + +} + + +/****************************************************************************** +* * +* Paramètres : list = ensemble d'instructions à relier. * +* format = accès aux données du binaire d'origine. * +* statusbar = barre de statut avec progression à mettre à jour.* +* id = identifiant du message affiché à l'utilisateur. * +* * +* Description : Etablit les liens entres les différentes lignes de code. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void establish_links_between_instructions(GArchInstruction *list, GBinFormat *format, GtkExtStatusBar *statusbar, bstatus_id_t id) +{ + GArchInstruction *iter; /* Boucle de parcours */ + + for (iter = list; + iter != NULL; + iter = g_arch_instruction_get_next_iter(list, iter, ~0/* FIXME */)) + { + + + establish_links_for_instruction(iter, list, format); + + + } + +} + + + + + + + + + + + + +#if 0 + /****************************************************************************** * * * Paramètres : list = ensemble d'instructions à relier. * @@ -153,3 +294,9 @@ void establish_links_between_lines(GArchInstruction *list, GBinRoutine **routine } } + + + + +#endif + diff --git a/src/analysis/disass/links.h b/src/analysis/disass/links.h index 2522e74..f4092f9 100644 --- a/src/analysis/disass/links.h +++ b/src/analysis/disass/links.h @@ -25,12 +25,22 @@ #define _ANALYSIS_DISASS_LINKS_H -#include "../routine.h" +//#include "../routine.h" +#include "../../arch/instruction.h" +#include "../../format/format.h" #include "../../gtkext/gtkextstatusbar.h" + + +/* Etablit les liens entres les différentes lignes de code. */ +void establish_links_between_instructions(GArchInstruction *, GBinFormat *, GtkExtStatusBar *, bstatus_id_t); + + + + /* Etablit les liens entres les différentes lignes de code. */ -void establish_links_between_lines(GArchInstruction *, GBinRoutine **, size_t, GtkExtStatusBar *, bstatus_id_t); +//void establish_links_between_lines(GArchInstruction *, GBinRoutine **, size_t, GtkExtStatusBar *, bstatus_id_t); |