diff options
| author | Cyrille Bagard <nocbos@gmail.com> | 2009-03-04 01:38:27 (GMT) | 
|---|---|---|
| committer | Cyrille Bagard <nocbos@gmail.com> | 2009-03-04 01:38:27 (GMT) | 
| commit | 674739bedc853681be5a2657a7a4f497d6e82c9b (patch) | |
| tree | 10e65041c0607d4e5a20c0a7a77fe75e1bbd7737 /src/analysis | |
| parent | bbd04bf5f23e7dca1917247cb92824805b22a2a4 (diff) | |
Added a line type for binary code display.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@51 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/analysis')
| -rw-r--r-- | src/analysis/line.c | 292 | ||||
| -rw-r--r-- | src/analysis/line.h | 42 | 
2 files changed, 326 insertions, 8 deletions
| diff --git a/src/analysis/line.c b/src/analysis/line.c index 7431e94..052adea 100644 --- a/src/analysis/line.c +++ b/src/analysis/line.c @@ -27,6 +27,7 @@  #include <malloc.h>  #include <stdio.h>  #include <string.h> +#include <sys/param.h>  #include "../common/dllist.h" @@ -38,6 +39,17 @@ extern GtkWidget *mywid; + + + +/* Méthode de mise à jour du nombre d'octets maximal par instruction. */ +typedef void (* get_bin_len_fc) (rendering_line *, off_t *); + +/* Méthode de mise à jour d'une ligne de représentation. */ +typedef void (* refresh_markup_fc) (rendering_line *); + + +  /* Ligne de représentation générique */  struct _rendering_line  { @@ -47,6 +59,11 @@ struct _rendering_line      PangoLayout *layout;                    /* Moteur de rendu du code/txt */ +    get_bin_len_fc get_bin_len;             /* Nbre d'octets représentés   */ +    off_t max_bin_len;                      /* Nombre global maximal       */ + +    refresh_markup_fc refresh_markup;       /* Reconstruit la représentat° */ +  }; @@ -77,11 +94,29 @@ void refresh_prologue_markup(prologue_line *); +/* ------------------------ LIGNE DE CODE EN LANGAGE MACHINE ------------------------ */ + +/* Ligne de représentation de prologue */ +typedef struct _code_line +{ +    rendering_line basic;                   /* A laisser en premier        */ + +    asm_instr *instr;                       /* Instruction représentée     */ +    const disass_options *options;          /* Options de représentation   */ + +} code_line; +/* Taille max d'une traduction */ +#define CODE_BUFFER_LEN 128 +/* Met à jour la nombre d'octets maximale par instruction. */ +void get_code_binary_len(code_line *, off_t *); + +/* Met à jour la ligne de représentation de code. */ +void refresh_code_markup(code_line *); @@ -106,6 +141,8 @@ void init_rendering_line(rendering_line *line)      line->layout = gtk_widget_create_pango_layout(mywid, NULL); +    line->get_bin_len = NULL; +    line->refresh_markup = NULL; @@ -137,6 +174,78 @@ void add_line_to_rendering_lines(rendering_line **lines, rendering_line *line) + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : line = ligne de représentation à actualiser.                 * +*                blen = longueur maximale à mettre à jour. [OUT]              * +*                                                                             * +*  Description : Met à jour le nombre d'octets maximal par instruction.       * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +void get_rendering_line_binary_len(rendering_line *line, off_t *blen) +{ +    if (line->get_bin_len != NULL) +        line->get_bin_len(line, blen); + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : line = ligne de représentation à actualiser.                 * +*                blen = longueur maximale à prendre en compte.                * +*                                                                             * +*  Description : Prend en compte le nombre d'octets maximal par instruction.  * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +void set_rendering_line_max_binary_len(rendering_line *line, off_t blen) +{ +    line->max_bin_len = blen * 2 + (blen - 1); + +    line->refresh_markup(line); + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : line   = adresse de la structure à représenter.              * +*                width  = largeur maximale des lignes à compléter.            * +*                height = hauteur maximale des lignes à compléter.            * +*                                                                             * +*  Description : Fournit les dimensions d'une ligne par rapport à d'autres.   * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +void get_rendering_line_size(rendering_line *line, int *width, int *height) +{ +    int w;                                  /* Largeur de l'objet actuelle */ +    int h;                                  /* Hauteur de l'objet actuelle */ + +    pango_layout_get_pixel_size(line->layout, &w, &h); + +    *width = MAX(*width, w); +    *height += h; + +} + +  /******************************************************************************  *                                                                             *  *  Paramètres  : line     = adresse de la structure à représenter.            * @@ -170,9 +279,9 @@ void draw_rendering_line(rendering_line *line, GdkDrawable *drawable, GdkGC *gc,  *                                                                             *  *  Paramètres  : comment = texte à afficher au final.                         *  *                                                                             * -*  Description : Choisit d'afficher le code brut ou non.                      * +*  Description : Crée une des lignes de description initiales.                *  *                                                                             * -*  Retour      : -                                                            * +*  Retour      : Adresse de la structure mise en place.                       *  *                                                                             *  *  Remarques   : -                                                            *  *                                                                             * @@ -188,9 +297,9 @@ rendering_line *create_prologue_line(const char *comment)      RENDERING_LINE(result)->type = RLT_PROLOGUE; -    result->comment = strdup(comment); +    RENDERING_LINE(result)->refresh_markup = (refresh_markup_fc)refresh_prologue_markup; -    refresh_prologue_markup(result); +    result->comment = strdup(comment);      return RENDERING_LINE(result); @@ -229,3 +338,178 @@ void refresh_prologue_markup(prologue_line *line)  } + +/* ---------------------------------------------------------------------------------- */ +/*                          LIGNE DE CODE EN LANGAGE MACHINE                          */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : instr   = instruction à représenter.                         * +*                options = paramétrage du rendu.                              * +*                                                                             * +*  Description : Crée une ligne de représentation de code binaire.            * +*                                                                             * +*  Retour      : Adresse de la structure mise en place.                       * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +rendering_line *create_code_line(asm_instr *instr, const disass_options *options) +{ +    code_line *result;                      /* Structure à retourner       */ + +    result = (code_line *)calloc(1, sizeof(code_line)); + +    init_rendering_line(RENDERING_LINE(result)); + +    RENDERING_LINE(result)->type = RLT_CODE; + +    RENDERING_LINE(result)->get_bin_len = (get_bin_len_fc)get_code_binary_len; +    RENDERING_LINE(result)->refresh_markup = (refresh_markup_fc)refresh_code_markup; + +    result->instr = instr; +    result->options = options; + +    return RENDERING_LINE(result); + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : line = ligne de représentation à actualiser.                 * +*                blen = longueur maximale à mettre à jour. [OUT]              * +*                                                                             * +*  Description : Met à jour le nombre d'octets maximal par instruction.       * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +void get_code_binary_len(code_line *line, off_t *blen) +{ +    off_t len;                              /* Taille propre à la ligne    */ + +    get_asm_instr_offset_and_length(line->instr, NULL, &len); + +    *blen = MAX(*blen, len); + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : line = ligne de représentation à actualiser.                 * +*                                                                             * +*  Description : Met à jour la ligne de représentation de code.               * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +void refresh_code_markup(code_line *line) +{ +    size_t len;                             /* Taille du contenu           */ +    char *content;                          /* Contenu réellement imprimé  */ +    off_t bin_offset;                       /* Début de l'instruction      */ +    off_t bin_len;                          /* Taille d'instruction        */ +    char buffer[CODE_BUFFER_LEN];           /* Zone tampon à utiliser      */ +    const uint8_t *exe_content;             /* Contenu binaire global      */ +    char *bin_code;                         /* Tampon du code binaire      */ +    off_t k;                                /* Boucle de parcours #2       */ +    off_t j;                                /* Boucle de parcours #1       */ + +    len = strlen("<tt>") + 1; +    content = (char *)calloc(len, sizeof(char)); +    strcpy(content, "<tt>"); + +    if (line->options->show_address || line->options->show_code) +        get_asm_instr_offset_and_length(line->instr, &bin_offset, &bin_len); + +    /* Eventuelle adresse virtuelle */ + +    if (line->options->show_address) +    { +        switch (ADM_32BITS  /* FIXME */) +        { +            case ADM_32BITS: +                snprintf(buffer, CODE_BUFFER_LEN, +                         "<span foreground='#333333'>0x%08llx</span>", +                         bin_offset); +                break; + +            case ADM_64BITS: +                snprintf(buffer, CODE_BUFFER_LEN, +                         "<span foreground='#333333'>0x%16llx</span>", +                         bin_offset); +                break; + +        } + +        len += strlen(buffer); +        content = (char *)realloc(content, len * sizeof(char)); +        strcat(content, buffer); + +    } + +    /* Eventuel code brut */ + +    if (line->options->show_code) +    { +        exe_content = get_exe_content(line->options->format, NULL); + +        bin_code = (char *)calloc(RENDERING_LINE(line)->max_bin_len + 1, sizeof(char)); + +        k = 0; + +        for (j = 0; j < bin_len; j++) +        { +            if ((j + 1) < bin_len) +                k += snprintf(&bin_code[j * (2 + 1)], 4, "%02hhx ", exe_content[bin_offset + j]); +            else +                k += snprintf(&bin_code[j * (2 + 1)], 3, "%02hhx", exe_content[bin_offset + j]); +        } +  +        for (; k < RENDERING_LINE(line)->max_bin_len; k++) +            snprintf(&bin_code[k], 2, " "); + +        if (line->options->show_address) len += strlen("\t"); +        len += strlen(bin_code); +        content = (char *)realloc(content, len * sizeof(char)); +        if (line->options->show_address) strcat(content, "\t"); +        strcat(content, bin_code); + +        free(bin_code); + +    } + +    /* Instruction proprement dite */ + +    print_hinstruction(line->options->proc, line->options->format, +                       line->instr, buffer, CODE_BUFFER_LEN, ASX_INTEL/*FIXME*/); + +    if (line->options->show_address || line->options->show_code) len += strlen("\t"); +    len += strlen(buffer); + +    content = (char *)realloc(content, len * sizeof(char)); +    if (line->options->show_address || line->options->show_code) strcat(content, "\t"); +    strcat(content, buffer); + +    /* Finalisation */ + +    len += strlen("</tt>"); +    content = (char *)realloc(content, len * sizeof(char)); +    strcat(content, "</tt>"); + +    pango_layout_set_markup(RENDERING_LINE(line)->layout, content, len - 1); + +    free(content); + +} diff --git a/src/analysis/line.h b/src/analysis/line.h index dd0915c..cd2ec71 100644 --- a/src/analysis/line.h +++ b/src/analysis/line.h @@ -28,12 +28,16 @@  #include <gtk/gtk.h> +#include "../arch/processor.h" +#include "../format/exe_format.h" + + +  /* Définitions des types de ligne */  typedef enum _RenderingLineType  { -    RLT_PROLOGUE                            /* Description de l'analyse    */ - - +    RLT_PROLOGUE,                           /* Description de l'analyse    */ +    RLT_CODE                                /* Code en langage machine     */  } RenderingLineType; @@ -50,6 +54,15 @@ void add_line_to_rendering_lines(rendering_line **, rendering_line *); +/* Met à jour la nombre d'octets maximale par instruction. */ +void get_rendering_line_binary_len(rendering_line *, off_t *); + +/* Prend en compte le nombre d'octets maximal par instruction. */ +void set_rendering_line_max_binary_len(rendering_line *, off_t); + +/* Fournit les dimensions d'une ligne par rapport à d'autres. */ +void get_rendering_line_size(rendering_line *, int *, int *); +  /* Procède à l'initialisation des bases d'une représentation. */  void draw_rendering_line(rendering_line *, GdkDrawable *, GdkGC *, gint, gint); @@ -58,11 +71,32 @@ void draw_rendering_line(rendering_line *, GdkDrawable *, GdkGC *, gint, gint);  /* ------------------------- LIGNE EN TETE DE DESASSEMBLAGE ------------------------- */ -/* Choisit d'afficher le code brut ou non. */ +/* Crée une des lignes de description initiales. */  rendering_line *create_prologue_line(const char *); +/* ------------------------ LIGNE DE CODE EN LANGAGE MACHINE ------------------------ */ + + +/* Passage de paramètres compact */ +typedef struct _disass_options +{ +    bool show_address;                      /* Affichage de l'adresse ?    */ +    bool show_code;                         /* Affichage du code brut ?    */ + +    exe_format *format;                     /* Format du contenu bianire   */ +    asm_processor *proc;                    /* Architecture utilisée       */ + +} disass_options; + + +/* Crée une ligne de représentation de code binaire. */ +rendering_line *create_code_line(asm_instr *, const disass_options *); + + + +  #endif  /* _ANALYSIS_LINE_H */ | 
