From 8a4274cb6a99184ff4d9203c784ffd1e78550002 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Wed, 25 Oct 2017 21:39:15 +0200 Subject: Created a cache for Dalvik registers. --- ChangeLog | 13 +++++ plugins/dalvik/core.c | 20 ++++++- plugins/dalvik/core.h | 3 ++ plugins/dalvik/register.c | 124 +++++++++++++++++++++++++++++++++++++++++++- plugins/dalvik/register.h | 11 ++++ plugins/dex/core.c | 1 - plugins/elf/core.c | 1 - plugins/ropgadgets/plugin.c | 1 - 8 files changed, 169 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 744dea0..671d873 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +17-10-25 Cyrille Bagard + + * plugins/dalvik/core.c: + * plugins/dalvik/core.h: + * plugins/dalvik/register.c: + * plugins/dalvik/register.h: + Create a cache for Dalvik registers. + + * plugins/dex/core.c: + * plugins/elf/core.c: + * plugins/ropgadgets/plugin.c: + Typo. + 17-10-18 Cyrille Bagard * plugins/dex/core.c: diff --git a/plugins/dalvik/core.c b/plugins/dalvik/core.c index f5b2f91..7f0c79f 100644 --- a/plugins/dalvik/core.c +++ b/plugins/dalvik/core.c @@ -29,6 +29,7 @@ #include "processor.h" +#include "register.h" @@ -40,7 +41,6 @@ DEFINE_CHRYSALIDE_PLUGIN("dalvik", "Add suport for the Dalvik architecture", "0. /****************************************************************************** * * * Paramètres : plugin = greffon à manipuler. * -* ref = espace de référencement global. * * * * Description : Prend acte du chargement du greffon. * * * @@ -60,3 +60,21 @@ G_MODULE_EXPORT bool chrysalide_plugin_init(GPluginModule *plugin) return result; } + +/****************************************************************************** +* * +* Paramètres : plugin = greffon à manipuler. * +* * +* Description : Prend acte du déchargement du greffon. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +G_MODULE_EXPORT void chrysalide_plugin_exit(GPluginModule *plugin) +{ + clean_dalvik_register_cache(); + +} diff --git a/plugins/dalvik/core.h b/plugins/dalvik/core.h index e72abaa..08717a9 100644 --- a/plugins/dalvik/core.h +++ b/plugins/dalvik/core.h @@ -33,6 +33,9 @@ /* Prend acte du chargement du greffon. */ G_MODULE_EXPORT bool chrysalide_plugin_init(GPluginModule *); +/* Prend acte du déchargement du greffon. */ +G_MODULE_EXPORT void chrysalide_plugin_exit(GPluginModule *); + #endif /* _PLUGINS_DALVIK_CORE_H */ diff --git a/plugins/dalvik/register.c b/plugins/dalvik/register.c index 00e9757..2e7b7c6 100644 --- a/plugins/dalvik/register.c +++ b/plugins/dalvik/register.c @@ -24,6 +24,7 @@ #include "register.h" +#include #include @@ -32,6 +33,9 @@ +/* ------------------------- GESTION UNITAIRE DES REGISTRES ------------------------- */ + + /* Représentation d'un registre Dalvik (instance) */ struct _GDalvikRegister { @@ -71,6 +75,27 @@ static guint g_dalvik_register_hash(const GDalvikRegister *); /* Traduit un registre en version humainement lisible. */ static void g_dalvik_register_print(const GDalvikRegister *, GBufferLine *, AsmSyntax); +/* Crée une réprésentation de registre Dalvik. */ +GDalvikRegister *_g_dalvik_register_new(uint16_t); + + + +/* ------------------------ GESTION SOUS FORME DE SINGLETONS ------------------------ */ + + +/* Conservation des registres utilisés */ +static GDalvikRegister **_dalvik_registers = NULL; +static uint16_t _dreg_count = 0; + + +/* Fournit le singleton associé à un registre Dalvik. */ +static GDalvikRegister *get_dalvik_register(uint16_t); + + + +/* ---------------------------------------------------------------------------------- */ +/* GESTION UNITAIRE DES REGISTRES */ +/* ---------------------------------------------------------------------------------- */ /* Indique le type défini pour une représentation d'un registre Dalvik. */ @@ -235,7 +260,7 @@ static void g_dalvik_register_print(const GDalvikRegister *reg, GBufferLine *lin * * ******************************************************************************/ -GDalvikRegister *g_dalvik_register_new(uint16_t index) +GDalvikRegister *_g_dalvik_register_new(uint16_t index) { GDalvikRegister *result; /* Structure à retourner */ @@ -250,6 +275,29 @@ GDalvikRegister *g_dalvik_register_new(uint16_t index) /****************************************************************************** * * +* Paramètres : index = indice du registre correspondant. * +* * +* Description : Crée une réprésentation de registre Dalvik. * +* * +* Retour : Adresse de la structure mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GDalvikRegister *g_dalvik_register_new(uint16_t index) +{ + GDalvikRegister *result; /* Structure à retourner */ + + result = get_dalvik_register(index); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : reg = registre à consulter. * * * * Description : Fournit l'indice d'un registre Dalvik. * @@ -289,3 +337,77 @@ int g_dalvik_register_compare(const GDalvikRegister *a, const GDalvikRegister *b return result; } + + + +/* ---------------------------------------------------------------------------------- */ +/* GESTION SOUS FORME DE SINGLETONS */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : index = indice du registre correspondant. * +* * +* Description : Fournit le singleton associé à un registre Dalvik. * +* * +* Retour : Adresse de la structure mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static GDalvikRegister *get_dalvik_register(uint16_t index) +{ + GDalvikRegister *result; /* Structure à retourner */ + uint16_t i; /* Boucle de parcours */ + + if (index >= _dreg_count) + { + _dalvik_registers = realloc(_dalvik_registers, (index + 1) * sizeof(GDalvikRegister *)); + + for (i = _dreg_count; i < (index + 1); i++) + _dalvik_registers[i] = NULL; + + _dreg_count = index + 1; + + } + + if (_dalvik_registers[index] == NULL) + _dalvik_registers[index] = _g_dalvik_register_new(index); + + result = _dalvik_registers[index]; + + g_object_ref(G_OBJECT(result)); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : - * +* * +* Description : Vide totalement le cache des registres Dalvik. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void clean_dalvik_register_cache(void) +{ + uint16_t i; /* Boucle de parcours */ + + for (i = 0; i < _dreg_count; i++) + g_object_unref(G_OBJECT(_dalvik_registers[i])); + + if (_dalvik_registers != NULL) + free(_dalvik_registers); + + _dalvik_registers = NULL; + _dreg_count = 0; + +} diff --git a/plugins/dalvik/register.h b/plugins/dalvik/register.h index 460edd7..de5efe5 100644 --- a/plugins/dalvik/register.h +++ b/plugins/dalvik/register.h @@ -33,6 +33,9 @@ +/* ------------------------- GESTION UNITAIRE DES REGISTRES ------------------------- */ + + #define G_TYPE_DALVIK_REGISTER g_dalvik_register_get_type() #define G_DALVIK_REGISTER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_dalvik_register_get_type(), GDalvikRegister)) #define G_IS_DALVIK_REGISTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_dalvik_register_get_type())) @@ -62,4 +65,12 @@ int g_dalvik_register_compare(const GDalvikRegister *, const GDalvikRegister *); +/* ------------------------ GESTION SOUS FORME DE SINGLETONS ------------------------ */ + + +/* Vide totalement le cache des registres Dalvik. */ +void clean_dalvik_register_cache(void); + + + #endif /* _ARCH_DALVIK_REGISTERS_H */ diff --git a/plugins/dex/core.c b/plugins/dex/core.c index 8846c51..b163be9 100644 --- a/plugins/dex/core.c +++ b/plugins/dex/core.c @@ -41,7 +41,6 @@ DEFINE_CHRYSALIDE_PLUGIN("dex", "Add suport for the DEX format", "0.1.0", /****************************************************************************** * * * Paramètres : plugin = greffon à manipuler. * -* ref = espace de référencement global. * * * * Description : Prend acte du chargement du greffon. * * * diff --git a/plugins/elf/core.c b/plugins/elf/core.c index ebd980e..a12a8a6 100644 --- a/plugins/elf/core.c +++ b/plugins/elf/core.c @@ -41,7 +41,6 @@ DEFINE_CHRYSALIDE_PLUGIN("elf", "Add suport for the ELF format", "0.1.0", /****************************************************************************** * * * Paramètres : plugin = greffon à manipuler. * -* ref = espace de référencement global. * * * * Description : Prend acte du chargement du greffon. * * * diff --git a/plugins/ropgadgets/plugin.c b/plugins/ropgadgets/plugin.c index 11d1715..85ae6dd 100644 --- a/plugins/ropgadgets/plugin.c +++ b/plugins/ropgadgets/plugin.c @@ -49,7 +49,6 @@ static void mcb_plugins_list_rop_gadgets(GtkMenuItem *, gpointer); /****************************************************************************** * * * Paramètres : plugin = greffon à manipuler. * -* ref = espace de référencement global. * * * * Description : Prend acte du chargement du greffon. * * * -- cgit v0.11.2-87-g4458