diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2017-10-18 20:50:10 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2017-10-18 20:50:10 (GMT) |
commit | dce9d9cdfef1d37ef11a987a21f36e83b6b1944f (patch) | |
tree | 830623ade20e892954fcbddd3b7b05d09aac1dd7 /src/arch/dalvik/pseudo | |
parent | 1e7c7de85438749d3faf7b76984b86a9c088fbc1 (diff) |
Created plugins for the Dex and Dalvik support.
Diffstat (limited to 'src/arch/dalvik/pseudo')
-rw-r--r-- | src/arch/dalvik/pseudo/Makefile.am | 15 | ||||
-rw-r--r-- | src/arch/dalvik/pseudo/fill.c | 198 | ||||
-rw-r--r-- | src/arch/dalvik/pseudo/fill.h | 60 | ||||
-rw-r--r-- | src/arch/dalvik/pseudo/switch.c | 301 | ||||
-rw-r--r-- | src/arch/dalvik/pseudo/switch.h | 63 |
5 files changed, 0 insertions, 637 deletions
diff --git a/src/arch/dalvik/pseudo/Makefile.am b/src/arch/dalvik/pseudo/Makefile.am deleted file mode 100644 index 9743220..0000000 --- a/src/arch/dalvik/pseudo/Makefile.am +++ /dev/null @@ -1,15 +0,0 @@ - -noinst_LTLIBRARIES = libarchdalvikpseudo.la - -libarchdalvikpseudo_la_SOURCES = \ - fill.h fill.c \ - switch.h switch.c - -libarchdalvikpseudo_la_LIBADD = - -libarchdalvikpseudo_la_CFLAGS = $(AM_CFLAGS) - - -AM_CPPFLAGS = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS) - -AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS) diff --git a/src/arch/dalvik/pseudo/fill.c b/src/arch/dalvik/pseudo/fill.c deleted file mode 100644 index dc5683c..0000000 --- a/src/arch/dalvik/pseudo/fill.c +++ /dev/null @@ -1,198 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * fill.c - prise en charge de l'instruction spéciale fill-array-data - * - * Copyright (C) 2011-2017 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * Chrysalide is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Chrysalide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Foobar. If not, see <http://www.gnu.org/licenses/>. - */ - - -#include "fill.h" - - -#include <assert.h> -#include <string.h> - - -#include "../instruction-int.h" - - - -/* Définition générique d'une instruction d'architecture Dalvik (instance) */ -struct _GDalvikFillInstr -{ - GDalvikInstruction parent; /* A laisser en premier */ - - uint16_t item_width; /* Taille des éléments */ - uint32_t array_size; /* Taille du tableau */ - -}; - -/* Définition générique d'une instruction d'architecture Dalvik (classe) */ -struct _GDalvikFillInstrClass -{ - GDalvikInstructionClass parent; /* A laisser en premier */ - -}; - - - -/* Initialise la classe générique des instructions. */ -static void g_dalvik_fill_instr_class_init(GDalvikFillInstrClass *); - -/* Initialise une instance d'opérande d'architecture. */ -static void g_dalvik_fill_instr_init(GDalvikFillInstr *); - -/* Supprime toutes les références externes. */ -static void g_dalvik_fill_instr_dispose(GDalvikFillInstr *); - -/* Procède à la libération totale de la mémoire. */ -static void g_dalvik_fill_instr_finalize(GDalvikFillInstr *); - - - -/* Indique le type défini pour une pseudo-instruction Dalvik de remplissage. */ -G_DEFINE_TYPE(GDalvikFillInstr, g_dalvik_fill_instr, G_TYPE_DALVIK_INSTRUCTION); - - -/****************************************************************************** -* * -* Paramètres : klass = classe à initialiser. * -* * -* Description : Initialise la classe générique des instructions. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_dalvik_fill_instr_class_init(GDalvikFillInstrClass *klass) -{ - GObjectClass *object; /* Autre version de la classe */ - - object = G_OBJECT_CLASS(klass); - - object->dispose = (GObjectFinalizeFunc/* ! */)g_dalvik_fill_instr_dispose; - object->finalize = (GObjectFinalizeFunc)g_dalvik_fill_instr_finalize; - -} - - -/****************************************************************************** -* * -* Paramètres : instr = instance à initialiser. * -* * -* Description : Initialise une instance d'instruction d'architecture. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_dalvik_fill_instr_init(GDalvikFillInstr *instr) -{ - G_DALVIK_INSTRUCTION(instr)->keyword = "array-data"; - -} - - -/****************************************************************************** -* * -* Paramètres : instr = instance d'objet GLib à traiter. * -* * -* Description : Supprime toutes les références externes. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_dalvik_fill_instr_dispose(GDalvikFillInstr *instr) -{ - G_OBJECT_CLASS(g_dalvik_fill_instr_parent_class)->dispose(G_OBJECT(instr)); - -} - - -/****************************************************************************** -* * -* Paramètres : instr = instance d'objet GLib à traiter. * -* * -* Description : Procède à la libération totale de la mémoire. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_dalvik_fill_instr_finalize(GDalvikFillInstr *instr) -{ - G_OBJECT_CLASS(g_dalvik_fill_instr_parent_class)->finalize(G_OBJECT(instr)); - -} - - -/****************************************************************************** -* * -* Paramètres : ident = identifiant de l'instruction déjà lu. * -* ctx = contexte lié à l'exécution du processeur. * -* content = flux de données à analyser. * -* pos = position courante dans ce flux. [OUT] * -* * -* Description : Crée une pesudo-instruction Dalvik de remplissage. * -* * -* Retour : Instruction mise en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GArchInstruction *g_dalvik_fill_instr_new(uint16_t ident, GDalvikContext *ctx, const GBinContent *content, vmpa2t *pos) -{ - GDalvikFillInstr *result; /* Structure à retourner */ - phys_t consumed; /* Données consommées */ - - assert(ident == DPO_FILL_ARRAY_DATA); - - result = g_object_new(G_TYPE_DALVIK_FILL_INSTR, NULL); - - G_DALVIK_INSTRUCTION(result)->ptype = ident; - - if (!g_binary_content_read_u16(content, pos, SRE_LITTLE, &result->item_width)) - goto gdfin_bad; - - if (!g_binary_content_read_u32(content, pos, SRE_LITTLE, &result->array_size)) - goto gdfin_bad; - - consumed = result->item_width * result->array_size; - - if (!g_dalvik_context_register_array_data(ctx, pos, result->item_width, consumed)) - goto gdfin_bad; - - return G_ARCH_INSTRUCTION(result); - - gdfin_bad: - - g_object_unref(result); - - return NULL; - -} diff --git a/src/arch/dalvik/pseudo/fill.h b/src/arch/dalvik/pseudo/fill.h deleted file mode 100644 index 2a63df9..0000000 --- a/src/arch/dalvik/pseudo/fill.h +++ /dev/null @@ -1,60 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * fill.h - prototypes pour la prise en charge de l'instruction spéciale fill-array-data - * - * Copyright (C) 2011-2017 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * Chrysalide is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Chrysalide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Foobar. If not, see <http://www.gnu.org/licenses/>. - */ - - -#ifndef _ARCH_DALVIK_PSEUDO_FILL_H -#define _ARCH_DALVIK_PSEUDO_FILL_H - - -#include "../context.h" -#include "../instruction.h" -#include "../processor.h" - - -#include <glib-object.h> - - - -#define G_TYPE_DALVIK_FILL_INSTR g_dalvik_fill_instr_get_type() -#define G_DALVIK_FILL_INSTR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_DALVIK_FILL_INSTR, GDalvikFillInstr)) -#define G_IS_DALVIK_FILL_INSTR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_DALVIK_FILL_INSTR)) -#define G_DALVIK_FILL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_DALVIK_FILL, GGDalvikFillClass)) -#define G_IS_DALVIK_FILL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_DALVIK_FILL)) -#define G_DALVIK_FILL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_DALVIK_FILL, GGDalvikFillClass)) - - -/* Définition générique d'une instruction d'architecture (instance) */ -typedef struct _GDalvikFillInstr GDalvikFillInstr; - -/* Définition générique d'une instruction d'architecture (classe) */ -typedef struct _GDalvikFillInstrClass GDalvikFillInstrClass; - - -/* Indique le type défini pour une pseudo-instruction Dalvik de remplissage. */ -GType g_dalvik_fill_instr_get_type(void); - -/* Crée une pesudo-instruction Dalvik de remplissage. */ -GArchInstruction *g_dalvik_fill_instr_new(uint16_t, GDalvikContext *, const GBinContent *, vmpa2t *); - - - -#endif /* _ARCH_DALVIK_PSEUDO_FILL_H */ diff --git a/src/arch/dalvik/pseudo/switch.c b/src/arch/dalvik/pseudo/switch.c deleted file mode 100644 index 90cff87..0000000 --- a/src/arch/dalvik/pseudo/switch.c +++ /dev/null @@ -1,301 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * switch.c - prise en charge des instructions spéciales (packed|sparse)switch - * - * Copyright (C) 2011-2017 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * Chrysalide is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Chrysalide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Foobar. If not, see <http://www.gnu.org/licenses/>. - */ - - -#include "switch.h" - - -#include <assert.h> -#include <malloc.h> - - -#include "../instruction-int.h" - - - -/* Définition générique d'une instruction d'architecture Dalvik (instance) */ -struct _GDalvikSwitchInstr -{ - GDalvikInstruction parent; /* A laisser en premier */ - - uint16_t switch_size; /* Taille du switch considéré */ - - int32_t *keys; /* Table de clefs */ - int32_t *targets; /* Table des sauts relatifs */ - -}; - -/* Définition générique d'une instruction d'architecture Dalvik (classe) */ -struct _GDalvikSwitchInstrClass -{ - GDalvikInstructionClass parent; /* A laisser en premier */ - -}; - - - -/* Initialise la classe générique des instructions. */ -static void g_dalvik_switch_instr_class_init(GDalvikSwitchInstrClass *); - -/* Initialise une instance d'opérande d'architecture. */ -static void g_dalvik_switch_instr_init(GDalvikSwitchInstr *); - -/* Supprime toutes les références externes. */ -static void g_dalvik_switch_instr_dispose(GDalvikSwitchInstr *); - -/* Procède à la libération totale de la mémoire. */ -static void g_dalvik_switch_instr_finalize(GDalvikSwitchInstr *); - -/* Lit toutes les valeurs associés aux branchements. */ -static bool g_dalvik_switch_decode_data(GDalvikSwitchInstr *, const GBinContent *, const vmpa2t *); - - - -/* Indique le type défini pour une pseudo-instruction Dalvik de remplissage. */ -G_DEFINE_TYPE(GDalvikSwitchInstr, g_dalvik_switch_instr, G_TYPE_DALVIK_INSTRUCTION); - - -/****************************************************************************** -* * -* Paramètres : klass = classe à initialiser. * -* * -* Description : Initialise la classe générique des instructions. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_dalvik_switch_instr_class_init(GDalvikSwitchInstrClass *klass) -{ - GObjectClass *object; /* Autre version de la classe */ - - object = G_OBJECT_CLASS(klass); - - object->dispose = (GObjectFinalizeFunc/* ! */)g_dalvik_switch_instr_dispose; - object->finalize = (GObjectFinalizeFunc)g_dalvik_switch_instr_finalize; - -} - - -/****************************************************************************** -* * -* Paramètres : instr = instance à initialiser. * -* * -* Description : Initialise une instance d'instruction d'architecture. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_dalvik_switch_instr_init(GDalvikSwitchInstr *instr) -{ - G_DALVIK_INSTRUCTION(instr)->keyword = "switch-data"; - -} - - -/****************************************************************************** -* * -* Paramètres : instr = instance d'objet GLib à traiter. * -* * -* Description : Supprime toutes les références externes. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_dalvik_switch_instr_dispose(GDalvikSwitchInstr *instr) -{ - G_OBJECT_CLASS(g_dalvik_switch_instr_parent_class)->dispose(G_OBJECT(instr)); - -} - - -/****************************************************************************** -* * -* Paramètres : instr = instance d'objet GLib à traiter. * -* * -* Description : Procède à la libération totale de la mémoire. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_dalvik_switch_instr_finalize(GDalvikSwitchInstr *instr) -{ - if (instr->keys != NULL) - free(instr->keys); - - if (instr->targets != NULL) - free(instr->targets); - - G_OBJECT_CLASS(g_dalvik_switch_instr_parent_class)->finalize(G_OBJECT(instr)); - -} - - -/****************************************************************************** -* * -* Paramètres : ident = identifiant de l'instruction déjà lu. * -* ctx = contexte lié à l'exécution du processeur. * -* content = flux de données à analyser. * -* pos = position courante dans ce flux. [OUT] * -* * -* Description : Crée une pesudo-instruction Dalvik de branchement. * -* * -* Retour : Instruction mise en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GArchInstruction *g_dalvik_switch_instr_new(uint16_t ident, GDalvikContext *ctx, const GBinContent *content, vmpa2t *pos) -{ - GDalvikSwitchInstr *result; /* Structure à retourner */ - phys_t consumed; /* Données consommées */ - - assert(ident == DPO_PACKED_SWITCH || ident == DPO_SPARSE_SWITCH); - - result = g_object_new(G_TYPE_DALVIK_SWITCH_INSTR, NULL); - - G_DALVIK_INSTRUCTION(result)->ptype = ident; - - if (!g_binary_content_read_u16(content, pos, SRE_LITTLE, &result->switch_size)) - goto gdsin_bad; - - if (!g_dalvik_switch_decode_data(result, content, pos)) - goto gdsin_bad; - - if (ident == DPO_PACKED_SWITCH) - consumed = (1 + result->switch_size) * sizeof(int32_t); - else - consumed = (2 * result->switch_size) * sizeof(int32_t); - - if (!g_dalvik_context_register_switch_data(ctx, pos, consumed)) - goto gdsin_bad; - - return G_ARCH_INSTRUCTION(result); - - gdsin_bad: - - g_object_unref(result); - - return NULL; - -} - - -/****************************************************************************** -* * -* Paramètres : instr = instruction d'assemblage à compléter. * -* content = flux de données à analyser. * -* pos = position de lecture courante dans ce flux. * -* * -* Description : Lit toutes les valeurs associés aux branchements. * -* * -* Retour : Bilan de l'opération. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static bool g_dalvik_switch_decode_data(GDalvikSwitchInstr *instr, const GBinContent *content, const vmpa2t *pos) -{ - vmpa2t iter; /* Position modifiable */ - int32_t first_key; /* Première clef */ - uint16_t i; /* Boucle de parcours */ - - instr->keys = (int32_t *)calloc(instr->switch_size, sizeof(int32_t)); - instr->targets = (int32_t *)calloc(instr->switch_size, sizeof(int32_t)); - - copy_vmpa(&iter, pos); - - if (G_DALVIK_INSTRUCTION(instr)->ptype == DPO_PACKED_SWITCH) - { - if (!g_binary_content_read_s32(content, &iter, SRE_LITTLE, &first_key)) - goto gdsdd_bad; - - for (i = 0; i < instr->switch_size; i++) - { - instr->keys[i] = first_key + i; - - if (!g_binary_content_read_s32(content, &iter, SRE_LITTLE, &instr->targets[i])) - goto gdsdd_bad; - - } - - } - - else - { - for (i = 0; i < instr->switch_size; i++) - if (!g_binary_content_read_s32(content, &iter, SRE_LITTLE, &instr->keys[i])) - goto gdsdd_bad; - - for (i = 0; i < instr->switch_size; i++) - if (!g_binary_content_read_s32(content, &iter, SRE_LITTLE, &instr->targets[i])) - goto gdsdd_bad; - - } - - return true; - - gdsdd_bad: - - return false; - -} - - -/****************************************************************************** -* * -* Paramètres : instr = instruction d'assemblage à compléter. * -* keys = tableau renseignant les conditions de saut. [OUT] * -* targets = tableau renseignant les sauts relatifs. [OUT] * -* * -* Description : Fournit les données associées à un branchement Dalvik. * -* * -* Retour : Taille des tableaux renseignés. * -* * -* Remarques : - * -* * -******************************************************************************/ - -uint16_t g_dalvik_switch_get_data(GDalvikSwitchInstr *instr, const int32_t **keys, const int32_t **targets) -{ - if (keys != NULL) - *keys = instr->keys; - - if (targets != NULL) - *targets = instr->targets; - - return instr->switch_size; - -} diff --git a/src/arch/dalvik/pseudo/switch.h b/src/arch/dalvik/pseudo/switch.h deleted file mode 100644 index d672f86..0000000 --- a/src/arch/dalvik/pseudo/switch.h +++ /dev/null @@ -1,63 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * switch.h - prototypes pour la prise en charge des instructions spéciales (packed|sparse)switch - * - * Copyright (C) 2011-2017 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * Chrysalide is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Chrysalide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Foobar. If not, see <http://www.gnu.org/licenses/>. - */ - - -#ifndef _ARCH_DALVIK_PSEUDO_SWITCH_H -#define _ARCH_DALVIK_PSEUDO_SWITCH_H - - -#include "../context.h" -#include "../instruction.h" -#include "../processor.h" - - -#include <glib-object.h> - - - -#define G_TYPE_DALVIK_SWITCH_INSTR g_dalvik_switch_instr_get_type() -#define G_DALVIK_SWITCH_INSTR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_DALVIK_SWITCH_INSTR, GDalvikSwitchInstr)) -#define G_IS_DALVIK_SWITCH_INSTR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_DALVIK_SWITCH_INSTR)) -#define G_DALVIK_SWITCH_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_DALVIK_SWITCH, GGDalvikSwitchClass)) -#define G_IS_DALVIK_SWITCH_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_DALVIK_SWITCH)) -#define G_DALVIK_SWITCH_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_DALVIK_SWITCH, GGDalvikSwitchClass)) - - -/* Définition générique d'une instruction d'architecture (instance) */ -typedef struct _GDalvikSwitchInstr GDalvikSwitchInstr; - -/* Définition générique d'une instruction d'architecture (classe) */ -typedef struct _GDalvikSwitchInstrClass GDalvikSwitchInstrClass; - - -/* Indique le type défini pour une pseudo-instruction Dalvik de remplissage. */ -GType g_dalvik_switch_instr_get_type(void); - -/* Crée une pesudo-instruction Dalvik de branchement. */ -GArchInstruction *g_dalvik_switch_instr_new(uint16_t, GDalvikContext *, const GBinContent *, vmpa2t *); - -/* Fournit les données associées à un branchement Dalvik. */ -uint16_t g_dalvik_switch_get_data(GDalvikSwitchInstr *, const int32_t **, const int32_t **); - - - -#endif /* _ARCH_DALVIK_PSEUDO_SWITCH_H */ |