summaryrefslogtreecommitdiff
path: root/src/analysis
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/analysis
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/analysis')
-rw-r--r--src/analysis/binary.c16
-rw-r--r--src/analysis/decomp/decompiler.c66
-rw-r--r--src/analysis/routine.c87
-rw-r--r--src/analysis/routine.h15
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 */