diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2010-11-06 00:29:36 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2010-11-06 00:29:36 (GMT) |
commit | 828124e38d266e382bb1477ef51c9fac8e81c591 (patch) | |
tree | 37d1d6af336987030791ba4c41b89a8cf144d270 /src/analysis | |
parent | c1ff0021b42fb5738a0cb31da15c12eb6dfac816 (diff) |
Defined the entry point for decompilations.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@189 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/analysis')
-rwxr-xr-x | src/analysis/Makefile.am | 5 | ||||
-rw-r--r-- | src/analysis/binary.c | 52 | ||||
-rw-r--r-- | src/analysis/binary.h | 6 | ||||
-rwxr-xr-x | src/analysis/decomp/Makefile.am | 14 | ||||
-rw-r--r-- | src/analysis/decomp/decompiler.c | 131 | ||||
-rw-r--r-- | src/analysis/decomp/decompiler.h | 37 | ||||
-rw-r--r-- | src/analysis/exporter.h | 31 |
7 files changed, 243 insertions, 33 deletions
diff --git a/src/analysis/Makefile.am b/src/analysis/Makefile.am index 3c22aa6..604835d 100755 --- a/src/analysis/Makefile.am +++ b/src/analysis/Makefile.am @@ -15,6 +15,9 @@ libanalysis_la_SOURCES = \ type.h type.c \ variable.h variable.c +libanalysis_la_LIBADD = \ + decomp/libanalysisdecomp.la + libanalysis_la_LDFLAGS = @@ -24,4 +27,4 @@ AM_CPPFLAGS = AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS) -SUBDIRS = +SUBDIRS = decomp diff --git a/src/analysis/binary.c b/src/analysis/binary.c index 63450a3..949bb31 100644 --- a/src/analysis/binary.c +++ b/src/analysis/binary.c @@ -142,6 +142,10 @@ struct _GOpenidaBinary GRenderingLine *lines; /* Lignes de rendu en place */ GRenderingOptions *options; /* Options de désassemblage */ + char **src_files; /* Nom des fichiers source */ + GCodeBuffer **dec_buffers; /* Sources sous forme de texte */ + size_t decbuf_count; /* Taille des tableaux */ + GBreakGroup **brk_groups; /* Groupes de points d'arrêt */ size_t brk_count; /* Taille de cette liste */ GBreakGroup *brk_default; /* Groupe par défaut */ @@ -1340,9 +1344,41 @@ GArchInstruction *g_openida_binary_get_instructions(const GOpenidaBinary *binary } +/****************************************************************************** +* * +* Paramètres : binary = élément binaire à consulter. * +* filename = nom de fichier à retrouver. * +* * +* Description : Fournit le tampon associé au contenu d'un fichier source. * +* * +* Retour : Tampon mis en place ou NULL si aucun (!). * +* * +* Remarques : - * +* * +******************************************************************************/ +GCodeBuffer *g_openida_binary_get_decompiled_buffer(const GOpenidaBinary *binary, const char *filename) +{ + GCodeBuffer *result; /* Tampon à retourner */ + size_t i; /* Boucle de parcours */ + result = NULL; + for (i = 0; i < binary->decbuf_count; i++) + { + /* Si aucune demande précise, on renvoie le premier ! */ + if (filename == NULL + || strcmp(binary->src_files[i], filename) == 0) + { + result = binary->dec_buffers[i]; + break; + } + + } + + return result; + +} /****************************************************************************** @@ -1495,6 +1531,22 @@ void ack_completed_disassembly(GDelayedDisassembly *disass, GOpenidaBinary *bina size_t i; /* Boucle de parcours */ + /* Décompilation... */ + + + binary->decbuf_count++; + binary->src_files = (char **)calloc(binary->decbuf_count, sizeof(char *)); + binary->dec_buffers = (GCodeBuffer **)calloc(binary->decbuf_count, sizeof(GCodeBuffer *)); + + binary->dec_buffers[0] = decompile_all_from_file(binary, "RC4.java"); + + + + + + + + g_rendering_line_merge(&binary->lines, &disass->lines); diff --git a/src/analysis/binary.h b/src/analysis/binary.h index da0bcf7..666cfaa 100644 --- a/src/analysis/binary.h +++ b/src/analysis/binary.h @@ -31,9 +31,10 @@ #include "line.h" #include "../arch/processor.h" +#include "../common/xml.h" #include "../debug/break.h" #include "../format/executable.h" -#include "../common/xml.h" +#include "../glibext/gcodebuffer.h" @@ -108,6 +109,9 @@ GRenderingLine *g_openida_binary_get_lines(const GOpenidaBinary *); /* Fournit les instructions issues du désassemblage. */ GArchInstruction *g_openida_binary_get_instructions(const GOpenidaBinary *); +/* Fournit le tampon associé au contenu d'un fichier source. */ +GCodeBuffer *g_openida_binary_get_decompiled_buffer(const GOpenidaBinary *, const char *); + /* ------------------------------ ELEMENTS DE DEBOGAGE ------------------------------ */ diff --git a/src/analysis/decomp/Makefile.am b/src/analysis/decomp/Makefile.am new file mode 100755 index 0000000..7b797bd --- /dev/null +++ b/src/analysis/decomp/Makefile.am @@ -0,0 +1,14 @@ + +noinst_LTLIBRARIES = libanalysisdecomp.la + +libanalysisdecomp_la_SOURCES = \ + decompiler.h decompiler.c + +libanalysisdecomp_la_LDFLAGS = + + +INCLUDES = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS) + +AM_CPPFLAGS = + +AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS) diff --git a/src/analysis/decomp/decompiler.c b/src/analysis/decomp/decompiler.c new file mode 100644 index 0000000..284d3e1 --- /dev/null +++ b/src/analysis/decomp/decompiler.c @@ -0,0 +1,131 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * decompiler.h - prototypes pour l'encadrement des phases de décompilation + * + * Copyright (C) 2010 Cyrille Bagard + * + * This file is part of OpenIDA. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#include "decompiler.h" + + +#include <malloc.h> +#include <stdio.h> +#include <string.h> + + +#include <i18n.h> + + +#include "../../decomp/output.h" +#include "../../decomp/lang/java.h" /* FIXME : remme ! */ + + + +/* Construit la description d'introduction de la décompilation. */ +static void build_decomp_prologue(GCodeBuffer *, const char *); + + + +/****************************************************************************** +* * +* Paramètres : buffer = tampon de destination pour le texte. * +* filename = nom du fichier ciblé à décompiler. * +* * +* Description : Construit la description d'introduction de la décompilation. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void build_decomp_prologue(GCodeBuffer *buffer, const char *filename) +{ + GLangOutput *output; /* Modèle de sortie adéquat */ + GBufferLine *line; /* Ligne de destination */ + size_t len; /* Taille du texte */ + char *content; /* Contenu textuel d'une ligne */ + + output = g_java_output_new(); + + /* Introduction */ + + line = g_lang_output_write_comments(output, buffer, + SL(_("Binary data decompiled by OpenIDA"))); + g_buffer_line_start_merge_at(line, BLC_ADDRESS); + + line = g_lang_output_write_comments(output, buffer, + SL(_("OpenIDA is free software - © 2008-2010 Cyrille Bagard"))); + g_buffer_line_start_merge_at(line, BLC_ADDRESS); + + line = g_lang_output_write_comments(output, buffer, NULL, 0); + g_buffer_line_start_merge_at(line, BLC_ADDRESS); + + /* Fichier */ + + if (filename == NULL) + filename = _("whole binary"); + + len = strlen(_("File: ")) + strlen(filename) + 1; + content = (char *)calloc(len, sizeof(char)); + + snprintf(content, len, "%s%s", _("File: "), filename); + + line = g_lang_output_write_comments(output, buffer, content, len - 1); + g_buffer_line_start_merge_at(line, BLC_ADDRESS); + + free(content); + + /* Lignes de séparation */ + + line = g_lang_output_write_comments(output, buffer, NULL, 0); + g_buffer_line_start_merge_at(line, BLC_ADDRESS); + + line = g_lang_output_write_comments(output, buffer, NULL, 0); + g_buffer_line_start_merge_at(line, BLC_ADDRESS); + +} + + +/****************************************************************************** +* * +* 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. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GCodeBuffer *decompile_all_from_file(const GOpenidaBinary *binary, const char *filename) +{ + GCodeBuffer *result; /* Tampon constitué à renvoyer */ + + result = g_code_buffer_new(); + + + build_decomp_prologue(result, filename); + + + return result; + +} diff --git a/src/analysis/decomp/decompiler.h b/src/analysis/decomp/decompiler.h new file mode 100644 index 0000000..363ad27 --- /dev/null +++ b/src/analysis/decomp/decompiler.h @@ -0,0 +1,37 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * decompiler.h - prototypes pour l'encadrement des phases de décompilation + * + * Copyright (C) 2010 Cyrille Bagard + * + * This file is part of OpenIDA. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#ifndef _ANALYSIS_DECOMP_DECOMPILER_H +#define _ANALYSIS_DECOMP_DECOMPILER_H + + +#include "../binary.h" + + + +/* Procède à la décompilation des routines d'un fichier donné. */ +GCodeBuffer *decompile_all_from_file(const GOpenidaBinary *, const char *); + + + +#endif /* _ANALYSIS_DECOMP_DECOMPILER_H */ diff --git a/src/analysis/exporter.h b/src/analysis/exporter.h index 56ad2ab..eb4cb5d 100644 --- a/src/analysis/exporter.h +++ b/src/analysis/exporter.h @@ -34,37 +34,6 @@ #include "../glibext/gbufferline.h" -/* Types de partie de rendu */ -typedef enum _RenderingTagType -{ - RTT_RAW, /* Contenu brut */ - - RTT_COMMENT, /* Commentaire */ - RTT_RAW_CODE, /* Code binaire brut */ - - RTT_INSTRUCTION, /* Code binaire brut */ - - RTT_IMMEDIATE, /* Valeur immédiate */ - - RTT_REGISTER, /* Registre */ - - RTT_HOOK, /* Crochets '[' et ']' */ - RTT_SIGNS, /* Signes '+', '-' et '*' */ - RTT_LTGT, /* Caractères '<' et '>' */ - - RTT_SECTION, /* Identifiant de section */ - RTT_SEGMENT, /* Indication de segment */ - RTT_STRING, /* Chaîne de caractères avec " */ - - RTT_VAR_NAME, /* Nom de variable */ - - RTT_COUNT - -} RenderingTagType; - - -#define RTT_NONE RTT_RAW /* TODO : remme */ - #define G_TYPE_CONTENT_EXPORTER g_content_exporter_get_type() #define G_CONTENT_EXPORTER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_content_exporter_get_type(), GContentExporter)) |