From a738b482b70d263252ec4dc18919c71503490297 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Wed, 27 Aug 2014 21:50:21 +0000
Subject: Shown full ELF sections definitions.

git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@396 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
---
 ChangeLog                   |   9 +++
 src/analysis/disass/fetch.c |   2 -
 src/format/elf/elf_def.h    |  23 ++++--
 src/format/elf/symbols.c    | 171 +++++++++++++++++++++++++++++++++++++++++++-
 4 files changed, 196 insertions(+), 9 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 4b452a5..c759cf0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
 14-08-27  Cyrille Bagard <nocbos@gmail.com>
 
+	* src/analysis/disass/fetch.c:
+	Fix a bug: do not change the given processing limit in load_raw_binary().
+
+	* src/format/elf/elf_def.h:
+	* src/format/elf/symbols.c:
+	Show full ELF sections definitions.
+
+14-08-27  Cyrille Bagard <nocbos@gmail.com>
+
 	* src/dialogs/export.c:
 	* src/dialogs/goto.c:
 	* src/dialogs/plugins.c:
diff --git a/src/analysis/disass/fetch.c b/src/analysis/disass/fetch.c
index 73474b3..20128aa 100644
--- a/src/analysis/disass/fetch.c
+++ b/src/analysis/disass/fetch.c
@@ -77,8 +77,6 @@ GArchInstruction *load_raw_binary(const GLoadedBinary *binary, const vmpa2t *bas
     proc = get_arch_processor_from_format(G_EXE_FORMAT(format));
     bin_data = g_loaded_binary_get_data(binary, &bin_length);
 
-    end = bin_length;
-
     copy_vmpa(&pos, base);
     copy_vmpa(&prev, base);
 
diff --git a/src/format/elf/elf_def.h b/src/format/elf/elf_def.h
index 91e1c18..f863257 100644
--- a/src/format/elf/elf_def.h
+++ b/src/format/elf/elf_def.h
@@ -408,10 +408,25 @@ typedef union _elf_shdr
 
 /* Valeurs possibles pour sh_flags */
 
-#define SHF_WRITE       (1 << 0)            /* Accessible en écriture      */
-#define SHF_ALLOC       (1 << 1)            /* Copie en mémoire pdt l'exec.*/
-#define SHF_EXECINSTR   (1 << 2)            /* Section exécutable          */
-#define SHF_STRINGS     (1 << 5)            /* Contient des chaînes ('\0') */
+#define SHF_WRITE               (1 << 0)    /* Accessible en écriture      */
+#define SHF_ALLOC               (1 << 1)    /* Copie en mémoire pdt l'exec.*/
+#define SHF_EXECINSTR           (1 << 2)    /* Section exécutable          */
+#define SHF_MERGE               (1 << 4)    /* Peut être fusionné          */
+#define SHF_STRINGS             (1 << 5)    /* Contient des chaînes ('\0') */
+#define SHF_INFO_LINK           (1 << 6)    /* 'sh_info' contient un index */
+#define SHF_LINK_ORDER          (1 << 7)    /* Préservation de l'ordre     */
+#define SHF_OS_NONCONFORMING    (1 << 8)    /* Gestion non standard requise*/
+#define SHF_GROUP               (1 << 9)    /* Section membre d'un groupe  */
+#define SHF_TLS                 (1 << 10)   /* Données pour un thread local*/
+
+#define SHF_MASKOS           0x0ff00000 /* OS-specific.  */
+#define SHF_MASKPROC         0xf0000000 /* Processor-specific */
+#define SHF_ORDERED          (1 << 30)  /* Special ordering requirement
+                                           (Solaris).  */
+#define SHF_EXCLUDE          (1 << 31)  /* Section is excluded unless
+                                           referenced or allocated (Solaris).*/
+
+
 
 
 
diff --git a/src/format/elf/symbols.c b/src/format/elf/symbols.c
index 33a8c3f..dc3fbe0 100644
--- a/src/format/elf/symbols.c
+++ b/src/format/elf/symbols.c
@@ -912,10 +912,12 @@ static bool annotate_elf_section_header_table(GElfFormat *format)
     const bin_t *content;                   /* Contenu binaire à lire      */
     off_t length;                           /* Taille totale du contenu    */
     off_t offset;                           /* Tête de lecture du bbinaire */
+    elf_shdr strings;                       /* Section des descriptions    */
     vmpa2t *pos;                            /* Localisation des symboles   */
     uint16_t e_shnum;                       /* Nombre d'éléments 'Program' */
     uint16_t i;                             /* Boucle de parcours          */
     elf_shdr shdr;                          /* En-tête de programme ELF    */
+    const char *secname;                    /* Nom d'une section analysée  */
     ImmOperandDisplay disp;                 /* Afficahge de valeur         */
     const char *text;                       /* Texte constant à insérer    */
     GArchInstruction *instr;                /* Instruction décodée         */
@@ -928,6 +930,9 @@ static bool annotate_elf_section_header_table(GElfFormat *format)
     content = G_BIN_FORMAT(format)->content;
     length = G_BIN_FORMAT(format)->length;
 
+    if (!find_elf_section_by_index(format, ELF_HDR(format, format->header, e_shstrndx), &strings))
+        return false;
+
     offset = ELF_HDR(format, format->header, e_shoff);
 
     pos = make_vmpa(offset, 0x9900);
@@ -936,18 +941,30 @@ static bool annotate_elf_section_header_table(GElfFormat *format)
 
     for (i = 0; i < e_shnum; i++)
     {
-        if (!read_elf_section_header(format, offset, &shdr))
+        if (!read_elf_section_header(format, get_phy_addr(pos), &shdr))
             break;
 
         /* Champ "sh_name" */
 
-        text = _("Section name");
+        secname = extract_name_from_elf_string_section(format, &strings,
+                                                       ELF_SHDR(format, shdr, sh_name));
+
+        if (secname == NULL)
+            dtext = strdup(_("Section name: <invalid>"));
+        else
+        {
+            dtext = strdup(_("Section name: '"));
+            dtext = stradd(dtext, secname);
+            dtext = stradd(dtext, "'");
+        }
 
         instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian);
 
         SET_IMM_DISPLAY(instr, operand, 0, IOD_DEC);
 
-        ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, text);
+        ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, dtext);
+
+        free(dtext);
 
         /* Champ "sh_type" */
 
