diff options
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)) | 
