From 90a79bf4c2c21715e5ef9d8a370928d218c08784 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Mon, 25 Aug 2014 21:03:25 +0000 Subject: Loaded lots of ELF header information as symbols. git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@393 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a --- ChangeLog | 38 ++ src/analysis/binary.h | 2 +- src/analysis/disass/fetch.c | 6 +- src/analysis/disass/output.c | 78 +++- src/arch/immediate.h | 2 +- src/arch/instruction-int.h | 2 +- src/arch/instruction.c | 26 +- src/arch/instruction.h | 2 +- src/arch/raw.c | 96 ++++- src/arch/raw.h | 6 + src/arch/vmpa.c | 2 +- src/format/elf/elf-int.c | 46 --- src/format/elf/elf_def.h | 156 +++++++- src/format/elf/symbols.c | 932 +++++++++++++++++++++++++++++++++++++++++++ src/format/format.c | 3 - src/format/symbol.c | 54 ++- src/format/symbol.h | 31 ++ 17 files changed, 1399 insertions(+), 83 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0362a19..12ac1f3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,41 @@ +14-08-25 Cyrille Bagard + + * src/analysis/binary.h: + Typo. + + * src/analysis/disass/fetch.c: + Update code. + + * src/analysis/disass/output.c: + Add comments from some kinds of loaded symbols. + + * src/arch/immediate.h: + Fix a typo bug. + + * src/arch/instruction.c: + * src/arch/instruction.h: + * src/arch/instruction-int.h: + Return a buffer line when printing one instruction. + + * src/arch/raw.c: + * src/arch/raw.h: + Show data as padding when required. + + * src/arch/vmpa.c: + Fix a typo bug. + + * src/format/elf/elf_def.h: + * src/format/elf/elf-int.c: + * src/format/elf/symbols.c: + Load lots of ELF header information as symbols. + + * src/format/format.c: + Remove debug code. + + * src/format/symbol.c: + * src/format/symbol.h: + Attach comments to symbols. + 14-08-20 Cyrille Bagard * src/glibext/gbuffersegment.c: diff --git a/src/analysis/binary.h b/src/analysis/binary.h index 2a7e7d9..17da200 100644 --- a/src/analysis/binary.h +++ b/src/analysis/binary.h @@ -116,7 +116,7 @@ void g_loaded_binary_set_storage(GLoadedBinary *, DBFeatures, DBStorage); /* Trouve une collection assurant une fonctionnalité donnée. */ -GDbCollection *g_loaded_binary_find_collection(GLoadedBinary *, DBFeatures ); +GDbCollection *g_loaded_binary_find_collection(GLoadedBinary *, DBFeatures); /* Demande l'intégration d'une modification dans une collection. */ bool g_loaded_binary_add_to_collection(GLoadedBinary *, DBFeatures, GDbItem *); diff --git a/src/analysis/disass/fetch.c b/src/analysis/disass/fetch.c index 9ef6f29..73474b3 100644 --- a/src/analysis/disass/fetch.c +++ b/src/analysis/disass/fetch.c @@ -189,8 +189,8 @@ GArchInstruction *disassemble_binary_content(const GLoadedBinary *binary, GtkExt g_object_ref(G_OBJECT(instr)); border = g_arch_instruction_get_location2(instr, &length); - length = 4; - + // Utiliser : ??? + // const vmpa2t *g_binary_symbol_get_address2(const GBinSymbol *symbol) break; @@ -218,8 +218,6 @@ GArchInstruction *disassemble_binary_content(const GLoadedBinary *binary, GtkExt advance_vmpa(last, length); - printf("length :: %d\n", length); - } /* Raccord final ? */ diff --git a/src/analysis/disass/output.c b/src/analysis/disass/output.c index 97f9989..927088f 100644 --- a/src/analysis/disass/output.c +++ b/src/analysis/disass/output.c @@ -25,6 +25,7 @@ #include "../../arch/processor.h" +#include "../../common/extstr.h" #include "../../decomp/lang/asm.h" #include "../../format/format.h" @@ -58,11 +59,42 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form vmpa_t end; /* Adresse de fin */ const GArchInstruction *iter; /* Boucle de parcours #1 */ size_t i; /* Boucle de parcours #2 */ - vmpa_t iaddr; /* Adresse d'instruction */ - vmpa_t raddr; /* Adresse de routine */ + const vmpa2t *iaddr; /* Adresse d'instruction */ + const vmpa2t *saddr; /* Adresse de symbole */ + + GBufferLine *line; + + + GBinSymbol **symbols; /* Symboles à représenter */ + size_t sym_count; /* Qté de symboles présents */ + + + size_t sym_index; /* Prochain symbole non traité */ + + + GDbComment *comment; /* Commentaire à ajouter */ + + + + const char *text; + + char *prefixed; + + output = g_asm_output_new(); + + symbols = g_binary_format_get_symbols(format, &sym_count); + + sym_index = 0; + + + //GDbCollection *g_loaded_binary_find_collection(GLoadedBinary *, DBFeatures); + + + + proc = get_arch_processor_from_format(format); msize = g_arch_processor_get_memory_size(proc); @@ -90,7 +122,47 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form } #endif - g_arch_instruction_print(iter, buffer, msize, content, ASX_INTEL); + + + + line = g_arch_instruction_print(iter, buffer, msize, content, ASX_INTEL); + + if (sym_index < sym_count) + { + iaddr = g_arch_instruction_get_location2(iter, NULL); + saddr = g_binary_symbol_get_address2(symbols[sym_index]); + + if (cmp_vmpa_by_phy(iaddr, saddr) == 0) + { + + + comment = g_binary_symbol_get_comment(symbols[sym_index]); + + if (comment != NULL) + { + + text = g_db_comment_get_text(comment); + + + prefixed = strdup("; "); + prefixed = stradd(prefixed, text); + + + + g_buffer_line_insert_text(line, BLC_COMMENTS, prefixed, strlen(prefixed), RTT_COMMENT); + + + free(prefixed); + + } + + sym_index++; + + + } + + } + //gtk_extended_status_bar_update_activity(statusbar, id, (iaddr - start) * 1.0 / (end - start)); diff --git a/src/arch/immediate.h b/src/arch/immediate.h index 71d482a..99d1b7f 100644 --- a/src/arch/immediate.h +++ b/src/arch/immediate.h @@ -70,7 +70,7 @@ GArchOperand *_g_imm_operand_new_from_data(MemoryDataSize, const bin_t *, off_t /* Crée un opérande réprésentant une valeur numérique. */ GArchOperand *_g_imm_operand_new_from_data2(MemoryDataSize, const bin_t *, vmpa2t *, off_t, bool *, SourceEndian); -#define g_imm_operand_new_from_data2(size, data, pos, len, endian) _g_imm_operand_new_from_data(size, data, pos, len, NULL, endian) +#define g_imm_operand_new_from_data2(size, data, pos, len, endian) _g_imm_operand_new_from_data2(size, data, pos, len, NULL, endian) /* Crée un opérande réprésentant une valeur numérique. */ GArchOperand *g_imm_operand_new_from_value(MemoryDataSize, ...); diff --git a/src/arch/instruction-int.h b/src/arch/instruction-int.h index 8730792..28caf78 100644 --- a/src/arch/instruction-int.h +++ b/src/arch/instruction-int.h @@ -36,7 +36,7 @@ typedef void (* get_instruction_rw_regs_fc) (const GArchInstruction *, GArchRegister ***, size_t *, GArchRegister ***, size_t *); /* Ajoute à un tampon GLib le contenu de l'instance spécifiée. */ -typedef void (* print_instruction_fc) (const GArchInstruction *, GCodeBuffer *, MemoryDataSize, const bin_t *, AsmSyntax); +typedef GBufferLine * (* print_instruction_fc) (const GArchInstruction *, GCodeBuffer *, MemoryDataSize, const bin_t *, AsmSyntax); /* Traduit une instruction en version humainement lisible. */ typedef const char * (* get_instruction_keyword_fc) (const GArchInstruction *, AsmSyntax); diff --git a/src/arch/instruction.c b/src/arch/instruction.c index e1ee023..ea713cd 100644 --- a/src/arch/instruction.c +++ b/src/arch/instruction.c @@ -51,7 +51,7 @@ static void g_arch_instruction_finalize(GArchInstruction *); /* Ajoute à un tampon GLib le contenu de l'instance spécifiée. */ -static void _g_arch_instruction_print(const GArchInstruction *, GCodeBuffer *, MemoryDataSize, const bin_t *, AsmSyntax); +static GBufferLine *_g_arch_instruction_print(const GArchInstruction *, GCodeBuffer *, MemoryDataSize, const bin_t *, AsmSyntax); @@ -692,39 +692,41 @@ const char *g_arch_instruction_get_keyword(const GArchInstruction *instr, AsmSyn * * ******************************************************************************/ -static void _g_arch_instruction_print(const GArchInstruction *instr, GCodeBuffer *buffer, MemoryDataSize msize, const bin_t *content, AsmSyntax syntax) +static GBufferLine *_g_arch_instruction_print(const GArchInstruction *instr, GCodeBuffer *buffer, MemoryDataSize msize, const bin_t *content, AsmSyntax syntax) { - GBufferLine *line; /* Ligne de destination */ + GBufferLine *result; /* Ligne de destination */ const char *key; /* Mot clef principal */ size_t klen; /* Taille de ce mot clef */ size_t i; /* Boucle de parcours */ - line = g_code_buffer_append_new_line(buffer, &instr->address2); + result = g_code_buffer_append_new_line(buffer, &instr->address2); - g_buffer_line_fill_for_instr(line, msize/* TODO ! */, msize, content, instr->length, true); + g_buffer_line_fill_for_instr(result, msize/* TODO ! */, msize, content, instr->length, true); /* Instruction proprement dite */ key = g_arch_instruction_get_keyword(instr, syntax); klen = strlen(key); - g_buffer_line_insert_text(line, BLC_ASSEMBLY_HEAD, key, klen, RTT_INSTRUCTION); + g_buffer_line_insert_text(result, BLC_ASSEMBLY_HEAD, key, klen, RTT_INSTRUCTION); if (instr->operands_count > 0) { - g_arch_operand_print(instr->operands[0], line, syntax); + g_arch_operand_print(instr->operands[0], result, syntax); for (i = 1; i < instr->operands_count; i++) { - g_buffer_line_insert_text(line, BLC_ASSEMBLY, ",", 1, RTT_PUNCT); - g_buffer_line_insert_text(line, BLC_ASSEMBLY, " ", 1, RTT_RAW); + g_buffer_line_insert_text(result, BLC_ASSEMBLY, ",", 1, RTT_PUNCT); + g_buffer_line_insert_text(result, BLC_ASSEMBLY, " ", 1, RTT_RAW); - g_arch_operand_print(instr->operands[i], line, syntax); + g_arch_operand_print(instr->operands[i], result, syntax); } } + return result; + } @@ -742,9 +744,9 @@ static void _g_arch_instruction_print(const GArchInstruction *instr, GCodeBuffer * * ******************************************************************************/ -void g_arch_instruction_print(const GArchInstruction *instr, GCodeBuffer *buffer, MemoryDataSize msize, const bin_t *content, AsmSyntax syntax) +GBufferLine *g_arch_instruction_print(const GArchInstruction *instr, GCodeBuffer *buffer, MemoryDataSize msize, const bin_t *content, AsmSyntax syntax) { - G_ARCH_INSTRUCTION_GET_CLASS(instr)->print(instr, buffer, msize, content, syntax); + return G_ARCH_INSTRUCTION_GET_CLASS(instr)->print(instr, buffer, msize, content, syntax); } diff --git a/src/arch/instruction.h b/src/arch/instruction.h index 08135a9..f04a458 100644 --- a/src/arch/instruction.h +++ b/src/arch/instruction.h @@ -152,7 +152,7 @@ size_t g_arch_instruction_compute_group_index(GArchInstruction **, GArchInstruct const char *g_arch_instruction_get_keyword(const GArchInstruction *, AsmSyntax); /* Ajoute à un tampon GLib le contenu de l'instance spécifiée. */ -void g_arch_instruction_print(const GArchInstruction *, GCodeBuffer *, MemoryDataSize, const bin_t *, AsmSyntax); +GBufferLine *g_arch_instruction_print(const GArchInstruction *, GCodeBuffer *, MemoryDataSize, const bin_t *, AsmSyntax); /* Décompile une instruction de façon générique. */ GDecInstruction *g_arch_instruction_decompile(const GArchInstruction *, GDecContext *); diff --git a/src/arch/raw.c b/src/arch/raw.c index 0d6ae4a..842c2b4 100644 --- a/src/arch/raw.c +++ b/src/arch/raw.c @@ -37,6 +37,8 @@ struct _GRawInstruction { GArchInstruction parent; /* A laisser en premier */ + bool is_padding; /* Bourrage à représenter ? */ + }; /* Définition générique d'une instruction d'architecture inconnue (classe) */ @@ -59,6 +61,9 @@ static void g_raw_instruction_dispose(GRawInstruction *); /* Procède à la libération totale de la mémoire. */ static void g_raw_instruction_finalize(GRawInstruction *); +/* Ajoute à un tampon GLib le contenu de l'instance spécifiée. */ +static GBufferLine *g_raw_instruction_print(const GRawInstruction *, GCodeBuffer *, MemoryDataSize, const bin_t *, AsmSyntax); + /* Fournit le nom humain de l'instruction manipulée. */ static const char *g_raw_instruction_get_keyword(const GRawInstruction *, AsmSyntax); @@ -97,6 +102,7 @@ static void g_raw_instruction_class_init(GRawInstructionClass *klass) instr = G_ARCH_INSTRUCTION_CLASS(klass); + instr->print = (print_instruction_fc)g_raw_instruction_print; instr->get_key = (get_instruction_keyword_fc)g_raw_instruction_get_keyword; } @@ -219,6 +225,54 @@ GArchInstruction *g_raw_instruction_new_array(const bin_t *data, MemoryDataSize /****************************************************************************** * * +* Paramètres : instr = instruction d'assemblage à représenter. * +* buffer = espace où placer ledit contenu. * +* syntax = type de représentation demandée. * +* * +* Description : Ajoute à un tampon GLib le contenu de l'instance spécifiée. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static GBufferLine *g_raw_instruction_print(const GRawInstruction *instr, GCodeBuffer *buffer, MemoryDataSize msize, const bin_t *content, AsmSyntax syntax) +{ + GBufferLine *result; /* Ligne de destination */ + GArchInstruction *base; /* Autre version de l'instance */ + const char *key; /* Mot clef principal */ + size_t klen; /* Taille de ce mot clef */ + + base = G_ARCH_INSTRUCTION(instr); + + if (!instr->is_padding) + result = G_ARCH_INSTRUCTION_CLASS(g_raw_instruction_parent_class)->print(base, buffer, msize, content, syntax); + + else + { + result = g_code_buffer_append_new_line(buffer, &base->address2); + + g_buffer_line_fill_for_instr(result, msize/* TODO ! */, msize, content, base->length, true); + + /* Instruction proprement dite */ + + key = g_arch_instruction_get_keyword(base, syntax); + klen = strlen(key); + + g_buffer_line_insert_text(result, BLC_ASSEMBLY_HEAD, key, klen, RTT_INSTRUCTION); + + g_buffer_line_insert_text(result, BLC_ASSEMBLY, "...", 3, RTT_RAW); + + } + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : instr = instruction à traiter. * * format = format du binaire manipulé. * * syntax = type de représentation demandée. * @@ -238,9 +292,49 @@ static const char *g_raw_instruction_get_keyword(const GRawInstruction *instr, A static char *defines[] = { "dn", "db", "dw", "dd", "dq" }; - operand = g_arch_instruction_get_operand(instr, 0); + operand = g_arch_instruction_get_operand(G_ARCH_INSTRUCTION(instr), 0); size = g_imm_operand_get_size(G_IMM_OPERAND(operand)); return defines[MDS_RANGE(size)]; } + + +/****************************************************************************** +* * +* Paramètres : instr = instruction à traiter. * +* is_padding = nouveau statut à associer au contenu. * +* * +* Description : Marque l'instruction comme ne contenant que du bourrage. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_raw_instruction_mark_as_padding(GRawInstruction *instr, bool is_padding) +{ + instr->is_padding = is_padding; + +} + + +/****************************************************************************** +* * +* Paramètres : instr = instruction à traiter. * +* is_padding = nouveau statut à associer au contenu. * +* * +* Description : Indique si le contenu de l'instruction est du bourrage. * +* * +* Retour : Statut du contenu de l'instruction. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_raw_instruction_is_padding(const GRawInstruction *instr) +{ + return instr->is_padding; + +} diff --git a/src/arch/raw.h b/src/arch/raw.h index 08dc620..ce324f5 100644 --- a/src/arch/raw.h +++ b/src/arch/raw.h @@ -55,6 +55,12 @@ GType g_raw_instruction_get_type(void); /* Crée une instruction de type 'db/dw/etc' étendue. */ GArchInstruction *g_raw_instruction_new_array(const bin_t *, MemoryDataSize, size_t, vmpa2t *, off_t, SourceEndian); +/* Marque l'instruction comme ne contenant que du bourrage. */ +void g_raw_instruction_mark_as_padding(GRawInstruction *, bool); + +/* Indique si le contenu de l'instruction est du bourrage. */ +bool g_raw_instruction_is_padding(const GRawInstruction *); + #endif /* _ARCH_RAW_H */ diff --git a/src/arch/vmpa.c b/src/arch/vmpa.c index 93bbfc8..edff789 100644 --- a/src/arch/vmpa.c +++ b/src/arch/vmpa.c @@ -191,7 +191,7 @@ void advance_vmpa(vmpa2t *addr, off_t qty) addr->physical += qty; if (addr->virtual != VMPA_NO_VIRTUAL) - addr->virtual =+ qty; + addr->virtual += qty; } diff --git a/src/format/elf/elf-int.c b/src/format/elf/elf-int.c index 17aeaf2..677a9ef 100644 --- a/src/format/elf/elf-int.c +++ b/src/format/elf/elf-int.c @@ -27,9 +27,6 @@ #include -#include "../../arch/raw.h" - - /****************************************************************************** * * @@ -52,18 +49,6 @@ bool read_elf_header(GElfFormat *format, elf_header *header, bool *is_32b, Sourc const bin_t *content; /* Contenu binaire à lire */ off_t length; /* Taille totale du contenu */ off_t pos; /* Position de lecture */ - GArchInstruction *instr; /* Instruction décodée */ - - - vmpa2t *pos2; - - - GBinSymbol *symbol; - - size_t i; /* Boucle de parcours */ - GArchOperand *operand; /* Opérande à venir modifier */ - - content = G_BIN_FORMAT(format)->content; length = G_BIN_FORMAT(format)->length; @@ -108,37 +93,6 @@ bool read_elf_header(GElfFormat *format, elf_header *header, bool *is_32b, Sourc break; } - - pos2 = make_vmpa(0, 0x123); - - - - instr = g_raw_instruction_new_array(content, MDS_8_BITS, 4, pos2, 4, *endian); - - - for (i = 1; i < 4; i++) - { - operand = g_arch_instruction_get_operand(instr, i); - g_imm_operand_set_display(G_IMM_OPERAND(operand), IOD_CHAR); - } - - - - - symbol = g_binary_symbol_new(STP_OBJECT, "toto", 0); - - printf("TOTO\n"); - - g_binary_symbol_attach_instruction(symbol, instr); - g_binary_format_add_symbol(format, symbol); - - - - - - - - if (*is_32b) { result &= read_u16(&header->hdr32.e_type, content, &pos, length, *endian); diff --git a/src/format/elf/elf_def.h b/src/format/elf/elf_def.h index 9d872f4..91e1c18 100644 --- a/src/format/elf/elf_def.h +++ b/src/format/elf/elf_def.h @@ -103,6 +103,8 @@ typedef union _elf_header #define EI_CLASS 4 /* Indice de classe du fichier */ #define EI_DATA 5 /* Indice de l'encodage */ +#define EI_VERSION 6 /* Version de fichier ELF */ +#define EI_OSABI 7 /* Identification de l'ABI OS */ /* ... EI_CLASS */ @@ -117,20 +119,122 @@ typedef union _elf_header #define ELFDATA2LSB 1 /* Complément à 2, petit bout. */ #define ELFDATA2MSB 2 /* Complément à 2, grand bout. */ +/* ... EI_VERSION */ + +#define EV_NONE 0 /* Version ELF invalide */ +#define EV_CURRENT 1 /* Version d'ELF courante */ + +/* ... EI_OSABI */ + +#define ELFOSABI_NONE 0 /* UNIX System V ABI */ +#define ELFOSABI_SYSV 0 /* Alias. */ +#define ELFOSABI_HPUX 1 /* HP-UX */ +#define ELFOSABI_NETBSD 2 /* NetBSD. */ +#define ELFOSABI_GNU 3 /* Object uses GNU ELF extensions. */ +#define ELFOSABI_LINUX ELFOSABI_GNU /* Compatibility alias. */ +#define ELFOSABI_SOLARIS 6 /* Sun Solaris. */ +#define ELFOSABI_AIX 7 /* IBM AIX. */ +#define ELFOSABI_IRIX 8 /* SGI Irix. */ +#define ELFOSABI_FREEBSD 9 /* FreeBSD. */ +#define ELFOSABI_TRU64 10 /* Compaq TRU64 UNIX. */ +#define ELFOSABI_MODESTO 11 /* Novell Modesto. */ +#define ELFOSABI_OPENBSD 12 /* OpenBSD. */ +#define ELFOSABI_ARM_AEABI 64 /* ARM EABI */ +#define ELFOSABI_ARM 97 /* ARM */ +#define ELFOSABI_STANDALONE 255 /* Standalone (embedded) application */ /* Valeurs possibles pour e_type */ #define ET_NONE 0 /* Aucun type défini */ +#define ET_REL 1 /* Fichier relogeable */ #define ET_EXEC 2 /* Fichier exécutable */ #define ET_DYN 3 /* Bibliothèque dynamique */ +#define ET_CORE 4 /* Fichier Core */ +#define ET_LOOS 0xfe00 /* Spécifique OS : début */ +#define ET_HIOS 0xfeff /* Spécifique OS : fin */ +#define ET_LOPROC 0xff00 /* Spécifique processeur : deb.*/ +#define ET_HIPROC 0xffff /* Spécifique processeur : fin */ /* Valeurs possibles pour e_machine */ -#define EM_NONE 0 /* Aucune machine */ -#define EM_386 3 /* Intel 80386 */ -#define EM_MIPS 8 /* MIPS R3000 big-endian */ -#define EM_MIPS_RS3_LE 10 /* MIPS R3000 little-endian */ -#define EM_ARM 40 /* ARM */ +#define EM_NONE 0 /* No machine */ +#define EM_M32 1 /* AT&T WE 32100 */ +#define EM_SPARC 2 /* SUN SPARC */ +#define EM_386 3 /* Intel 80386 */ +#define EM_68K 4 /* Motorola m68k family */ +#define EM_88K 5 /* Motorola m88k family */ +#define EM_860 7 /* Intel 80860 */ +#define EM_MIPS 8 /* MIPS R3000 big-endian */ +#define EM_S370 9 /* IBM System/370 */ +#define EM_MIPS_RS3_LE 10 /* MIPS R3000 little-endian */ +#define EM_PARISC 15 /* HPPA */ +#define EM_VPP500 17 /* Fujitsu VPP500 */ +#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */ +#define EM_960 19 /* Intel 80960 */ +#define EM_PPC 20 /* PowerPC */ +#define EM_PPC64 21 /* PowerPC 64-bit */ +#define EM_S390 22 /* IBM S390 */ +#define EM_V800 36 /* NEC V800 series */ +#define EM_FR20 37 /* Fujitsu FR20 */ +#define EM_RH32 38 /* TRW RH-32 */ +#define EM_RCE 39 /* Motorola RCE */ +#define EM_ARM 40 /* ARM */ +#define EM_FAKE_ALPHA 41 /* Digital Alpha */ +#define EM_SH 42 /* Hitachi SH */ +#define EM_SPARCV9 43 /* SPARC v9 64-bit */ +#define EM_TRICORE 44 /* Siemens Tricore */ +#define EM_ARC 45 /* Argonaut RISC Core */ +#define EM_H8_300 46 /* Hitachi H8/300 */ +#define EM_H8_300H 47 /* Hitachi H8/300H */ +#define EM_H8S 48 /* Hitachi H8S */ +#define EM_H8_500 49 /* Hitachi H8/500 */ +#define EM_IA_64 50 /* Intel Merced */ +#define EM_MIPS_X 51 /* Stanford MIPS-X */ +#define EM_COLDFIRE 52 /* Motorola Coldfire */ +#define EM_68HC12 53 /* Motorola M68HC12 */ +#define EM_MMA 54 /* Fujitsu MMA Multimedia Accelerator*/ +#define EM_PCP 55 /* Siemens PCP */ +#define EM_NCPU 56 /* Sony nCPU embeeded RISC */ +#define EM_NDR1 57 /* Denso NDR1 microprocessor */ +#define EM_STARCORE 58 /* Motorola Start*Core processor */ +#define EM_ME16 59 /* Toyota ME16 processor */ +#define EM_ST100 60 /* STMicroelectronic ST100 processor */ +#define EM_TINYJ 61 /* Advanced Logic Corp. Tinyj emb.fam*/ +#define EM_X86_64 62 /* AMD x86-64 architecture */ +#define EM_PDSP 63 /* Sony DSP Processor */ +#define EM_FX66 66 /* Siemens FX66 microcontroller */ +#define EM_ST9PLUS 67 /* STMicroelectronics ST9+ 8/16 mc */ +#define EM_ST7 68 /* STmicroelectronics ST7 8 bit mc */ +#define EM_68HC16 69 /* Motorola MC68HC16 microcontroller */ +#define EM_68HC11 70 /* Motorola MC68HC11 microcontroller */ +#define EM_68HC08 71 /* Motorola MC68HC08 microcontroller */ +#define EM_68HC05 72 /* Motorola MC68HC05 microcontroller */ +#define EM_SVX 73 /* Silicon Graphics SVx */ +#define EM_ST19 74 /* STMicroelectronics ST19 8 bit mc */ +#define EM_VAX 75 /* Digital VAX */ +#define EM_CRIS 76 /* Axis Communications 32-bit embedded processor */ +#define EM_JAVELIN 77 /* Infineon Technologies 32-bit embedded processor */ +#define EM_FIREPATH 78 /* Element 14 64-bit DSP Processor */ +#define EM_ZSP 79 /* LSI Logic 16-bit DSP Processor */ +#define EM_MMIX 80 /* Donald Knuth's educational 64-bit processor */ +#define EM_HUANY 81 /* Harvard University machine-independent object files */ +#define EM_PRISM 82 /* SiTera Prism */ +#define EM_AVR 83 /* Atmel AVR 8-bit microcontroller */ +#define EM_FR30 84 /* Fujitsu FR30 */ +#define EM_D10V 85 /* Mitsubishi D10V */ +#define EM_D30V 86 /* Mitsubishi D30V */ +#define EM_V850 87 /* NEC v850 */ +#define EM_M32R 88 /* Mitsubishi M32R */ +#define EM_MN10300 89 /* Matsushita MN10300 */ +#define EM_MN10200 90 /* Matsushita MN10200 */ +#define EM_PJ 91 /* picoJava */ +#define EM_OPENRISC 92 /* OpenRISC 32-bit embedded processor */ +#define EM_ARC_A5 93 /* ARC Cores Tangent-A5 */ +#define EM_XTENSA 94 /* Tensilica Xtensa Architecture */ +#define EM_AARCH64 183 /* ARM AARCH64 */ +#define EM_TILEPRO 188 /* Tilera TILEPro */ +#define EM_MICROBLAZE 189 /* Xilinx MicroBlaze */ +#define EM_TILEGX 191 /* Tilera TILE-Gx */ @@ -203,9 +307,11 @@ typedef union _elf_phdr /* Valeurs possibles pour p_flags */ -#define PF_X (1 << 0) /* Le segment est exécutable */ -#define PF_W (1 << 1) /* Le segment est écrasable */ -#define PF_R (1 << 2) /* Le segment est lisible */ +#define PF_X (1 << 0) /* Le segment est exécutable */ +#define PF_W (1 << 1) /* Le segment est écrasable */ +#define PF_R (1 << 2) /* Le segment est lisible */ +#define PF_MASKOS 0x0ff00000 /* Spécifique à l'OS */ +#define PF_MASKPROC 0xf0000000 /* Spécifique au processeur */ @@ -263,8 +369,42 @@ typedef union _elf_shdr #define SHT_PROGBITS 1 /* Données de programme */ #define SHT_SYMTAB 2 /* Table des symboles */ #define SHT_STRTAB 3 /* Table de chaînes de carac. */ + +#define SHT_RELA 4 /* Relocation entries with addends */ +#define SHT_HASH 5 /* Symbol hash table */ + #define SHT_DYNAMIC 6 /* Info. de liaison dynamique */ +#define SHT_NOTE 7 /* Notes */ +#define SHT_NOBITS 8 /* Program space with no data (bss) */ +#define SHT_REL 9 /* Relocation entries, no addends */ +#define SHT_SHLIB 10 /* Reserved */ +#define SHT_DYNSYM 11 /* Dynamic linker symbol table */ +#define SHT_INIT_ARRAY 14 /* Array of constructors */ +#define SHT_FINI_ARRAY 15 /* Array of destructors */ +#define SHT_PREINIT_ARRAY 16 /* Array of pre-constructors */ +#define SHT_GROUP 17 /* Section group */ +#define SHT_SYMTAB_SHNDX 18 /* Extended section indeces */ +#define SHT_NUM 19 /* Number of defined types. */ +#define SHT_LOOS 0x60000000 /* Start OS-specific. */ +#define SHT_GNU_ATTRIBUTES 0x6ffffff5 /* Object attributes. */ +#define SHT_GNU_HASH 0x6ffffff6 /* GNU-style hash table. */ +#define SHT_GNU_LIBLIST 0x6ffffff7 /* Prelink library list */ +#define SHT_CHECKSUM 0x6ffffff8 /* Checksum for DSO content. */ +#define SHT_LOSUNW 0x6ffffffa /* Sun-specific low bound. */ +#define SHT_SUNW_move 0x6ffffffa +#define SHT_SUNW_COMDAT 0x6ffffffb +#define SHT_SUNW_syminfo 0x6ffffffc +#define SHT_GNU_verdef 0x6ffffffd /* Version definition section. */ +#define SHT_GNU_verneed 0x6ffffffe /* Version needs section. */ +#define SHT_GNU_versym 0x6fffffff /* Version symbol table. */ +#define SHT_HISUNW 0x6fffffff /* Sun-specific high bound. */ +#define SHT_HIOS 0x6fffffff /* End OS-specific type */ +#define SHT_LOPROC 0x70000000 /* Start of processor-specific */ +#define SHT_HIPROC 0x7fffffff /* End of processor-specific */ +#define SHT_LOUSER 0x80000000 /* Start of application-specific */ +#define SHT_HIUSER 0x8fffffff /* End of application-specific */ + /* Valeurs possibles pour sh_flags */ diff --git a/src/format/elf/symbols.c b/src/format/elf/symbols.c index c480c51..33a8c3f 100644 --- a/src/format/elf/symbols.c +++ b/src/format/elf/symbols.c @@ -35,6 +35,8 @@ #include "helper_x86.h" #include "section.h" #include "../mangling/demangler.h" +#include "../../arch/raw.h" +#include "../../common/extstr.h" #include "../../gui/panels/log.h" @@ -48,6 +50,23 @@ const char *get_elf_symbol_name(GElfFormat *, const elf_shdr *, const elf_shdr * + + + +/* ------------------------ CHARGEMENT DE SYMBOLES DU FORMAT ------------------------ */ + + +/* Charge tous les symboles de l'en-tête ELF. */ +static bool annotate_elf_header(GElfFormat *); + +/* Charge tous les symboles liés aux en-têtes de programme ELF. */ +static bool annotate_elf_program_header_table(GElfFormat *); + +/* Charge tous les symboles liés aux en-têtes de section ELF. */ +static bool annotate_elf_section_header_table(GElfFormat *); + + + /* -------------------------- DETAIL DES SYMBOLES INTERNES -------------------------- */ @@ -72,6 +91,8 @@ static bool load_elf_external_symbols(GElfFormat *, const elf_shdr *); + + /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * @@ -92,6 +113,16 @@ bool load_elf_symbols(GElfFormat *format) result = true; + + + annotate_elf_header(format); + + annotate_elf_program_header_table(format); + + annotate_elf_section_header_table(format); + + + /* Symboles externes */ if (find_elf_sections_by_type(format, SHT_DYNAMIC, §ions, &count)) @@ -155,6 +186,907 @@ const char *get_elf_symbol_name(GElfFormat *format, const elf_shdr *sym, const e + +/* ---------------------------------------------------------------------------------- */ +/* CHARGEMENT DE SYMBOLES DU FORMAT */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : format = description de l'exécutable à compléter. * +* * +* Description : Charge tous les symboles de l'en-tête ELF. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool annotate_elf_header(GElfFormat *format) +{ + const bin_t *content; /* Contenu binaire à lire */ + off_t length; /* Taille totale du contenu */ + vmpa2t *pos; /* Localisation des symboles */ + const char *text; /* Texte constant à insérer */ + GArchInstruction *instr; /* Instruction décodée */ + GArchOperand *operand; /* Opérande à venir modifier */ + GDbComment *comment; /* Définition de commentaire */ + GBinSymbol *symbol; /* Symbole à intégrer */ + + content = G_BIN_FORMAT(format)->content; + length = G_BIN_FORMAT(format)->length; + + pos = make_vmpa(0, 0x123); + + /* ELFMAG (0) */ + + instr = g_raw_instruction_new_array(content, MDS_8_BITS, 4, pos, length, format->endian); + + SET_IMM_DISPLAY(instr, operand, 1, IOD_CHAR); + SET_IMM_DISPLAY(instr, operand, 2, IOD_CHAR); + SET_IMM_DISPLAY(instr, operand, 3, IOD_CHAR); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("ELF magic number")); + + /* EI_CLASS (4) */ + + switch (format->header.hdr32.e_ident[EI_CLASS]) + { + case EV_NONE: + text = _("File class: invalid"); + break; + case ELFCLASS32: + text = _("File class: 32-bit objects"); + break; + case ELFCLASS64: + text = _("File class: 64-bit objects"); + break; + default: + text = _("File class: unknown"); + break; + } + + instr = g_raw_instruction_new_array(content, MDS_8_BITS, 1, pos, length, format->endian); + + SET_IMM_DISPLAY(instr, operand, 0, IOD_DEC); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, text); + + /* EI_DATA (5) */ + + switch (format->header.hdr32.e_ident[EI_DATA]) + { + case ELFDATANONE: + text = _("Data encoding: invalid"); + break; + case ELFDATA2LSB: + text = _("Data encoding: 2's complement, little endian"); + break; + case ELFDATA2MSB: + text = _("Data encoding: 2's complement, big endian"); + break; + default: + text = _("Data encoding: unknown"); + break; + } + + instr = g_raw_instruction_new_array(content, MDS_8_BITS, 1, pos, length, format->endian); + + SET_IMM_DISPLAY(instr, operand, 0, IOD_DEC); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, text); + + /* EI_VERSION (6) */ + + switch (format->header.hdr32.e_ident[EI_VERSION]) + { + case EV_NONE: + text = _("File version: invalid"); + break; + case EV_CURRENT: + text = _("File version: current"); + break; + default: + text = _("File version: unknown"); + break; + } + + instr = g_raw_instruction_new_array(content, MDS_8_BITS, 1, pos, length, format->endian); + + SET_IMM_DISPLAY(instr, operand, 0, IOD_DEC); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, text); + + /* EI_OSABI (7) */ + + switch (format->header.hdr32.e_ident[EI_OSABI]) + { + case ELFOSABI_SYSV: + text = _("OS ABI: UNIX System V"); + break; + case ELFOSABI_HPUX: + text = _("OS ABI: HP-UX"); + break; + case ELFOSABI_NETBSD: + text = _("OS ABI: NetBSD"); + break; + case ELFOSABI_GNU: + text = _("OS ABI: object uses GNU ELF extensions"); + break; + case ELFOSABI_SOLARIS: + text = _("OS ABI: Sun Solaris"); + break; + case ELFOSABI_AIX: + text = _("OS ABI: IBM AIX"); + break; + case ELFOSABI_IRIX: + text = _("OS ABI: SGI Irix"); + break; + case ELFOSABI_FREEBSD: + text = _("OS ABI: FreeBSD"); + break; + case ELFOSABI_TRU64: + text = _("OS ABI: Compaq TRU64 UNIX"); + break; + case ELFOSABI_MODESTO: + text = _("OS ABI: Novell Modesto"); + break; + case ELFOSABI_OPENBSD: + text = _("OS ABI: OpenBSD"); + break; + case ELFOSABI_ARM_AEABI: + text = _("OS ABI: ARM EABI"); + break; + case ELFOSABI_ARM: + text = _("OS ABI: ARM"); + break; + case ELFOSABI_STANDALONE: + text = _("OS ABI: standalone (embedded) application"); + break; + default: + text = _("OS ABI: unknown"); + break; + } + + instr = g_raw_instruction_new_array(content, MDS_8_BITS, 1, pos, length, format->endian); + + SET_IMM_DISPLAY(instr, operand, 0, IOD_DEC); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, text); + + /* EI_ABIVERSION (8) */ + + instr = g_raw_instruction_new_array(content, MDS_8_BITS, 1, pos, length, format->endian); + + SET_IMM_DISPLAY(instr, operand, 0, IOD_DEC); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("ABI version")); + + /* Padding */ + + instr = g_raw_instruction_new_array(content, MDS_8_BITS, 7, pos, length, format->endian); + + g_raw_instruction_mark_as_padding(G_RAW_INSTRUCTION(instr), true); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Padding")); + + /* Champ "e_type" */ + + switch (format->header.hdr32.e_ident[EI_DATA]) + { + case ET_NONE: + text = _("Object file type: no file type"); + break; + case ET_REL: + text = _("Object file type: relocatable file"); + break; + case ET_EXEC: + text = _("Object file type: executable file"); + break; + case ET_DYN: + text = _("Object file type: shared object file"); + break; + case ET_CORE: + text = _("Object file type: core file"); + break; + case ET_LOOS ... ET_HIOS: + text = _("Object file type: OS-specific"); + break; + case ET_LOPROC ... ET_HIPROC: + text = _("Object file type: processor-specific"); + break; + default: + text = _("Object file type: unkown"); + break; + } + + instr = g_raw_instruction_new_array(content, MDS_16_BITS, 1, pos, length, format->endian); + + SET_IMM_DISPLAY(instr, operand, 0, IOD_DEC); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, text); + + /* Champ "e_machine" */ + + switch (format->header.hdr32.e_machine) + { + case EM_NONE: text = _("Architecture: No machine"); break; + case EM_M32: text = _("Architecture: AT&T WE 32100"); break; + case EM_SPARC: text = _("Architecture: SUN SPARC"); break; + case EM_386: text = _("Architecture: Intel 80386"); break; + case EM_68K: text = _("Architecture: Motorola m68k family"); break; + case EM_88K: text = _("Architecture: Motorola m88k family"); break; + case EM_860: text = _("Architecture: Intel 80860"); break; + case EM_MIPS: text = _("Architecture: MIPS R3000 big-endian"); break; + case EM_S370: text = _("Architecture: IBM System/370"); break; + case EM_MIPS_RS3_LE:text = _("Architecture: MIPS R3000 little-endian"); break; + case EM_PARISC: text = _("Architecture: HPPA"); break; + case EM_VPP500: text = _("Architecture: Fujitsu VPP500"); break; + case EM_SPARC32PLUS:text = _("Architecture: Sun's \"v8plus\""); break; + case EM_960: text = _("Architecture: Intel 80960"); break; + case EM_PPC: text = _("Architecture: PowerPC"); break; + case EM_PPC64: text = _("Architecture: PowerPC 64-bit"); break; + case EM_S390: text = _("Architecture: IBM S390"); break; + case EM_V800: text = _("Architecture: NEC V800 series"); break; + case EM_FR20: text = _("Architecture: Fujitsu FR20"); break; + case EM_RH32: text = _("Architecture: TRW RH-32"); break; + case EM_RCE: text = _("Architecture: Motorola RCE"); break; + case EM_ARM: text = _("Architecture: ARM"); break; + case EM_FAKE_ALPHA: text = _("Architecture: Digital Alpha"); break; + case EM_SH: text = _("Architecture: Hitachi SH"); break; + case EM_SPARCV9: text = _("Architecture: SPARC v9 64-bit"); break; + case EM_TRICORE: text = _("Architecture: Siemens Tricore"); break; + case EM_ARC: text = _("Architecture: Argonaut RISC Core"); break; + case EM_H8_300: text = _("Architecture: Hitachi H8/300"); break; + case EM_H8_300H: text = _("Architecture: Hitachi H8/300H"); break; + case EM_H8S: text = _("Architecture: Hitachi H8S"); break; + case EM_H8_500: text = _("Architecture: Hitachi H8/500"); break; + case EM_IA_64: text = _("Architecture: Intel Merced"); break; + case EM_MIPS_X: text = _("Architecture: Stanford MIPS-X"); break; + case EM_COLDFIRE: text = _("Architecture: Motorola Coldfire"); break; + case EM_68HC12: text = _("Architecture: Motorola M68HC12"); break; + case EM_MMA: text = _("Architecture: Fujitsu MMA Multimedia Accelerator"); break; + case EM_PCP: text = _("Architecture: Siemens PCP"); break; + case EM_NCPU: text = _("Architecture: Sony nCPU embeeded RISC"); break; + case EM_NDR1: text = _("Architecture: Denso NDR1 microprocessor"); break; + case EM_STARCORE: text = _("Architecture: Motorola Start*Core processor"); break; + case EM_ME16: text = _("Architecture: Toyota ME16 processor"); break; + case EM_ST100: text = _("Architecture: STMicroelectronic ST100 processor"); break; + case EM_TINYJ: text = _("Architecture: Advanced Logic Corp. Tinyj emb.fam"); break; + case EM_X86_64: text = _("Architecture: AMD x86-64 architecture"); break; + case EM_PDSP: text = _("Architecture: Sony DSP Processor"); break; + case EM_FX66: text = _("Architecture: Siemens FX66 microcontroller"); break; + case EM_ST9PLUS: text = _("Architecture: STMicroelectronics ST9+ 8/16 mc"); break; + case EM_ST7: text = _("Architecture: STmicroelectronics ST7 8 bit mc"); break; + case EM_68HC16: text = _("Architecture: Motorola MC68HC16 microcontroller"); break; + case EM_68HC11: text = _("Architecture: Motorola MC68HC11 microcontroller"); break; + case EM_68HC08: text = _("Architecture: Motorola MC68HC08 microcontroller"); break; + case EM_68HC05: text = _("Architecture: Motorola MC68HC05 microcontroller"); break; + case EM_SVX: text = _("Architecture: Silicon Graphics SVx"); break; + case EM_ST19: text = _("Architecture: STMicroelectronics ST19 8 bit mc"); break; + case EM_VAX: text = _("Architecture: Digital VAX"); break; + case EM_CRIS: text = _("Architecture: Axis Communications 32-bit embedded processor"); break; + case EM_JAVELIN: text = _("Architecture: Infineon Technologies 32-bit embedded processor"); break; + case EM_FIREPATH: text = _("Architecture: Element 14 64-bit DSP Processor"); break; + case EM_ZSP: text = _("Architecture: LSI Logic 16-bit DSP Processor"); break; + case EM_MMIX: text = _("Architecture: Donald Knuth's educational 64-bit processor"); break; + case EM_HUANY: text = _("Architecture: Harvard University machine-independent object files"); break; + case EM_PRISM: text = _("Architecture: SiTera Prism"); break; + case EM_AVR: text = _("Architecture: Atmel AVR 8-bit microcontroller"); break; + case EM_FR30: text = _("Architecture: Fujitsu FR30"); break; + case EM_D10V: text = _("Architecture: Mitsubishi D10V"); break; + case EM_D30V: text = _("Architecture: Mitsubishi D30V"); break; + case EM_V850: text = _("Architecture: NEC v850"); break; + case EM_M32R: text = _("Architecture: Mitsubishi M32R"); break; + case EM_MN10300: text = _("Architecture: Matsushita MN10300"); break; + case EM_MN10200: text = _("Architecture: Matsushita MN10200"); break; + case EM_PJ: text = _("Architecture: picoJava"); break; + case EM_OPENRISC: text = _("Architecture: OpenRISC 32-bit embedded processor"); break; + case EM_ARC_A5: text = _("Architecture: ARC Cores Tangent-A5"); break; + case EM_XTENSA: text = _("Architecture: Tensilica Xtensa Architecture"); break; + case EM_AARCH64: text = _("Architecture: ARM AARCH64"); break; + case EM_TILEPRO: text = _("Architecture: Tilera TILEPro"); break; + case EM_MICROBLAZE: text = _("Architecture: Xilinx MicroBlaze"); break; + case EM_TILEGX: text = _("Architecture: Tilera TILE-Gx"); break; + default: text = _("Architecture: unknown"); break; + } + + instr = g_raw_instruction_new_array(content, MDS_16_BITS, 1, pos, length, format->endian); + + SET_IMM_DISPLAY(instr, operand, 0, IOD_DEC); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, text); + + /* Champ "e_version" */ + + 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, _("Object file version")); + + if (format->header.hdr32.e_ident[EI_CLASS] == ELFCLASS32) + { + /* Champ "e_entry" */ + + instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Entry point virtual address")); + + /* Champ "e_phoff" */ + + instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Program header table file offset")); + + /* Champ "e_shoff" */ + + 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 header table file offset")); + + } + + else if (format->header.hdr32.e_ident[EI_CLASS] == ELFCLASS64) + { + /* Champ "e_entry" */ + + instr = g_raw_instruction_new_array(content, MDS_64_BITS, 1, pos, length, format->endian); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Entry point virtual address")); + + /* Champ "e_phoff" */ + + instr = g_raw_instruction_new_array(content, MDS_64_BITS, 1, pos, length, format->endian); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Program header table file offset")); + + /* Champ "e_shoff" */ + + 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 header table file offset")); + + } + + else return false; + + /* Champ "e_flags" */ + + 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, _("Processor-specific flags")); + + /* Champ "e_ehsize" */ + + instr = g_raw_instruction_new_array(content, MDS_16_BITS, 1, pos, length, format->endian); + + SET_IMM_DISPLAY(instr, operand, 0, IOD_DEC); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("ELF header size in bytes")); + + /* Champ "e_phentsize" */ + + instr = g_raw_instruction_new_array(content, MDS_16_BITS, 1, pos, length, format->endian); + + SET_IMM_DISPLAY(instr, operand, 0, IOD_DEC); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Program header table entry size")); + + /* Champ "e_phnum" */ + + instr = g_raw_instruction_new_array(content, MDS_16_BITS, 1, pos, length, format->endian); + + SET_IMM_DISPLAY(instr, operand, 0, IOD_DEC); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Program header table entry count")); + + /* Champ "e_shentsize" */ + + instr = g_raw_instruction_new_array(content, MDS_16_BITS, 1, pos, length, format->endian); + + SET_IMM_DISPLAY(instr, operand, 0, IOD_DEC); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Section header table entry size")); + + /* Champ "e_shnum" */ + + instr = g_raw_instruction_new_array(content, MDS_16_BITS, 1, pos, length, format->endian); + + SET_IMM_DISPLAY(instr, operand, 0, IOD_DEC); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Section header table entry count")); + + /* Champ "e_shstrndx" */ + + instr = g_raw_instruction_new_array(content, MDS_16_BITS, 1, pos, length, format->endian); + + SET_IMM_DISPLAY(instr, operand, 0, IOD_DEC); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Section header string table index")); + + return true; + +} + + +/****************************************************************************** +* * +* Paramètres : format = description de l'exécutable à compléter. * +* * +* Description : Charge tous les symboles liés aux en-têtes de programme ELF. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool annotate_elf_program_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 */ + vmpa2t *pos; /* Localisation des symboles */ + uint16_t e_phnum; /* Nombre d'éléments 'Program' */ + uint16_t i; /* Boucle de parcours */ + elf_phdr phdr; /* En-tête de programme ELF */ + ImmOperandDisplay disp; /* Afficahge de valeur */ + const char *text; /* Texte constant à insérer */ + GArchInstruction *instr; /* Instruction décodée */ + GArchOperand *operand; /* Opérande à venir modifier */ + GDbComment *comment; /* Définition de commentaire */ + GBinSymbol *symbol; /* Symbole à intégrer */ + char *dtext; /* Texte dynamique à créer */ + bool filled; /* Suivi de mise en place */ + + content = G_BIN_FORMAT(format)->content; + length = G_BIN_FORMAT(format)->length; + + offset = ELF_HDR(format, format->header, e_phoff); + + pos = make_vmpa(offset, 0x5500); + + e_phnum = ELF_HDR(format, format->header, e_phnum); + + for (i = 0; i < e_phnum; i++) + { + if (!read_elf_program_header(format, &offset, &phdr)) + break; + + /* Champ "p_type" */ + + disp = IOD_DEC; + + switch (ELF_PHDR(format, phdr, p_type)) + { + case PT_NULL: + text = _("Segment type: unused"); + break; + case PT_LOAD: + text = _("Segment type: loadable program segment"); + break; + case PT_DYNAMIC: + text = _("Segment type: dynamic linking information"); + break; + case PT_INTERP: + text = _("Segment type: program interpreter"); + break; + case PT_NOTE: + text = _("Segment type: auxiliary information"); + break; + case PT_SHLIB: + text = _("Segment type: reserved"); + break; + case PT_PHDR: + text = _("Segment type: entry for header table itself"); + break; + case PT_TLS: + text = _("Segment type: thread-local storage segment"); + break; + case PT_LOOS ... PT_HIOS: + disp = IOD_HEX; + switch (ELF_PHDR(format, phdr, p_type)) + { + case PT_GNU_EH_FRAME: + text = _("Segment type: GCC .eh_frame_hdr segment"); + break; + case PT_GNU_STACK: + text = _("Segment type: indicates stack executability"); + break; + case PT_GNU_RELRO: + text = _("Segment type: read-only after relocation"); + break; + case PT_LOSUNW ... PT_HISUNW: + switch (ELF_PHDR(format, phdr, p_type)) + { + case PT_SUNWSTACK: + text = _("Segment type: Sun Stack segment"); + break; + default: + text = _("Segment type: Sun specific segment"); + break; + } + break; + default: + text = _("Segment type: OS-specific"); + break; + } + break; + case PT_LOPROC ... PT_HIPROC: + disp = IOD_HEX; + text = _("Segment type: processor-specific"); + break; + default: + disp = IOD_HEX; + text = _("Segment type: unknown"); + break; + } + + instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian); + + SET_IMM_DISPLAY(instr, operand, 0, disp); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, text); + + if (format->is_32b) + { + /* Champ "p_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, _("Segment file offset")); + + /* Champ "p_vaddr" */ + + instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Segment virtual address")); + + /* Champ "p_paddr" */ + + instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Segment physical address")); + + /* Champ "p_filesz" */ + + instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Segment size in file")); + + /* Champ "p_memsz" */ + + instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Segment size in memory")); + + /* Champ "p_flags" */ + + dtext = strdup(_("Segment flags: ")); + filled = false; + + if (ELF_PHDR(format, phdr, p_flags) & PF_R) + { + dtext = stradd(dtext, "R"); + filled = true; + } + + if (ELF_PHDR(format, phdr, p_flags) & PF_W) + { + dtext = stradd(dtext, "W"); + filled = true; + } + + if (ELF_PHDR(format, phdr, p_flags) & PF_X) + { + dtext = stradd(dtext, "X"); + filled = true; + } + + if (ELF_PHDR(format, phdr, p_flags) & PF_MASKOS) + /* TODO */; + + if (ELF_PHDR(format, phdr, p_flags) & PF_MASKPROC) + /* TODO */; + + if (!filled) + dtext = stradd(dtext, _("none")); + + 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 "p_align" */ + + instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Segment alignment")); + + } + else + { + /* Champ "p_flags" */ + + dtext = strdup(_("Segment flags: ")); + filled = false; + + if (ELF_PHDR(format, phdr, p_flags) & PF_R) + { + dtext = stradd(dtext, "R"); + filled = true; + } + + if (ELF_PHDR(format, phdr, p_flags) & PF_W) + { + dtext = stradd(dtext, "W"); + filled = true; + } + + if (ELF_PHDR(format, phdr, p_flags) & PF_X) + { + dtext = stradd(dtext, "X"); + filled = true; + } + + if (ELF_PHDR(format, phdr, p_flags) & PF_MASKOS) + /* TODO */; + + if (ELF_PHDR(format, phdr, p_flags) & PF_MASKPROC) + /* TODO */; + + if (!filled) + dtext = stradd(dtext, _("none")); + + 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 "p_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, _("Segment file offset")); + + /* Champ "p_vaddr" */ + + instr = g_raw_instruction_new_array(content, MDS_64_BITS, 1, pos, length, format->endian); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Segment virtual address")); + + /* Champ "p_paddr" */ + + instr = g_raw_instruction_new_array(content, MDS_64_BITS, 1, pos, length, format->endian); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Segment physical address")); + + /* Champ "p_filesz" */ + + instr = g_raw_instruction_new_array(content, MDS_64_BITS, 1, pos, length, format->endian); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Segment size in file")); + + /* Champ "p_memsz" */ + + instr = g_raw_instruction_new_array(content, MDS_64_BITS, 1, pos, length, format->endian); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Segment size in memory")); + + /* Champ "p_align" */ + + instr = g_raw_instruction_new_array(content, MDS_64_BITS, 1, pos, length, format->endian); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Segment alignment")); + + } + + } + + return true; + +} + + +/****************************************************************************** +* * +* Paramètres : format = description de l'exécutable à compléter. * +* * +* Description : Charge tous les symboles liés aux en-têtes de section ELF. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +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 */ + 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 */ + ImmOperandDisplay disp; /* Afficahge de valeur */ + const char *text; /* Texte constant à insérer */ + GArchInstruction *instr; /* Instruction décodée */ + GArchOperand *operand; /* Opérande à venir modifier */ + GDbComment *comment; /* Définition de commentaire */ + GBinSymbol *symbol; /* Symbole à intégrer */ + char *dtext; /* Texte dynamique à créer */ + bool filled; /* Suivi de mise en place */ + + content = G_BIN_FORMAT(format)->content; + length = G_BIN_FORMAT(format)->length; + + offset = ELF_HDR(format, format->header, e_shoff); + + pos = make_vmpa(offset, 0x9900); + + e_shnum = ELF_HDR(format, format->header, e_shnum); + + for (i = 0; i < e_shnum; i++) + { + if (!read_elf_section_header(format, offset, &shdr)) + break; + + /* Champ "sh_name" */ + + text = _("Section name"); + + 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); + + /* Champ "sh_type" */ + + disp = IOD_DEC; + + switch (ELF_SHDR(format, shdr, sh_type)) + { + case SHT_NULL: + text = _("Section type: unused"); + break; + case SHT_PROGBITS: + text = _("Section type: program data"); + break; + case SHT_SYMTAB: + text = _("Section type: symbol table"); + break; + case SHT_STRTAB: + text = _("Section type: string table"); + break; + case SHT_RELA: + text = _("Section type: relocation entries with addends"); + break; + case SHT_HASH: + text = _("Section type: symbol hash table"); + break; + case SHT_DYNAMIC: + text = _("Section type: dynamic linking information"); + break; + case SHT_NOTE: + text = _("Section type: notes"); + break; + case SHT_NOBITS: + text = _("Section type: program space with no data (bss)"); + break; + case SHT_REL: + text = _("Section type: relocation entries, no addends"); + break; + case SHT_SHLIB: + text = _("Section type: reserved"); + break; + case SHT_DYNSYM: + text = _("Section type: dynamic linker symbol table"); + break; + case SHT_INIT_ARRAY: + text = _("Section type: array of constructors"); + break; + case SHT_FINI_ARRAY: + text = _("Section type: array of destructors"); + break; + case SHT_PREINIT_ARRAY: + text = _("Section type: array of pre-constructors"); + break; + case SHT_GROUP: + text = _("Section type: section group"); + break; + case SHT_SYMTAB_SHNDX: + text = _("Section type: extended section indeces"); + break; + case SHT_LOOS ... SHT_HIOS: + disp = IOD_HEX; + switch (ELF_SHDR(format, shdr, sh_type)) + { + case SHT_GNU_ATTRIBUTES: + text = _("Section type: object attributes"); + break; + case SHT_GNU_HASH: + text = _("Section type: GNU-style hash table"); + break; + case SHT_GNU_LIBLIST: + text = _("Section type: prelink library list"); + break; + case SHT_CHECKSUM: + text = _("Section type: checksum for DSO content"); + break; + case SHT_LOSUNW ... SHT_HISUNW: + switch (ELF_SHDR(format, shdr, sh_type)) + { + case SHT_SUNW_move: + text = _("Section type: SHT_SUNW_move"); + break; + case SHT_SUNW_COMDAT: + text = _("Section type: SHT_SUNW_COMDAT"); + break; + case SHT_SUNW_syminfo: + text = _("Section type: SHT_SUNW_syminfo"); + break; + case SHT_GNU_verdef: + text = _("Section type: version definition section"); + break; + case SHT_GNU_verneed: + text = _("Section type: version needs section"); + break; + case SHT_GNU_versym: + text = _("Section type: version symbol table"); + break; + default: + text = _("Section type: Sun-specific"); + break; + } + break; + default: + text = _("Section type: OS-specific"); + break; + } + break; + case SHT_LOPROC ... SHT_HIPROC: + disp = IOD_HEX; + text = _("Section type: processor-specific"); + break; + case SHT_LOUSER ... SHT_HIUSER: + disp = IOD_HEX; + text = _("Section type: application-specific"); + break; + } + + instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian); + + SET_IMM_DISPLAY(instr, operand, 0, disp); + + ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, text); + + + + + + + + + + + + } + + return true; + +} + + + /* ---------------------------------------------------------------------------------- */ /* DETAIL DES SYMBOLES INTERNES */ /* ---------------------------------------------------------------------------------- */ diff --git a/src/format/format.c b/src/format/format.c index 8771c46..4b5dfb5 100644 --- a/src/format/format.c +++ b/src/format/format.c @@ -193,9 +193,6 @@ const bin_t *g_binary_format_get_content(const GBinFormat *format, off_t *length void g_binary_format_add_symbol(GBinFormat *format, GBinSymbol *symbol) { - - printf("current :: %d (%p)\n", (int)format->symbols_count, format->symbols); - format->symbols = (GBinSymbol **)realloc(format->symbols, ++format->symbols_count * sizeof(GBinSymbol *)); diff --git a/src/format/symbol.c b/src/format/symbol.c index b478dc7..f1183cb 100644 --- a/src/format/symbol.c +++ b/src/format/symbol.c @@ -47,6 +47,8 @@ struct _GBinSymbol } extra; + GDbComment *comment; /* Eventuel commentaire lié */ + }; /* Symbole d'exécutable (classe) */ @@ -203,14 +205,25 @@ const vmpa2t *g_binary_symbol_get_address2(const GBinSymbol *symbol) { const vmpa2t *result; /* Localisation à retourner */ + result = NULL; + switch (symbol->type) { case STP_DATA: result = g_arch_instruction_get_location2(symbol->extra.instr, NULL); break; + default: + result = NULL; + break; + } + + if (result == NULL) + printf("got addr=%p for symbol=%p (data=%d)\n", result, symbol, symbol->type == STP_DATA); + + return result; } @@ -293,7 +306,7 @@ void g_binary_symbol_attach_routine(GBinSymbol *symbol, GBinRoutine *routine) /****************************************************************************** * * -* Paramètres : symbol = symbole à venir consulter. * +* Paramètres : symbol = symbole à venir manipuler. * * instr = représentation du symbole associé. * * * * Description : Attache l'instruction associée au symbole. * @@ -330,3 +343,42 @@ GArchInstruction *g_binary_symbol_get_instruction(const GBinSymbol *symbol) return symbol->extra.instr; } + + +/****************************************************************************** +* * +* Paramètres : symbol = symbole à venir manipuler. * +* comment = commentaire construit à propos du symbole. * +* * +* Description : Ajoute un commentaire facultatif au symbole. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_binary_symbol_set_comment(GBinSymbol *symbol, GDbComment *comment) +{ + symbol->comment = comment; + +} + + +/****************************************************************************** +* * +* Paramètres : symbol = symbole à venir consulter. * +* * +* Description : Fournit l'éventuel commentaire associé au symbole. * +* * +* Retour : - * +* * +* Remarques : Il n'y a pas de transfert de propriété ici ! * +* * +******************************************************************************/ + +GDbComment *g_binary_symbol_get_comment(const GBinSymbol *symbol) +{ + return symbol->comment; + +} diff --git a/src/format/symbol.h b/src/format/symbol.h index bfbf541..407375f 100644 --- a/src/format/symbol.h +++ b/src/format/symbol.h @@ -29,6 +29,7 @@ #include "../analysis/routine.h" +#include "../analysis/db/items/comment.h" @@ -92,6 +93,36 @@ void g_binary_symbol_attach_instruction(GBinSymbol *, GArchInstruction *); /* Fournit l'éventuelle instruction associée au symbole. */ GArchInstruction *g_binary_symbol_get_instruction(const GBinSymbol *); +/* Ajoute un commentaire facultatif au symbole. */ +void g_binary_symbol_set_comment(GBinSymbol *, GDbComment *); + +/* Fournit l'éventuel commentaire associé au symbole. */ +GDbComment *g_binary_symbol_get_comment(const GBinSymbol *); + + +/** + * Confort pour l'ajout de symboles basés sur des formats. + */ + +#define SET_IMM_DISPLAY(_ins, _op, _idx, _dsp) \ + do \ + { \ + _op = g_arch_instruction_get_operand(_ins, _idx); \ + g_imm_operand_set_display(G_IMM_OPERAND(_op), _dsp); \ + } \ + while (0) + +#define ADD_RAW_AS_SYM(_fmt, _sym, _pos, _ins, _cmt, _txt) \ + do \ + { \ + _cmt = g_db_comment_new(_pos, _txt, true); \ + _sym = g_binary_symbol_new(STP_DATA, NULL, 0); \ + g_binary_symbol_attach_instruction(_sym, _ins); \ + g_binary_symbol_set_comment(_sym, _cmt); \ + g_binary_format_add_symbol(G_BIN_FORMAT(_fmt), _sym); \ + } \ + while (0) + #endif /* _FORMAT_SYMBOL_H */ -- cgit v0.11.2-87-g4458