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/analysis | |
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/analysis')
-rw-r--r-- | src/analysis/binary.c | 16 | ||||
-rw-r--r-- | src/analysis/decomp/decompiler.c | 66 | ||||
-rw-r--r-- | src/analysis/routine.c | 87 | ||||
-rw-r--r-- | src/analysis/routine.h | 15 |
4 files changed, 183 insertions, 1 deletions
diff --git a/src/analysis/binary.c b/src/analysis/binary.c index 949bb31..0159b29 100644 --- a/src/analysis/binary.c +++ b/src/analysis/binary.c @@ -593,6 +593,22 @@ static void limit_all_routines(GRenderingLine *lines, GBinRoutine **routines, si for (i = 0; i < count; i++) { + /* Instruction de départ */ + + /* FIXME : faire mieux ! */ + + line = g_rendering_line_find_by_address(lines, NULL, starts[i]); + if (line != NULL) line = g_rendering_line_loop_for_code(line, NULL); + + if (line != NULL) + { + instr = g_code_line_get_instruction(G_CODE_LINE(line)); + + g_binary_routine_set_instructions(routines[i], instr); + + } + + if (lengths[i] > 0) continue; start = g_binary_routine_get_address(routines[i]); diff --git a/src/analysis/decomp/decompiler.c b/src/analysis/decomp/decompiler.c index 284d3e1..9e8ec38 100644 --- a/src/analysis/decomp/decompiler.c +++ b/src/analysis/decomp/decompiler.c @@ -34,12 +34,16 @@ #include "../../decomp/output.h" #include "../../decomp/lang/java.h" /* FIXME : remme ! */ +#include "../../format/format.h" /* Construit la description d'introduction de la décompilation. */ static void build_decomp_prologue(GCodeBuffer *, const char *); +/* S'assure de la transcription de routines en expressions. */ +static void prepare_all_routines_for_decomp(const GOpenidaBinary *, const char *); + /****************************************************************************** @@ -108,6 +112,59 @@ static void build_decomp_prologue(GCodeBuffer *buffer, const char *filename) * Paramètres : binary = représentation de binaire chargé. * * filename = nom du fichier source à cibler. * * * +* Description : S'assure de la transcription de routines en expressions. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void prepare_all_routines_for_decomp(const GOpenidaBinary *binary, const char *filename) +{ + GExeFormat *format; /* Format du binaire fourni */ + + GBinRoutine **routines; + size_t count; + + size_t i; + + GDecInstruction *instr; + + format = g_openida_binary_get_format(binary); + + + routines = g_binary_format_get_routines(G_BIN_FORMAT(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_format_decompile_routine(G_BIN_FORMAT(format), routines[i]); + + } + + + } + + + + +} + + +/****************************************************************************** +* * +* Paramètres : binary = représentation de binaire chargé. * +* filename = nom du fichier source à cibler. * +* * * Description : Procède à la décompilation des routines d'un fichier donné. * * * * Retour : Tampon de code mis en place. * @@ -119,6 +176,7 @@ static void build_decomp_prologue(GCodeBuffer *buffer, const char *filename) GCodeBuffer *decompile_all_from_file(const GOpenidaBinary *binary, const char *filename) { GCodeBuffer *result; /* Tampon constitué à renvoyer */ + GExeFormat *format; /* Format du binaire fourni */ result = g_code_buffer_new(); @@ -126,6 +184,14 @@ GCodeBuffer *decompile_all_from_file(const GOpenidaBinary *binary, const char *f build_decomp_prologue(result, filename); + prepare_all_routines_for_decomp(binary, filename); + + + + + format = g_openida_binary_get_format(binary); + g_binary_format_decompile(G_BIN_FORMAT(format), result); + return result; } diff --git a/src/analysis/routine.c b/src/analysis/routine.c index 0c8d83a..ad82407 100644 --- a/src/analysis/routine.c +++ b/src/analysis/routine.c @@ -55,6 +55,9 @@ struct _GBinRoutine GBinVariable **locals; /* Variables locales du code */ size_t locals_count; /* Nombre de variables locales */ + GArchInstruction *instr; /* Instructions natives */ + GDecInstruction *dinstr; /* Instructions décompilées */ + }; @@ -770,3 +773,87 @@ char *_g_binary_routine_to_string(const GBinRoutine *routine, Routine2StringOpti return result; } + + +/****************************************************************************** +* * +* Paramètres : routine = routine à consulter. * +* * +* Description : Fournit les instructions natives correspondantes. * +* * +* Retour : Ensemble d'instructions décompilées ou NULL. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GArchInstruction *g_binary_routine_get_instructions(const GBinRoutine *routine) +{ + return routine->instr; + +} + + +/****************************************************************************** +* * +* Paramètres : routine = routine à mettre à jour. * +* instr = série d'instructions à conserver. * +* * +* Description : Définit les instructions natives de la routine. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_binary_routine_set_instructions(GBinRoutine *routine, GArchInstruction *instr) +{ + if (routine->instr != NULL) + g_object_unref(G_OBJECT(routine->instr)); + + routine->instr = instr; + +} + + +/****************************************************************************** +* * +* Paramètres : routine = routine à consulter. * +* * +* Description : Fournit les instructions décompilées correspondantes. * +* * +* Retour : Ensemble d'instructions décompilées ou NULL. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GDecInstruction *g_binary_routine_get_decomp_instructions(const GBinRoutine *routine) +{ + return routine->dinstr; + +} + + +/****************************************************************************** +* * +* Paramètres : routine = routine à mettre à jour. * +* instr = série d'instructions à conserver. * +* * +* Description : Définit les instructions décompilées de la routine. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_binary_routine_set_decomp_instructions(GBinRoutine *routine, GDecInstruction *instr) +{ + if (routine->dinstr != NULL) + g_object_unref(G_OBJECT(routine->dinstr)); + + routine->dinstr = instr; + +} diff --git a/src/analysis/routine.h b/src/analysis/routine.h index e2ea1cc..47de5bd 100644 --- a/src/analysis/routine.h +++ b/src/analysis/routine.h @@ -31,7 +31,8 @@ #include "variable.h" -#include "../arch/archbase.h" +#include "../arch/instruction.h" +#include "../decomp/instruction.h" @@ -143,6 +144,18 @@ char *_g_binary_routine_to_string(const GBinRoutine *, Routine2StringOptions); #define g_binary_routine_to_string(r) _g_binary_routine_to_string((r), RSO_ALL) +/* Fournit les instructions natives correspondantes. */ +GArchInstruction *g_binary_routine_get_instructions(const GBinRoutine *); + +/* Définit les instructions natives de la routine. */ +void g_binary_routine_set_instructions(GBinRoutine *, GArchInstruction *); + +/* Fournit les instructions décompilées correspondantes. */ +GDecInstruction *g_binary_routine_get_decomp_instructions(const GBinRoutine *); + +/* Définit les instructions décompilées de la routine. */ +void g_binary_routine_set_decomp_instructions(GBinRoutine *, GDecInstruction *); + #endif /* _ANALYSIS_ROUTINE_H */ |