diff options
Diffstat (limited to 'src/arch/arm')
-rw-r--r-- | src/arch/arm/v7/fetch.c | 2 | ||||
-rw-r--r-- | src/arch/arm/v7/fetch.h | 2 | ||||
-rw-r--r-- | src/arch/arm/v7/post.c | 218 | ||||
-rw-r--r-- | src/arch/arm/v7/post.h | 23 |
4 files changed, 21 insertions, 224 deletions
diff --git a/src/arch/arm/v7/fetch.c b/src/arch/arm/v7/fetch.c index 33a9e92..6ca98ca 100644 --- a/src/arch/arm/v7/fetch.c +++ b/src/arch/arm/v7/fetch.c @@ -1,6 +1,6 @@ /* Chrysalide - Outil d'analyse de fichiers binaires - * fetch.c - traitements complémentaires à la phase de désassemblage + * fetch.c - ajouts de sauts à traiter durant la phase de désassemblage * * Copyright (C) 2014 Cyrille Bagard * diff --git a/src/arch/arm/v7/fetch.h b/src/arch/arm/v7/fetch.h index af42f2e..1b253ed 100644 --- a/src/arch/arm/v7/fetch.h +++ b/src/arch/arm/v7/fetch.h @@ -1,6 +1,6 @@ /* Chrysalide - Outil d'analyse de fichiers binaires - * fetch.h - prototypes pour l'édition des liens durant la phase de désassemblage + * fetch.h - prototypes pour les ajouts de sauts à traiter durant la phase de désassemblage * * Copyright (C) 2014 Cyrille Bagard * diff --git a/src/arch/arm/v7/post.c b/src/arch/arm/v7/post.c index 0692cea..929d166 100644 --- a/src/arch/arm/v7/post.c +++ b/src/arch/arm/v7/post.c @@ -43,220 +43,6 @@ * * ******************************************************************************/ -void post_process_branch_instructions(GArchInstruction *instr, GArchProcessor *proc, GProcContext *context, GBinFormat *format) -{ - GArchOperand *op; /* Opérande numérique en place */ - uint32_t addr; /* Adresse visée par le saut */ - GArchOperand *new; /* Instruction de ciblage */ - vmpa2t target; - mrange_t trange; /* Etendue du symbole à créer */ - VMPA_BUFFER(loc); - char name[5 + VMPA_MAX_LEN]; - GBinRoutine *routine; /* Nouvelle routine trouvée */ - GBinSymbol *symbol; /* Nouveau symbole construit */ - - op = g_arch_instruction_get_operand(instr, 0); - - - if (!G_IS_IMM_OPERAND(op)) return; - - - if (g_imm_operand_get_value(G_IMM_OPERAND(op), MDS_32_BITS_UNSIGNED, &addr) - && g_exe_format_translate_address_into_vmpa(G_EXE_FORMAT(format), addr, &target)) - { - new = g_target_operand_new(MDS_32_BITS_UNSIGNED, addr); - - if (!g_target_operand_resolve(G_TARGET_OPERAND(new), format)) - { - init_mrange(&trange, &target, 0); - - vmpa2_virt_to_string(&target, MDS_UNDEFINED, loc, NULL); - snprintf(name, sizeof(name), "loc_%s", loc + 2); - - routine = g_binary_routine_new(); - g_binary_routine_set_name(routine, strdup(name)); - //routine = try_to_demangle_routine(name); - - g_binary_routine_set_range(routine, &trange); - - symbol = g_binary_symbol_new(STP_CODE_LABEL); - g_binary_symbol_attach_routine(symbol, routine); - g_binary_format_add_symbol(G_BIN_FORMAT(format), symbol); - - - - g_target_operand_resolve(G_TARGET_OPERAND(new), format); - - } - - g_arch_instruction_replace_operand(instr, new, op); - - } - -} - - -/****************************************************************************** -* * -* Paramètres : instr = instruction ARMv7 à traiter. * -* proc = représentation de l'architecture utilisée. * -* context = contexte associé à la phase de désassemblage. * -* format = accès aux données du binaire d'origine. * -* * -* Description : Complète un désassemblage accompli pour une instruction. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void post_process_branch_and_link_instructions(GArchInstruction *instr, GArchProcessor *proc, GProcContext *context, GBinFormat *format) -{ - GArchOperand *op; /* Opérande numérique en place */ - uint32_t addr; /* Adresse visée par le saut */ - GArchOperand *new; /* Instruction de ciblage */ - vmpa2t target; - mrange_t trange; /* Etendue du symbole à créer */ - VMPA_BUFFER(loc); - char name[5 + VMPA_MAX_LEN]; - GBinRoutine *routine; /* Nouvelle routine trouvée */ - GBinSymbol *symbol; /* Nouveau symbole construit */ - - op = g_arch_instruction_get_operand(instr, 0); - - - if (!G_IS_IMM_OPERAND(op)) return; - - - if (g_imm_operand_get_value(G_IMM_OPERAND(op), MDS_32_BITS_UNSIGNED, &addr) - && g_exe_format_translate_address_into_vmpa(G_EXE_FORMAT(format), addr, &target)) - { - - - /// FIXME (DUR) ?! - if (addr < 0x8000) return; - - if (addr > 0x6966c) return; - - - - - new = g_target_operand_new(MDS_32_BITS_UNSIGNED, addr); - - if (!g_target_operand_resolve(G_TARGET_OPERAND(new), format)) - { - init_mrange(&trange, &target, 0); - - vmpa2_virt_to_string(&target, MDS_UNDEFINED, loc, NULL); - snprintf(name, sizeof(name), "sub_%s", loc + 2); - - routine = g_binary_routine_new(); - g_binary_routine_set_name(routine, strdup(name)); - //routine = try_to_demangle_routine(name); - - g_binary_routine_set_range(routine, &trange); - - symbol = g_binary_symbol_new(STP_ROUTINE); - g_binary_symbol_attach_routine(symbol, routine); - g_binary_format_add_symbol(G_BIN_FORMAT(format), symbol); - - - - g_target_operand_resolve(G_TARGET_OPERAND(new), format); - - } - - g_arch_instruction_replace_operand(instr, new, op); - - } - -} - - -/****************************************************************************** -* * -* Paramètres : instr = instruction ARMv7 à traiter. * -* proc = représentation de l'architecture utilisée. * -* context = contexte associé à la phase de désassemblage. * -* format = accès aux données du binaire d'origine. * -* * -* Description : Complète un désassemblage accompli pour une instruction. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void post_process_comp_and_branch_instructions(GArchInstruction *instr, GArchProcessor *proc, GProcContext *context, GBinFormat *format) -{ - GArchOperand *op; /* Opérande numérique en place */ - uint32_t addr; /* Adresse visée par le saut */ - GArchOperand *new; /* Instruction de ciblage */ - vmpa2t target; - mrange_t trange; /* Etendue du symbole à créer */ - VMPA_BUFFER(loc); - char name[5 + VMPA_MAX_LEN]; - GBinRoutine *routine; /* Nouvelle routine trouvée */ - GBinSymbol *symbol; /* Nouveau symbole construit */ - - op = g_arch_instruction_get_operand(instr, 1); - - - if (!G_IS_IMM_OPERAND(op)) return; - - - if (g_imm_operand_get_value(G_IMM_OPERAND(op), MDS_32_BITS_UNSIGNED, &addr) - && g_exe_format_translate_address_into_vmpa(G_EXE_FORMAT(format), addr, &target)) - { - new = g_target_operand_new(MDS_32_BITS_UNSIGNED, addr); - - if (!g_target_operand_resolve(G_TARGET_OPERAND(new), format)) - { - init_mrange(&trange, &target, 0); - - vmpa2_virt_to_string(&target, MDS_UNDEFINED, loc, NULL); - snprintf(name, sizeof(name), "loc_%s", loc + 2); - - routine = g_binary_routine_new(); - g_binary_routine_set_name(routine, strdup(name)); - //routine = try_to_demangle_routine(name); - - g_binary_routine_set_range(routine, &trange); - - symbol = g_binary_symbol_new(STP_CODE_LABEL); - g_binary_symbol_attach_routine(symbol, routine); - g_binary_format_add_symbol(G_BIN_FORMAT(format), symbol); - - - - g_target_operand_resolve(G_TARGET_OPERAND(new), format); - - } - - g_arch_instruction_replace_operand(instr, new, op); - - } - -} - - -/****************************************************************************** -* * -* Paramètres : instr = instruction ARMv7 à traiter. * -* proc = représentation de l'architecture utilisée. * -* context = contexte associé à la phase de désassemblage. * -* format = accès aux données du binaire d'origine. * -* * -* Description : Complète un désassemblage accompli pour une instruction. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - void post_process_ldr_instructions(GArchInstruction *instr, GArchProcessor *proc, GProcContext *context, GBinFormat *format) { GArchOperand *op; /* Opérande numérique en place */ @@ -280,7 +66,7 @@ void post_process_ldr_instructions(GArchInstruction *instr, GArchProcessor *proc { new = g_target_operand_new(MDS_32_BITS_UNSIGNED, addr); - if (!g_target_operand_resolve(G_TARGET_OPERAND(new), format)) + if (!g_target_operand_resolve(G_TARGET_OPERAND(new), format, true)) { addr &= ~0x1; @@ -314,7 +100,7 @@ void post_process_ldr_instructions(GArchInstruction *instr, GArchProcessor *proc - g_target_operand_resolve(G_TARGET_OPERAND(new), format); + g_target_operand_resolve(G_TARGET_OPERAND(new), format, true); } else diff --git a/src/arch/arm/v7/post.h b/src/arch/arm/v7/post.h index 6165597..c2e5b66 100644 --- a/src/arch/arm/v7/post.h +++ b/src/arch/arm/v7/post.h @@ -26,18 +26,29 @@ #include "../../instruction.h" +#include "../../post.h" #include "../../../format/format.h" -/* Complète un désassemblage accompli pour une instruction. */ -void post_process_branch_instructions(GArchInstruction *, GArchProcessor *, GProcContext *, GBinFormat *); +static inline void post_process_branch_instructions(GArchInstruction *ins, GArchProcessor *proc, GProcContext *ctx, GBinFormat *fmt) +{ + post_process_target_resolution(ins, proc, ctx, fmt, 0, STP_CODE_LABEL); -/* Complète un désassemblage accompli pour une instruction. */ -void post_process_branch_and_link_instructions(GArchInstruction *, GArchProcessor *, GProcContext *, GBinFormat *); +} + +static inline void post_process_branch_and_link_instructions(GArchInstruction *ins, GArchProcessor *proc, GProcContext *ctx, GBinFormat *fmt) +{ + post_process_target_resolution(ins, proc, ctx, fmt, 0, STP_ROUTINE); + +} + +static inline void post_process_comp_and_branch_instructions(GArchInstruction *ins, GArchProcessor *proc, GProcContext *ctx, GBinFormat *fmt) +{ + post_process_target_resolution(ins, proc, ctx, fmt, 1, STP_CODE_LABEL); + +} -/* Complète un désassemblage accompli pour une instruction. */ -void post_process_comp_and_branch_instructions(GArchInstruction *, GArchProcessor *, GProcContext *, GBinFormat *); /* Complète un désassemblage accompli pour une instruction. */ void post_process_ldr_instructions(GArchInstruction *, GArchProcessor *, GProcContext *, GBinFormat *); |