summaryrefslogtreecommitdiff
path: root/src/analysis/disass/links.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2015-03-08 19:30:52 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2015-03-08 19:30:52 (GMT)
commit68bb7efaf61e4f5ca2f2cffce84995ffd667c4cc (patch)
tree9b6a6f63ee20b08d8c2ac35849ee051d61787447 /src/analysis/disass/links.c
parentdc9e68505c4cc7ad208e63dbc7d0e0e8f582d0d9 (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/disass/links.c')
-rw-r--r--src/analysis/disass/links.c147
1 files changed, 147 insertions, 0 deletions
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
+