summaryrefslogtreecommitdiff
path: root/src/format/format.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2010-11-11 01:22:43 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2010-11-11 01:22:43 (GMT)
commitb33a52031c0d44a79604bc8d9036c30bffd020cb (patch)
treec825e3330684ca57f7c423328cd116b2d6ec0f6a /src/format/format.c
parent828124e38d266e382bb1477ef51c9fac8e81c591 (diff)
Built some expressions for the decompilation tree.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@190 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/format/format.c')
-rw-r--r--src/format/format.c119
1 files changed, 119 insertions, 0 deletions
diff --git a/src/format/format.c b/src/format/format.c
index c53e7aa..73f23bd 100644
--- a/src/format/format.c
+++ b/src/format/format.c
@@ -33,6 +33,7 @@
#include "elf/elf.h"
#include "java/java.h"
#include "pe/pe.h"
+#include "../decomp/expr/block.h"
#include "../panels/log.h"
@@ -269,6 +270,124 @@ GBinRoutine **g_binary_format_get_routines(const GBinFormat *format, size_t *cou
/******************************************************************************
* *
* Paramètres : format = informations chargées à consulter. *
+* routine = routine à traiter. *
+* *
+* Description : Procède à la décompilation basique d'une routine donnée. *
+* *
+* Retour : Instructions créées et enregistrées, ou NULL si erreur. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GDecInstruction *g_binary_format_decompile_routine(const GBinFormat *format, GBinRoutine *routine)
+{
+ GDecInstruction *result; /* Instructions décompilées */
+ GArchInstruction *instr; /* Instructions natives */
+ vmpa_t max; /* Première adresse à écarter */
+ GDecContext *ctx; /* Contexte de décompilation */
+ GArchInstruction *iter; /* Boucle de parcours */
+ GDecInstruction *dinstr; /* Nouvelle décompilation */
+
+ result = NULL;
+
+ instr = g_binary_routine_get_instructions(routine);
+ max = g_binary_routine_get_address(routine)
+ + g_binary_routine_get_size(routine);
+
+ printf("max :: 0x%08llx\n", max);
+
+ max = 0x00000a98ll; /* FIXME !!!! */
+
+ ctx = g_dec_context_new();
+ g_object_set_data(G_OBJECT(ctx), "format", format);
+ g_dec_context_set_max_address(ctx, max);
+
+ for (iter = instr;
+ iter != NULL;
+ iter = g_arch_instruction_get_next_iter(instr, iter, max))
+ {
+
+
+ printf("DECOMP isntr :: %p\n", iter);
+
+
+ dinstr = g_arch_instruction_decompile(iter, ctx);
+ if (dinstr == NULL) continue;
+
+ printf(" -> done :: %p\n", dinstr);
+
+ if (result == NULL) result = g_expr_block_new(dinstr);
+ else g_expr_block_add_item(G_EXPR_BLOCK(result), dinstr);
+
+ }
+
+
+
+
+
+ g_binary_routine_set_decomp_instructions(routine, result);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : format = informations chargées à consulter. *
+* buffer = tampon mis à disposition pour la sortie. *
+* *
+* Description : Procède à la décompilation complète du format. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_binary_format_decompile(const GBinFormat *format, GCodeBuffer *buffer)
+{
+
+
+ GBinRoutine **routines;
+ size_t count;
+
+ size_t i;
+
+ GDecInstruction *instr;
+
+
+ routines = g_binary_format_get_routines(format, &count);
+
+
+
+ for (i = 0; i < count; i++)
+ {
+ //printf(" -- %s --\n", g_binary_routine_get_name(routines[i]));
+
+ if (strcmp("cryptself", g_binary_routine_get_name(routines[i])) == 0)
+ {
+
+ printf("...\n");
+
+ instr = g_binary_routine_get_decomp_instructions(routines[i]);
+
+ g_dec_instruction_print(instr, buffer, NULL, g_java_output_new());
+
+
+
+ }
+
+
+ }
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : format = informations chargées à consulter. *
* label = étiquette du symbole si trouvé. [OUT] *
* type = type du symbole trouvé. [OUT] *
* address = adresse à cibler, puis décallage final. [OUT] *