diff options
Diffstat (limited to 'src/arch')
-rw-r--r-- | src/arch/arm/context.c | 44 | ||||
-rw-r--r-- | src/arch/arm/processor.c | 28 | ||||
-rw-r--r-- | src/arch/arm/v7/link.c | 7 | ||||
-rw-r--r-- | src/arch/context-int.h | 6 | ||||
-rw-r--r-- | src/arch/context.c | 26 | ||||
-rw-r--r-- | src/arch/context.h | 4 | ||||
-rw-r--r-- | src/arch/vmpa.c | 31 | ||||
-rw-r--r-- | src/arch/vmpa.h | 3 |
8 files changed, 146 insertions, 3 deletions
diff --git a/src/arch/arm/context.c b/src/arch/arm/context.c index c86b190..7f41b92 100644 --- a/src/arch/arm/context.c +++ b/src/arch/arm/context.c @@ -60,6 +60,9 @@ static void g_arm_context_dispose(GArmContext *); /* Procède à la libération totale de la mémoire. */ static void g_arm_context_finalize(GArmContext *); +/* Ajoute une adresse virtuelle comme point de départ de code. */ +static void g_arm_context_push_drop_point(GArmContext *, virt_t ); + /* ------------------------- CONTEXTE POUR LA DECOMPILATION ------------------------- */ @@ -124,12 +127,17 @@ G_DEFINE_TYPE(GArmContext, g_arm_context, G_TYPE_PROC_CONTEXT); static void g_arm_context_class_init(GArmContextClass *klass) { GObjectClass *object; /* Autre version de la classe */ + GProcContextClass *proc; /* Version parente de la classe*/ object = G_OBJECT_CLASS(klass); object->dispose = (GObjectFinalizeFunc/* ! */)g_arm_context_dispose; object->finalize = (GObjectFinalizeFunc)g_arm_context_finalize; + proc = G_PROC_CONTEXT_CLASS(klass); + + proc->push_point = (push_drop_point_fc)g_arm_context_push_drop_point; + } @@ -212,6 +220,42 @@ GArmContext *g_arm_context_new(void) } +/****************************************************************************** +* * +* Paramètres : ctx = contexte de désassemblage à compléter. * +* addr = adresse d'un nouveau point de départ à traiter. * +* * +* Description : Ajoute une adresse virtuelle comme point de départ de code. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_arm_context_push_drop_point(GArmContext *ctx, virt_t addr) +{ + + + printf("PUSH !!\n"); + + + + if (addr & 0x1) + { + addr -= 0x1; + + + } + else ; + + // ARM / Thumb + + G_PROC_CONTEXT_CLASS(g_arm_context_parent_class)->push_point(G_PROC_CONTEXT(ctx), addr); + +} + + /* ---------------------------------------------------------------------------------- */ /* CONTEXTE POUR LA DECOMPILATION */ diff --git a/src/arch/arm/processor.c b/src/arch/arm/processor.c index 2c676be..cf993c0 100644 --- a/src/arch/arm/processor.c +++ b/src/arch/arm/processor.c @@ -24,6 +24,7 @@ #include "processor.h" +#include "context.h" #include "processor-int.h" @@ -40,6 +41,9 @@ static void g_arm_processor_dispose(GArmProcessor *); /* Procède à la libération totale de la mémoire. */ static void g_arm_processor_finalize(GArmProcessor *); +/* Fournit un contexte pour l'exécution du processeur ARM. */ +static GArmContext *g_arm_processor_get_context(const GArmProcessor *); + /* Indique le type défini par la GLib pour le processeur ARM. */ @@ -84,6 +88,11 @@ static void g_arm_processor_class_init(GArmProcessorClass *klass) static void g_arm_processor_init(GArmProcessor *proc) { + GArchProcessor *parent; /* Instance parente */ + + parent = G_ARCH_PROCESSOR(proc); + + parent->get_ctx = (get_processor_context_fc)g_arm_processor_get_context; } @@ -124,3 +133,22 @@ static void g_arm_processor_finalize(GArmProcessor *proc) G_OBJECT_CLASS(g_arm_processor_parent_class)->finalize(G_OBJECT(proc)); } + + +/****************************************************************************** +* * +* Paramètres : proc = architecture, spectatrice ici. * +* * +* Description : Fournit un contexte pour l'exécution du processeur Arm. * +* * +* Retour : Contexte mis en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static GArmContext *g_arm_processor_get_context(const GArmProcessor *proc) +{ + return g_arm_context_new(); + +} diff --git a/src/arch/arm/v7/link.c b/src/arch/arm/v7/link.c index 278b8d0..e7a1b40 100644 --- a/src/arch/arm/v7/link.c +++ b/src/arch/arm/v7/link.c @@ -67,6 +67,9 @@ void handle_links_with_thumb_instruction_bl(GArchInstruction *instr, GProcContex if (g_imm_operand_get_value(G_IMM_OPERAND(op), MDS_32_BITS_SIGNED, &offset)) g_imm_operand_set_value(G_IMM_OPERAND(op), MDS_32_BITS_UNSIGNED, pc + offset); + + printf("[@ 0x%08x] Add 0x%08x to %p\n", (uint32_t)get_virt_addr(get_mrange_addr(range)), (uint32_t)(pc + offset), context); + } @@ -110,4 +113,8 @@ void handle_links_with_thumb_instruction_blx(GArchInstruction *instr, GProcConte if (g_imm_operand_get_value(G_IMM_OPERAND(op), MDS_32_BITS_SIGNED, &offset)) g_imm_operand_set_value(G_IMM_OPERAND(op), MDS_32_BITS_UNSIGNED, pc + offset); + + printf("[@ 0x%08x] Add 0x%08x to %p\n", (uint32_t)get_virt_addr(get_mrange_addr(range)), (uint32_t)(pc + offset), context); + + } diff --git a/src/arch/context-int.h b/src/arch/context-int.h index 3a65f79..b181202 100644 --- a/src/arch/context-int.h +++ b/src/arch/context-int.h @@ -29,6 +29,10 @@ +/* Ajoute une adresse virtuelle comme point de départ de code. */ +typedef void (* push_drop_point_fc) (GProcContext *, virt_t); + + /* Définition d'un contexte pour processeur (instance) */ struct _GProcContext { @@ -45,6 +49,8 @@ struct _GProcContextClass { GObjectClass parent; /* A laisser en premier */ + push_drop_point_fc push_point; /* Inclusion de points de chute*/ + }; diff --git a/src/arch/context.c b/src/arch/context.c index 46c4dd1..794030a 100644 --- a/src/arch/context.c +++ b/src/arch/context.c @@ -39,6 +39,9 @@ static void g_proc_context_class_init(GProcContextClass *); /* Initialise une instance de contexte de processeur. */ static void g_proc_context_init(GProcContext *); +/* Ajoute une adresse virtuelle comme point de départ de code. */ +static void _g_proc_context_push_drop_point(GProcContext *, virt_t); + /* Indique le type définit par la GLib pour le contexte de processeur. */ @@ -60,6 +63,7 @@ G_DEFINE_TYPE(GProcContext, g_proc_context, G_TYPE_OBJECT); static void g_proc_context_class_init(GProcContextClass *klass) { + klass->push_point = (push_drop_point_fc)_g_proc_context_push_drop_point; } @@ -97,7 +101,7 @@ static void g_proc_context_init(GProcContext *ctx) * * ******************************************************************************/ -void g_proc_context_push_drop_point(GProcContext *ctx, virt_t addr) +static void _g_proc_context_push_drop_point(GProcContext *ctx, virt_t addr) { ctx->drop_points = (virt_t *)realloc(ctx->drop_points, ++ctx->dp_count * sizeof(virt_t)); @@ -108,6 +112,26 @@ void g_proc_context_push_drop_point(GProcContext *ctx, virt_t addr) /****************************************************************************** * * +* Paramètres : ctx = contexte de désassemblage à compléter. * +* addr = adresse d'un nouveau point de départ à traiter. * +* * +* Description : Ajoute une adresse virtuelle comme point de départ de code. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_proc_context_push_drop_point(GProcContext *ctx, virt_t addr) +{ + return G_PROC_CONTEXT_GET_CLASS(ctx)->push_point(ctx, addr); + +} + + +/****************************************************************************** +* * * Paramètres : ctx = contexte de désassemblage à consulter. * * * * Description : Indique si des points de départ restent à traiter ou non. * diff --git a/src/arch/context.h b/src/arch/context.h index 9bb7cd3..97b23b6 100644 --- a/src/arch/context.h +++ b/src/arch/context.h @@ -36,9 +36,9 @@ #define G_TYPE_PROC_CONTEXT g_proc_context_get_type() #define G_PROC_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_proc_context_get_type(), GProcContext)) #define G_IS_PROC_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_proc_context_get_type())) -#define G_PROC_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_PROC_CONTEXT, GGProcContextClass)) +#define G_PROC_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_PROC_CONTEXT, GProcContextClass)) #define G_IS_PROC_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_PROC_CONTEXT)) -#define G_PROC_CONTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_PROC_CONTEXT, GGProcContextClass)) +#define G_PROC_CONTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_PROC_CONTEXT, GProcContextClass)) /* Définition d'un contexte pour processeur (instance) */ diff --git a/src/arch/vmpa.c b/src/arch/vmpa.c index 024161c..7d57909 100644 --- a/src/arch/vmpa.c +++ b/src/arch/vmpa.c @@ -626,6 +626,37 @@ int cmp_mrange(const mrange_t *a, const mrange_t *b) /****************************************************************************** * * * Paramètres : range = zone mémoire à consulter. * +* sub = éventuelle sous-région à valider. * +* * +* Description : Indique si une zone en contient une autre ou non. * +* * +* Retour : Bilan de la consultation. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool mrange_contains_mrange(const mrange_t *range, const mrange_t *sub) +{ + bool result; /* Bilan à retourner */ + phys_t start; /* Point de départ */ + + result = mrange_contains_addr(range, get_mrange_addr(sub)); + + if (result) + { + start = compute_vmpa_diff(get_mrange_addr(range), get_mrange_addr(sub)); + result = (start + get_mrange_length(sub) <= get_mrange_length(range)); + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : range = zone mémoire à consulter. * * addr = localisation mémoire à analyser. * * * * Description : Indique si une localisation est incluse dans une zone ou non.* diff --git a/src/arch/vmpa.h b/src/arch/vmpa.h index f0a8faf..96e8a56 100644 --- a/src/arch/vmpa.h +++ b/src/arch/vmpa.h @@ -153,6 +153,9 @@ void copy_mrange(mrange_t *, const mrange_t *); /* Compare deux couvertures mémoire selon leurs propriétés. */ int cmp_mrange(const mrange_t *, const mrange_t *); +/* Indique si une zone en contient une autre ou non. */ +bool mrange_contains_mrange(const mrange_t *, const mrange_t *); + /* Indique si une localisation est incluse dans une zone ou non. */ bool mrange_contains_addr(const mrange_t *, const vmpa2t *); |