From 8a4274cb6a99184ff4d9203c784ffd1e78550002 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
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 <nocbos@gmail.com>
+
+	* 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 <nocbos@gmail.com>
 
 	* 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 <malloc.h>
 #include <stdio.h>
 
 
@@ -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