@@ -1061,6 +1078,10 @@ static bool annotate_elf_section_header_table(GElfFormat *format)
                 disp = IOD_HEX;
                 text = _("Section type: application-specific");
                 break;
+            default:
+                disp = IOD_HEX;
+                text = _("Section type: unknown");
+                break;
         }
 
         instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian);
@@ -1069,15 +1090,159 @@ static bool annotate_elf_section_header_table(GElfFormat *format)
 
         ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, text);
 
+        /* Champ "sh_flags"... */
 
+        dtext = strdup(_("Section flags: "));
+        filled = false;
+
+        if (ELF_SHDR(format, shdr, sh_type) & SHF_WRITE)
+        {
+            dtext = stradd(dtext, "W");
+            filled = true;
+        }
 
+        if (ELF_SHDR(format, shdr, sh_type) & SHF_ALLOC)
+        {
+            dtext = stradd(dtext, "A");
+            filled = true;
+        }
 
+        if (ELF_SHDR(format, shdr, sh_type) & SHF_EXECINSTR)
+        {
+            dtext = stradd(dtext, "X");
+            filled = true;
+        }
 
+        if (ELF_SHDR(format, shdr, sh_type) & SHF_MERGE)
+        {
+            dtext = stradd(dtext, "M");
+            filled = true;
+        }
 
+        if (ELF_SHDR(format, shdr, sh_type) & SHF_LINK_ORDER)
+        {
+            dtext = stradd(dtext, "L");
+            filled = true;
+        }
 
+        if (ELF_SHDR(format, shdr, sh_type) & SHF_TLS)
+        {
+            dtext = stradd(dtext, "T");
+            filled = true;
+        }
 
+        if (!filled)
+            dtext = stradd(dtext, _("none"));
 
+        if (format->is_32b)
+        {
+            /* Champ "sh_flags" (suite) */
 
+            instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian);
+
+            ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, dtext);
+
+            free(dtext);
+
+            /* Champ "sh_addr" */
+
+            instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian);
+
+            ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Section virtual addr at execution"));
+
+            /* Champ "sh_offset" */
+
+            instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian);
+
+            ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Section file offset"));
+
+            /* Champ "sh_size" */
+
+            instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian);
+
+            SET_IMM_DISPLAY(instr, operand, 0, IOD_DEC);
+
+            ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Section size in bytes"));
+
+        }
+        else
+        {
+            /* Champ "sh_flags" (suite) */
+
+            instr = g_raw_instruction_new_array(content, MDS_64_BITS, 1, pos, length, format->endian);
+
+            ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, dtext);
+
+            free(dtext);
+
+            /* Champ "sh_addr" */
+
+            instr = g_raw_instruction_new_array(content, MDS_64_BITS, 1, pos, length, format->endian);
+
+            ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Section virtual addr at execution"));
+
+            /* Champ "sh_offset" */
+
+            instr = g_raw_instruction_new_array(content, MDS_64_BITS, 1, pos, length, format->endian);
+
+            ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Section file offset"));
+
+            /* Champ "sh_size" */
+
+            instr = g_raw_instruction_new_array(content, MDS_64_BITS, 1, pos, length, format->endian);
+
+            SET_IMM_DISPLAY(instr, operand, 0, IOD_DEC);
+
+            ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Section size in bytes"));
+
+        }
+
+        /* Champ "sh_link" */
+
+        instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian);
+
+        ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Link to another section"));
+
+        /* Champ "sh_info" */
+
+        instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian);
+
+        ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Additional section information"));
+
+        if (format->is_32b)
+        {
+            /* Champ "sh_addralign" */
+
+            instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian);
+
+            ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Section alignment"));
+
+            /* Champ "sh_entsize" */
+
+            instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian);
+
+            SET_IMM_DISPLAY(instr, operand, 0, IOD_DEC);
+
+            ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Entry size if section holds table"));
+
+        }
+        else
+        {
+            /* Champ "sh_addralign" */
+
+            instr = g_raw_instruction_new_array(content, MDS_64_BITS, 1, pos, length, format->endian);
+
+            ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Section alignment"));
+
+            /* Champ "sh_entsize" */
+
+            instr = g_raw_instruction_new_array(content, MDS_64_BITS, 1, pos, length, format->endian);
+
+            SET_IMM_DISPLAY(instr, operand, 0, IOD_DEC);
+
+            ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Entry size if section holds table"));
+
+        }
 
     }
 
-- 
cgit v0.11.2-87-g4458