diff options
Diffstat (limited to 'src/format')
-rw-r--r-- | src/format/format.c | 119 | ||||
-rw-r--r-- | src/format/format.h | 8 |
2 files changed, 126 insertions, 1 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] * diff --git a/src/format/format.h b/src/format/format.h index 0223525..073fae3 100644 --- a/src/format/format.h +++ b/src/format/format.h @@ -32,7 +32,7 @@ #include "symbol.h" #include "../analysis/routine.h" - +#include "../decomp/instruction.h" /* ------------------------ TRAITEMENT INDIVIDUEL DE FORMATS ------------------------ */ @@ -70,6 +70,12 @@ void g_binary_format_add_routine(GBinFormat *, GBinRoutine *); /* Fournit le prototype de toutes les routines détectées. */ GBinRoutine **g_binary_format_get_routines(const GBinFormat *, size_t *); +/* Procède à la décompilation basique d'une routine donnée. */ +GDecInstruction *g_binary_format_decompile_routine(const GBinFormat *, GBinRoutine *); + +/* Procède à la décompilation complète du format. */ +void g_binary_format_decompile(const GBinFormat *, GCodeBuffer *); + /* Recherche le symbole correspondant à une adresse. */ bool g_binary_format_resolve_symbol(const GBinFormat *, const char **, SymbolType *, vmpa_t *); |