diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2010-11-11 01:22:43 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2010-11-11 01:22:43 (GMT) |
commit | b33a52031c0d44a79604bc8d9036c30bffd020cb (patch) | |
tree | c825e3330684ca57f7c423328cd116b2d6ec0f6a /src/format/format.c | |
parent | 828124e38d266e382bb1477ef51c9fac8e81c591 (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.c | 119 |
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] * |