diff options
Diffstat (limited to 'src/analysis')
| -rw-r--r-- | src/analysis/binary.c | 98 | ||||
| -rw-r--r-- | src/analysis/line-int.h | 5 | ||||
| -rw-r--r-- | src/analysis/line.c | 49 | ||||
| -rw-r--r-- | src/analysis/line.h | 3 | ||||
| -rw-r--r-- | src/analysis/line_code.c | 19 | ||||
| -rw-r--r-- | src/analysis/line_code.h | 3 | 
6 files changed, 176 insertions, 1 deletions
| diff --git a/src/analysis/binary.c b/src/analysis/binary.c index 61d344e..6b5697a 100644 --- a/src/analysis/binary.c +++ b/src/analysis/binary.c @@ -87,6 +87,9 @@ GRenderingLine *build_binary_prologue(const char *, const uint8_t *, off_t);  /* Procède au désassemblage basique d'un contenu binaire. */  void disassemble_openida_binary(openida_binary *); +/* Etablit les liens entres les différentes lignes de code. */ +void establish_links_in_openida_binary(const openida_binary *); +  /****************************************************************************** @@ -665,7 +668,7 @@ void disassemble_openida_binary(openida_binary *binary)      } - +    establish_links_in_openida_binary(binary);      line = g_rendering_line_find_by_address(binary->lines, NULL, get_exe_entry_point(binary->format));      if (line != NULL) g_rendering_line_add_flag(line, RLF_ENTRY_POINT); @@ -674,3 +677,96 @@ void disassemble_openida_binary(openida_binary *binary)  } + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : binary = binaire dont le contenu est à lier.                 * +*                                                                             * +*  Description : Etablit les liens entres les différentes lignes de code.     * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +void establish_links_in_openida_binary(const openida_binary *binary) +{ +    GBinRoutine **routines;                 /* Liste des routines trouvées */ +    size_t routines_count;                  /* Nombre de ces routines      */ +    size_t i;                               /* Boucle de parcours          */ +    vmpa_t start;                           /* Adresse de départ           */ +    vmpa_t end;                             /* Adresse de fin              */ +    GRenderingLine *iter;                   /* Boucle de parcours          */ +    GArchInstruction *instr;                /* Instruction à ausculter     */ +    vmpa_t addr;                            /* Adresse référencée          */ +    InstructionLinkType type;               /* Type de référence           */ +    GRenderingLine *target;                 /* Ligne visée par la référence*/ + +    routines = get_all_exe_routines(binary->format, &routines_count); + +    for (i = 0; i < routines_count; i++) +    { +        start = g_binary_routine_get_address(routines[i]); +        end = start + g_binary_routine_get_size(routines[i]); + +        for (iter = g_rendering_line_find_by_address(binary->lines, NULL, start); +             iter != NULL; +             iter = g_rendering_line_get_next_iter(binary->lines, iter, NULL)) +        { +            /* Si on sort de la zone... */ +            if (get_rendering_line_address(iter) >= end) break; + +            /* On ne traite que du code ici ! */ +            if (!G_IS_CODE_LINE(iter)) continue; + +            instr = g_code_line_get_instruction(G_CODE_LINE(iter)); +            type = g_arch_instruction_get_link(instr, &addr); + +            switch (type) +            { +                case ILT_NONE: +                    break; + +                case ILT_JUMP: + +                    target = g_rendering_line_find_by_address(binary->lines, NULL, addr); + +                    if (target != NULL) +                        g_rendering_line_link_with(iter, target, type); + +                    break; + +                case ILT_JUMP_IF_TRUE: + +                    target = g_rendering_line_find_by_address(binary->lines, NULL, addr); + +                    if (target != NULL) +                    { +                        g_rendering_line_link_with(iter, target, type); + +                        target = g_rendering_line_get_next_iter(binary->lines, iter, NULL); +                        if (target != NULL) +                            g_rendering_line_link_with(iter, target, ILT_JUMP_IF_FALSE); + +                    } + +                    break; + +                case ILT_CALL: + +                    target = g_rendering_line_find_by_address(binary->lines, NULL, addr); + +                    if (target != NULL) +                        g_rendering_line_link_with(iter, target, type); + +                    break; + +            } + +        } + +    } + +} diff --git a/src/analysis/line-int.h b/src/analysis/line-int.h index a70df85..97aa93c 100644 --- a/src/analysis/line-int.h +++ b/src/analysis/line-int.h @@ -51,6 +51,11 @@ struct _GRenderingLine      RenderingLineType type;                 /* Type de représentation      */      RenderingLineFlag flags;                /* Extension d'informations    */ +    GRenderingLine **from;                  /* Origines des références     */ +    size_t from_count;                      /* Nombre de ces origines      */ +    GRenderingLine *to;                     /* Eventuelle ligne visée      */ +    InstructionLinkType link_type;          /* Type de visée               */ +      PangoLayout *layout;                    /* Moteur de rendu du code/txt */      get_bin_len_fc get_bin_len;             /* Nbre d'octets représentés   */ diff --git a/src/analysis/line.c b/src/analysis/line.c index 08ef3c1..31a8a36 100644 --- a/src/analysis/line.c +++ b/src/analysis/line.c @@ -48,6 +48,9 @@ static void g_rendering_line_class_init(GRenderingLineClass *);  /* Initialise une instance de ligne de représentation. */  static void g_rendering_line_init(GRenderingLine *); +/* Etablit un lien entre deux lignes de représentation. */ +static void g_rendering_line_add_link_reference(GRenderingLine *, GRenderingLine *); +  /* Charge une image destinée à être rendue avec la ligne. */  static GdkPixbuf *g_rendering_line_render_icon(const GRenderingLine *, const char *, GtkIconSize); @@ -247,6 +250,52 @@ RenderingLineFlag g_rendering_line_get_flags(const GRenderingLine *line)  /******************************************************************************  *                                                                             * +*  Paramètres  : line = ligne dont les informations sont à consulter.         * +*                src  = ligne visée par la liaison (côté origine).            * +*                                                                             * +*  Description : Etablit un lien entre deux lignes de représentation.         * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +void g_rendering_line_add_link_reference(GRenderingLine *line, GRenderingLine *src) +{ +    line->from = (GRenderingLine **)realloc(line->from, ++line->from_count * sizeof(GRenderingLine *)); + +    line->from[line->from_count - 1] = src; + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : line = ligne dont les informations sont à consulter.         * +*                dest = ligne visée par la liaison (côté destination).        * +*                type = type de lien à construire.                            * +*                                                                             * +*  Description : Etablit un lien entre deux lignes de représentation.         * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +void g_rendering_line_link_with(GRenderingLine *line, GRenderingLine *dest, InstructionLinkType type) +{ +    g_rendering_line_add_link_reference(dest, line); + +    line->to = dest; +    line->link_type = type; + +} + + +/****************************************************************************** +*                                                                             *  *  Paramètres  : line     = ligne dont les informations sont à consulter.     *  *                stock_id = identifiant GTK de l'image à charger.             *  *                size     = taille de l'image souhaitée.                      * diff --git a/src/analysis/line.h b/src/analysis/line.h index 69deb57..b27bd9b 100644 --- a/src/analysis/line.h +++ b/src/analysis/line.h @@ -101,6 +101,9 @@ void g_rendering_line_toggle_flag(GRenderingLine *, RenderingLineFlag);  /* Fournit les informations supplémentaires d'une ligne. */  RenderingLineFlag g_rendering_line_get_flags(const GRenderingLine *); +/* Etablit un lien entre deux lignes de représentation. */ +void g_rendering_line_link_with(GRenderingLine *, GRenderingLine *, InstructionLinkType); +  /* Procède à l'initialisation des bases d'une représentation. */  void g_rendering_line_draw(GRenderingLine *, GdkDrawable *, GdkGC *, gint, gint, gint, gint); diff --git a/src/analysis/line_code.c b/src/analysis/line_code.c index cd7eba6..dcb8c5e 100644 --- a/src/analysis/line_code.c +++ b/src/analysis/line_code.c @@ -294,3 +294,22 @@ GRenderingLine *g_code_line_new(uint64_t offset, GArchInstruction *instr, const      return G_RENDERING_LINE(result);  } + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : line = line de rendu à consulter.                            * +*                                                                             * +*  Description : Fournit l'instruction associée à la ligne de code binaire.   * +*                                                                             * +*  Retour      : Adresse de l'instruction associée.                           * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +GArchInstruction *g_code_line_get_instruction(const GCodeLine *line) +{ +    return line->instr; + +} diff --git a/src/analysis/line_code.h b/src/analysis/line_code.h index 8a06f28..9c9d8e9 100644 --- a/src/analysis/line_code.h +++ b/src/analysis/line_code.h @@ -54,6 +54,9 @@ GType g_code_line_get_type(void);  /* Crée une ligne de code binaire. */  GRenderingLine *g_code_line_new(uint64_t, GArchInstruction *, const disass_options *); +/* Fournit l'instruction associée à la ligne de code binaire. */ +GArchInstruction *g_code_line_get_instruction(const GCodeLine *); +  #endif  /* _ANALYSIS_LINE_CODE_H */ | 
