summaryrefslogtreecommitdiff
path: root/src/arch/arm
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2016-04-24 18:43:54 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2016-04-24 18:43:54 (GMT)
commit9d04b66153bd0b354c0fb5c097b9face61a649db (patch)
tree54a507c720287597e7a70808e64ad36b37ed41b8 /src/arch/arm
parenta5758a42acdfaf0ac20c4cfb9cf162a9b4440e39 (diff)
Handled hooks and rules in Dalvik opcodes definitions.
Diffstat (limited to 'src/arch/arm')
-rw-r--r--src/arch/arm/v7/fetch.c2
-rw-r--r--src/arch/arm/v7/fetch.h2
-rw-r--r--src/arch/arm/v7/post.c218
-rw-r--r--src/arch/arm/v7/post.h23
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 *);