summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2010-12-21 00:51:14 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2010-12-21 00:51:14 (GMT)
commitdbec8e8af5f296f0b95cd9c07e7d96b1a4277137 (patch)
tree4c5a9307bc4f0c168911e86459de5a51baaac226 /src
parent56deaf395c65658102ef0111cfc072d65335331a (diff)
Redefined all existing kinds of Dalvik operands in a proper way.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@203 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src')
-rw-r--r--src/analysis/disass/disassembler.c14
-rw-r--r--src/analysis/disass/output.c39
-rw-r--r--src/analysis/disass/output.h2
-rw-r--r--src/arch/dalvik/Makefile.am5
-rw-r--r--src/arch/dalvik/operand.c1008
-rw-r--r--src/arch/dalvik/operand.h154
-rw-r--r--src/arch/dalvik/operands/Makefile.am20
-rw-r--r--src/arch/dalvik/operands/args.c189
-rw-r--r--src/arch/dalvik/operands/args.h61
-rw-r--r--src/arch/dalvik/operands/pool.c240
-rw-r--r--src/arch/dalvik/operands/pool.h79
-rw-r--r--src/arch/dalvik/operands/register.c212
-rw-r--r--src/arch/dalvik/operands/register.h59
-rw-r--r--src/arch/dalvik/operands/target.c194
-rw-r--r--src/arch/dalvik/operands/target.h61
-rw-r--r--src/arch/dalvik/register.c96
-rw-r--r--src/arch/dalvik/register.h4
-rw-r--r--src/arch/immediate.c2
-rw-r--r--src/arch/instruction.c83
-rw-r--r--src/arch/instruction.h9
20 files changed, 1277 insertions, 1254 deletions
diff --git a/src/analysis/disass/disassembler.c b/src/analysis/disass/disassembler.c
index 4004de9..283914e 100644
--- a/src/analysis/disass/disassembler.c
+++ b/src/analysis/disass/disassembler.c
@@ -58,7 +58,7 @@ typedef struct _GDelayedDisassembly
GDelayedWork parent; /* A laisser en premier */
const GOpenidaBinary *binary; /* Destinataire final */
- const GBinFormat *format; /* Format du binaire représenté*/
+ const GExeFormat *format; /* Format du binaire représenté*/
GBinPart **parts; /* Parties binaires à traiter */
size_t count; /* Nombre de ces parties */
@@ -169,7 +169,7 @@ static GDelayedDisassembly *g_delayed_disassembly_new(const GOpenidaBinary *bina
result = g_object_new(G_TYPE_DELAYED_DISASSEMBLY, NULL);
result->binary = binary;
- result->format = G_BIN_FORMAT(g_openida_binary_get_format(binary));
+ result->format = g_openida_binary_get_format(binary);
result->parts = parts;
result->count = count;
@@ -200,8 +200,7 @@ static void g_delayed_disassembly_process(GDelayedDisassembly *disass, GtkExtSta
size_t routines_count; /* Nombre de ces routines */
guint id; /* Identifiant de statut */
- routines = g_binary_format_get_routines(disass->format, &routines_count);
- qsort(routines, routines_count, sizeof(GBinRoutine *), (__compar_fn_t)g_binary_routine_rcompare);
+ routines = g_binary_format_get_routines(G_BIN_FORMAT(disass->format), &routines_count);
/* Première étape */
@@ -224,6 +223,8 @@ static void g_delayed_disassembly_process(GDelayedDisassembly *disass, GtkExtSta
id = gtk_extended_status_bar_push(statusbar, _("Finding remaining limits..."), true);
+ qsort(routines, routines_count, sizeof(GBinRoutine *), (__compar_fn_t)g_binary_routine_rcompare);
+
limit_all_routines(disass->lines, routines, routines_count, statusbar, id);
gtk_extended_status_bar_remove(statusbar, id);
@@ -232,7 +233,10 @@ static void g_delayed_disassembly_process(GDelayedDisassembly *disass, GtkExtSta
id = gtk_extended_status_bar_push(statusbar, _("Printing disassembled code..."), true);
- print_disassembled_instructions(disass->buffer, disass->instrs, routines, routines_count);
+ qsort(routines, routines_count, sizeof(GBinRoutine *), (__compar_fn_t)g_binary_routine_compare);
+
+ print_disassembled_instructions(disass->buffer, disass->format, disass->instrs,
+ routines, routines_count);
gtk_extended_status_bar_remove(statusbar, id);
diff --git a/src/analysis/disass/output.c b/src/analysis/disass/output.c
index 9c4ba2f..0209a97 100644
--- a/src/analysis/disass/output.c
+++ b/src/analysis/disass/output.c
@@ -24,7 +24,9 @@
#include "output.h"
+#include "../../arch/processor.h"
#include "../../decomp/lang/asm.h"
+#include "../../format/format.h"
@@ -43,17 +45,44 @@
* *
******************************************************************************/
-void print_disassembled_instructions(GCodeBuffer *buffer, const GArchInstruction *instrs, const GBinRoutine **routines, size_t count)
+void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *format, const GArchInstruction *instrs, const GBinRoutine **routines, size_t count)
{
+ GLangOutput *output; /* Modèle de sortie adéquat */
+ GArchProcessor *proc; /* Architecture du binaire */
+ MemoryDataSize msize; /* Taille du bus d'adresses */
+ const bin_t *content; /* Contenu binaire global */
+ const GArchInstruction *iter; /* Boucle de parcours #1 */
+ size_t i; /* Boucle de parcours #2 */
+ vmpa_t iaddr; /* Adresse d'instruction */
+ vmpa_t raddr; /* Adresse de routine */
- /*
- for (iter = disass->instrs;
+ output = g_asm_output_new();
+
+ proc = get_arch_processor_from_format(format);
+ msize = g_arch_processor_get_memory_size(proc);
+
+ content = g_binary_format_get_content(G_BIN_FORMAT(format), NULL);
+
+ for (iter = instrs, i = 0;
iter != NULL;
- iter = g_arch_instruction_get_next_iter(disass->instrs, iter, VMPA_MAX))
+ iter = g_arch_instruction_get_next_iter(instrs, iter, VMPA_MAX))
{
+ /* Ajout des prototypes de fonction */
+ for (; i < count; i++)
+ {
+ g_arch_instruction_get_location(iter, NULL, NULL, &iaddr);
+ raddr = g_binary_routine_get_address(routines[i]);
+
+ if (raddr > iaddr) break;
+ g_binary_routine_print_code(routines[i], output, buffer, false);
+
+ }
+
+ g_arch_instruction_print(iter, buffer, msize, content, ASX_INTEL);
}
- */
+
+ g_object_unref(G_OBJECT(output));
}
diff --git a/src/analysis/disass/output.h b/src/analysis/disass/output.h
index f6c56f3..40e7536 100644
--- a/src/analysis/disass/output.h
+++ b/src/analysis/disass/output.h
@@ -32,7 +32,7 @@
/* Transcrit du code désassemblé en texte humainement lisible. */
-void print_disassembled_instructions(GCodeBuffer *, const GArchInstruction *, const GBinRoutine **, size_t);
+void print_disassembled_instructions(GCodeBuffer *, const GExeFormat *, const GArchInstruction *, const GBinRoutine **, size_t);
diff --git a/src/arch/dalvik/Makefile.am b/src/arch/dalvik/Makefile.am
index fbd041d..e8406b9 100644
--- a/src/arch/dalvik/Makefile.am
+++ b/src/arch/dalvik/Makefile.am
@@ -44,6 +44,9 @@ libarchdalvik_la_SOURCES = \
register.h register.c \
translate.h
+libarchdalvik_la_LIBADD = \
+ operands/libarchdalvikoperands.la
+
libarchdalvik_la_CFLAGS = $(AM_CFLAGS)
@@ -54,4 +57,4 @@ AM_CPPFLAGS =
AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS)
-SUBDIRS =
+SUBDIRS = operands
diff --git a/src/arch/dalvik/operand.c b/src/arch/dalvik/operand.c
index 3227184..f6392b3 100644
--- a/src/arch/dalvik/operand.c
+++ b/src/arch/dalvik/operand.c
@@ -1,6 +1,6 @@
/* OpenIDA - Outil d'analyse de fichiers binaires
- * operand.c - gestion des operandes de l'architecture Dalvik
+ * operand.c - aide à la création d'opérandes Dalvik
*
* Copyright (C) 2010 Cyrille Bagard
*
@@ -28,186 +28,6 @@
#include <stdarg.h>
-#include "register.h"
-#include "../operand-int.h"
-
-
-
-/* ----------------------- COQUILLE VIDE POUR OPERANDE DALVIK ----------------------- */
-
-
-/* Définition d'un opérande de Dalvik (instance) */
-struct _GDalvikOperand
-{
- GArchOperand parent; /* Instance parente */
-
-};
-
-
-/* Définition d'un opérande de Dalvik (classe) */
-struct _GDalvikOperandClass
-{
- GArchOperandClass parent; /* Classe parente */
-
-};
-
-
-/* Initialise la classe des opérandes Dalvik de base. */
-static void g_dalvik_operand_class_init(GDalvikOperandClass *);
-
-/* Initialise une instance d'opérande de base pour Dalvik. */
-static void g_dalvik_operand_init(GDalvikOperand *);
-
-
-
-/* --------------------- OPERANDES VISANT UN REGISTRE DE DALVIK --------------------- */
-
-
-/* Définition d'un opérande visant un registre Dalvik (instance) */
-struct _GDalvikRegisterOperand
-{
- GDalvikOperand parent; /* Instance parente */
-
- GDalvikRegister *reg; /* Registre représenté */
-
-};
-
-
-/* Définition d'un opérande visant un registre Dalvik (classe) */
-struct _GDalvikRegisterOperandClass
-{
- GDalvikOperandClass parent; /* Classe parente */
-
-};
-
-
-/* Initialise la classe des opérandes de registre Dalvik. */
-static void g_dalvik_register_operand_class_init(GDalvikRegisterOperandClass *);
-
-/* Initialise une instance d'opérande de registre Dalvik. */
-static void g_dalvik_register_operand_init(GDalvikRegisterOperand *);
-
-/* Compare un opérande avec un autre. */
-static bool g_dalvik_register_operand_compare(const GDalvikRegisterOperand *, const GDalvikRegisterOperand *);
-
-/* Ajoute du texte simple à un fichier ouvert en écriture. */
-static void g_dalvik_register_operand_add_text(const GDalvikRegisterOperand *, GRenderingOptions *, MainRendering, FILE *);
-
-/* Ajoute à un tampon GLib le contenu de l'instance spécifiée. */
-static void g_dalvik_register_operand_to_buffer(const GDalvikRegisterOperand *, GBufferLine *, GRenderingOptions *);
-
-
-
-/* -------------------- LISTE D'OPERANDES RASSEMBLES EN ARGUMENT -------------------- */
-
-
-
-/* Définition d'un opérande visant une liste d'opérandes Dalvik (instance) */
-struct _GDalvikArgsOperand
-{
- GDalvikOperand parent; /* Instance parente */
-
- GArchOperand **args; /* Liste d'arguments */
- size_t count; /* Taille de cette liste */
-
-};
-
-
-/* Définition d'un opérande visant une liste d'opérandes Dalvik (classe) */
-struct _GDalvikArgsOperandClass
-{
- GDalvikOperandClass parent; /* Classe parente */
-
-};
-
-
-/* Initialise la classe des listes d'opérandes Dalvik. */
-static void g_dalvik_args_operand_class_init(GDalvikArgsOperandClass *);
-
-/* Initialise une instance de liste d'opérandes Dalvik. */
-static void g_dalvik_args_operand_init(GDalvikArgsOperand *);
-
-/* Ajoute du texte simple à un fichier ouvert en écriture. */
-static void g_dalvik_args_operand_add_text(const GDalvikArgsOperand *, GRenderingOptions *, MainRendering, FILE *);
-
-/* Ajoute à un tampon GLib le contenu de l'instance spécifiée. */
-static void g_dalvik_args_operand_to_buffer(const GDalvikArgsOperand *, GBufferLine *, GRenderingOptions *);
-
-
-
-/* ----------------- OPERANDES POINTANT VERS LA TABLE DE CONSTANTES ----------------- */
-
-
-/* Définition d'un opérande visant un élément de table de constantes Dalvik (instance) */
-struct _GDalvikPoolOperand
-{
- GDalvikOperand parent; /* Instance parente */
-
- DalvikPoolType type; /* Type de table visée */
- uint32_t index; /* Indice de l'élément visé */
-
-};
-
-
-/* Définition d'un opérande visant un élément de table de constantes Dalvik (classe) */
-struct _GDalvikPoolOperandClass
-{
- GDalvikOperandClass parent; /* Classe parente */
-
-};
-
-
-/* Initialise la classe des opérandes de constante Dalvik. */
-static void g_dalvik_pool_operand_class_init(GDalvikPoolOperandClass *);
-
-/* Initialise une instance d'opérande de constante Dalvik. */
-static void g_dalvik_pool_operand_init(GDalvikPoolOperand *);
-
-/* Ajoute du texte simple à un fichier ouvert en écriture. */
-static void g_dalvik_pool_operand_add_text(const GDalvikPoolOperand *, GRenderingOptions *, MainRendering, FILE *);
-
-/* Ajoute à un tampon GLib le contenu de l'instance spécifiée. */
-static void g_dalvik_pool_operand_to_buffer(const GDalvikPoolOperand *, GBufferLine *, GRenderingOptions *);
-
-
-
-/* ---------------------- OPERANDES VISANT UNE ADRESSE DE CODE ---------------------- */
-
-
-/* Définition d'un opérande visant une adresse de code Dalvik (instance) */
-struct _GDalvikTargetOperand
-{
- GDalvikOperand parent; /* Instance parente */
-
- GImmOperand *immediate; /* Adresse visée reconstituée */
-
-};
-
-
-/* Définition d'un opérande visant une adresse de code Dalvik (classe) */
-struct _GDalvikTargetOperandClass
-{
- GDalvikOperandClass parent; /* Classe parente */
-
-};
-
-
-/* Initialise la classe des opérandes de ciblage de code Dalvik. */
-static void g_dalvik_target_operand_class_init(GDalvikTargetOperandClass *);
-
-/* Initialise une instance d'opérande de ciblage de code Dalvik. */
-static void g_dalvik_target_operand_init(GDalvikTargetOperand *);
-
-/* Ajoute du texte simple à un fichier ouvert en écriture. */
-static void g_dalvik_target_operand_add_text(const GDalvikTargetOperand *, GRenderingOptions *, MainRendering, FILE *);
-
-/* Ajoute à un tampon GLib le contenu de l'instance spécifiée. */
-static void g_dalvik_target_operand_to_buffer(const GDalvikTargetOperand *, GBufferLine *, GRenderingOptions *);
-
-
-
-/* ------------------------- AIDE A LA CREATION D'OPERANDES ------------------------- */
-
/* Liste de tous les types d'opérandes */
typedef enum _DalvikOperandID
@@ -241,832 +61,6 @@ static bool dalvik_read_fixed_operands(GArchInstruction *, const bin_t *, off_t
-/* ---------------------------------------------------------------------------------- */
-/* COQUILLE VIDE POUR OPERANDE DALVIK */
-/* ---------------------------------------------------------------------------------- */
-
-
-/* Indique le type défini par la GLib pour un opérande de Dalvik. */
-G_DEFINE_TYPE(GDalvikOperand, g_dalvik_operand, G_TYPE_ARCH_OPERAND);
-
-
-/******************************************************************************
-* *
-* Paramètres : klass = classe à initialiser. *
-* *
-* Description : Initialise la classe des opérandes Dalvik de base. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_dalvik_operand_class_init(GDalvikOperandClass *klass)
-{
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : operand = instance à initialiser. *
-* *
-* Description : Initialise une instance d'opérande de base pour Dalvik. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_dalvik_operand_init(GDalvikOperand *operand)
-{
-
-}
-
-
-
-/* ---------------------------------------------------------------------------------- */
-/* OPERANDES VISANT UN REGISTRE DE DALVIK */
-/* ---------------------------------------------------------------------------------- */
-
-
-/* Indique le type défini par la GLib pour un opérande de registre Dalvik. */
-G_DEFINE_TYPE(GDalvikRegisterOperand, g_dalvik_register_operand, G_TYPE_DALVIK_OPERAND);
-
-
-/******************************************************************************
-* *
-* Paramètres : klass = classe à initialiser. *
-* *
-* Description : Initialise la classe des opérandes de registre Dalvik. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_dalvik_register_operand_class_init(GDalvikRegisterOperandClass *klass)
-{
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : operand = instance à initialiser. *
-* *
-* Description : Initialise une instance d'opérande de registre Dalvik. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_dalvik_register_operand_init(GDalvikRegisterOperand *operand)
-{
- GContentExporter *parent; /* Instance parente #1 */
- GArchOperand *arch; /* Instance parente #2 */
-
- parent = G_CONTENT_EXPORTER(operand);
-
- parent->add_text = (add_text_fc)g_dalvik_register_operand_add_text;
- parent->export_buffer = (export_buffer_fc)g_dalvik_register_operand_to_buffer;
-
- arch = G_ARCH_OPERAND(operand);
-
- arch->compare = (operand_compare_fc)g_dalvik_register_operand_compare;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : data = flux de données à analyser. *
-* pos = position courante dans ce flux. [OUT] *
-* len = taille totale des données à analyser. *
-* low = position éventuelle des 4 bits visés. [OUT] *
-* size = taille de l'opérande, et donc du registre. *
-* endian = ordre des bits dans la source. *
-* *
-* Description : Crée un opérande visant un registre Dalvik. *
-* *
-* Retour : Opérande mis en place. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-GArchOperand *g_dalvik_register_operand_new(const bin_t *data, off_t *pos, off_t len, bool *low, MemoryDataSize size, SourceEndian endian)
-{
- GDalvikRegisterOperand *result; /* Structure à retourner */
- uint8_t index8; /* Indice sur 8 bits */
- uint16_t index16; /* Indice sur 16 bits */
- bool test; /* Bilan de lecture */
-
- switch (size)
- {
- case MDS_4_BITS:
- test = read_u4(&index8, data, pos, len, low, endian);
- break;
- case MDS_8_BITS:
- test = read_u8(&index8, data, pos, len, endian);
- break;
- case MDS_16_BITS:
- test = read_u16(&index16, data, pos, len, endian);
- break;
- default:
- test = false;
- break;
- }
-
- if (!test)
- return NULL;
-
- result = g_object_new(G_TYPE_DALVIK_REGISTER_OPERAND, NULL);
-
- switch (size)
- {
- case MDS_4_BITS:
- case MDS_8_BITS:
- result->reg = g_dalvik_register_new(index8);
- break;
- case MDS_16_BITS:
- result->reg = g_dalvik_register_new(index16);
- break;
- default:
- break;
- }
-
- return G_ARCH_OPERAND(result);
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : a = premier opérande à consulter. *
-* b = second opérande à consulter. *
-* *
-* Description : Compare un opérande avec un autre. *
-* *
-* Retour : Bilan de la comparaison. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static bool g_dalvik_register_operand_compare(const GDalvikRegisterOperand *a, const GDalvikRegisterOperand *b)
-{
- return g_dalvik_register_compare(a->reg, b->reg);
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : operand = opérande à transcrire. *
-* options = options de rendu. *
-* rendering = support effectif final des lignes de code. *
-* stream = flux ouvert en écriture. *
-* *
-* Description : Ajoute du texte simple à un fichier ouvert en écriture. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_dalvik_register_operand_add_text(const GDalvikRegisterOperand *operand, GRenderingOptions *options, MainRendering rendering, FILE *stream)
-{
- g_content_exporter_add_text(G_CONTENT_EXPORTER(operand->reg), options, rendering, stream);
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : operand = opérande à transcrire. *
-* buffer = espace où placer ledit contenu. *
-* options = options de rendu. *
-* *
-* Description : Ajoute à un tampon GLib le contenu de l'instance spécifiée. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_dalvik_register_operand_to_buffer(const GDalvikRegisterOperand *operand, GBufferLine *buffer, GRenderingOptions *options)
-{
- g_content_exporter_to_buffer(G_CONTENT_EXPORTER(operand->reg), buffer, options);
-
-}
-
-
-
-/* ---------------------------------------------------------------------------------- */
-/* LISTE D'OPERANDES RASSEMBLES EN ARGUMENT */
-/* ---------------------------------------------------------------------------------- */
-
-
-/* Indique le type défini par la GLib pour une liste d'arguments Dalvik. */
-G_DEFINE_TYPE(GDalvikArgsOperand, g_dalvik_args_operand, G_TYPE_DALVIK_OPERAND);
-
-
-/******************************************************************************
-* *
-* Paramètres : klass = classe à initialiser. *
-* *
-* Description : Initialise la classe des listes d'opérandes Dalvik. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_dalvik_args_operand_class_init(GDalvikArgsOperandClass *klass)
-{
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : operand = instance à initialiser. *
-* *
-* Description : Initialise une instance de liste d'opérandes Dalvik. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_dalvik_args_operand_init(GDalvikArgsOperand *operand)
-{
- GContentExporter *parent; /* Instance parente */
-
- parent = G_CONTENT_EXPORTER(operand);
-
- parent->add_text = (add_text_fc)g_dalvik_args_operand_add_text;
- parent->export_buffer = (export_buffer_fc)g_dalvik_args_operand_to_buffer;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : - *
-* *
-* Description : Crée un réceptacle pour opérandes Dalvik servant d'arguments.*
-* *
-* Retour : Opérande mis en place. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-GArchOperand *g_dalvik_args_operand_new(void)
-{
- GDalvikArgsOperand *result; /* Structure à retourner */
-
- result = g_object_new(G_TYPE_DALVIK_ARGS_OPERAND, NULL);
-
- return G_ARCH_OPERAND(result);
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : operand = opérande à compléter. *
-* arg = nouvel argument pour un appel. *
-* *
-* Description : Ajoute un élément à la liste d'arguments Dalvik. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-void g_dalvik_args_operand_add(GDalvikArgsOperand *operand, GArchOperand *arg)
-{
- operand->args = (GArchOperand **)realloc(operand->args, ++operand->count * sizeof(GArchOperand *));
-
- operand->args[operand->count - 1] = arg;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : operand = opérande à transcrire. *
-* options = options de rendu. *
-* rendering = support effectif final des lignes de code. *
-* stream = flux ouvert en écriture. *
-* *
-* Description : Ajoute du texte simple à un fichier ouvert en écriture. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_dalvik_args_operand_add_text(const GDalvikArgsOperand *operand, GRenderingOptions *options, MainRendering rendering, FILE *stream)
-{
- GContentExporter *exporter; /* Autre vision de l'objet */
- size_t i; /* Boucle de parcours */
-
- exporter = G_CONTENT_EXPORTER(operand);
-
- g_content_exporter_insert_text(exporter, stream, "{", 1, RTT_HOOK);
-
- if (operand->count > 0)
- {
- g_content_exporter_add_text(G_CONTENT_EXPORTER(operand->args[0]),
- options, rendering, stream);
-
- for (i = 1; i < operand->count; i++)
- {
- g_content_exporter_insert_text(exporter, stream, ",", 1, RTT_NONE/* FIXME */);
-
- g_content_exporter_insert_text(exporter, stream, " ", 1, RTT_NONE);
-
- g_content_exporter_add_text(G_CONTENT_EXPORTER(operand->args[i]),
- options, rendering, stream);
-
- }
-
- }
-
- g_content_exporter_insert_text(exporter, stream, "}", 1, RTT_HOOK);
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : operand = opérande à transcrire. *
-* buffer = espace où placer ledit contenu. *
-* options = options de rendu. *
-* *
-* Description : Ajoute à un tampon GLib le contenu de l'instance spécifiée. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_dalvik_args_operand_to_buffer(const GDalvikArgsOperand *operand, GBufferLine *buffer, GRenderingOptions *options)
-{
- GContentExporter *exporter; /* Autre vision de l'objet */
- size_t i; /* Boucle de parcours */
-
- exporter = G_CONTENT_EXPORTER(operand);
-
- g_content_exporter_insert_into_buffer(exporter, buffer, BLC_ASSEMBLY,
- "{", 1, RTT_HOOK);
-
- if (operand->count > 0)
- {
- g_content_exporter_to_buffer(G_CONTENT_EXPORTER(operand->args[0]), buffer, options);
-
- for (i = 1; i < operand->count; i++)
- {
- g_content_exporter_insert_into_buffer(exporter, buffer, BLC_ASSEMBLY,
- ",", 1, RTT_NONE/* FIXME */);
-
- g_content_exporter_insert_into_buffer(exporter, buffer, BLC_ASSEMBLY,
- " ", 1, RTT_NONE);
-
- g_content_exporter_to_buffer(G_CONTENT_EXPORTER(operand->args[i]), buffer, options);
-
- }
-
- }
-
- g_content_exporter_insert_into_buffer(exporter, buffer, BLC_ASSEMBLY,
- "}", 1, RTT_HOOK);
-
-}
-
-
-
-/* ---------------------------------------------------------------------------------- */
-/* OPERANDES POINTANT VERS LA TABLE DE CONSTANTES */
-/* ---------------------------------------------------------------------------------- */
-
-
-/* Indique le type défini par la GLib pour un un élément de table de constantes Dalvik. */
-G_DEFINE_TYPE(GDalvikPoolOperand, g_dalvik_pool_operand, G_TYPE_DALVIK_OPERAND);
-
-
-/******************************************************************************
-* *
-* Paramètres : klass = classe à initialiser. *
-* *
-* Description : Initialise la classe des opérandes de constante Dalvik. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_dalvik_pool_operand_class_init(GDalvikPoolOperandClass *klass)
-{
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : operand = instance à initialiser. *
-* *
-* Description : Initialise une instance d'opérande de constante Dalvik. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_dalvik_pool_operand_init(GDalvikPoolOperand *operand)
-{
- GContentExporter *parent; /* Instance parente */
-
- parent = G_CONTENT_EXPORTER(operand);
-
- parent->add_text = (add_text_fc)g_dalvik_pool_operand_add_text;
- parent->export_buffer = (export_buffer_fc)g_dalvik_pool_operand_to_buffer;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : type = type de table visée avec la référence. *
-* data = flux de données à analyser. *
-* pos = position courante dans ce flux. [OUT] *
-* len = taille totale des données à analyser. *
-* size = taille de l'opérande, et donc du registre. *
-* endian = ordre des bits dans la source. *
-* *
-* Description : Crée un opérande visant un élément constant Dalvik. *
-* *
-* Retour : Opérande mis en place. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-GArchOperand *g_dalvik_pool_operand_new(DalvikPoolType type, const bin_t *data, off_t *pos, off_t len, MemoryDataSize size, SourceEndian endian)
-{
- GDalvikPoolOperand *result; /* Structure à retourner */
- uint8_t index8; /* Indice sur 8 bits */
- uint16_t index16; /* Indice sur 16 bits */
- bool test; /* Bilan de lecture */
-
- switch (size)
- {
- case MDS_8_BITS:
- test = read_u8(&index8, data, pos, len, endian);
- break;
- case MDS_16_BITS:
- test = read_u16(&index16, data, pos, len, endian);
- break;
- default:
- test = false;
- break;
- }
-
- if (!test)
- return NULL;
-
- result = g_object_new(G_TYPE_DALVIK_POOL_OPERAND, NULL);
-
- result->type = type;
- result->index = (size == MDS_8_BITS ? index8 : index16);
-
- return G_ARCH_OPERAND(result);
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : operand = opérande à transcrire. *
-* options = options de rendu. *
-* rendering = support effectif final des lignes de code. *
-* stream = flux ouvert en écriture. *
-* *
-* Description : Ajoute du texte simple à un fichier ouvert en écriture. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_dalvik_pool_operand_add_text(const GDalvikPoolOperand *operand, GRenderingOptions *options, MainRendering rendering, FILE *stream)
-{
- //g_content_exporter_add_text(G_CONTENT_EXPORTER(operand->reg), options, rendering, stream);
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : operand = opérande à transcrire. *
-* buffer = espace où placer ledit contenu. *
-* options = options de rendu. *
-* *
-* Description : Ajoute à un tampon GLib le contenu de l'instance spécifiée. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_dalvik_pool_operand_to_buffer(const GDalvikPoolOperand *operand, GBufferLine *buffer, GRenderingOptions *options)
-{
- GContentExporter *exporter; /* Autre vision de l'opérande */
-
- char value[20]; /* Chaîne à imprimer */
- size_t len; /* Taille de l'élément inséré */
-
-
-
-
- exporter = G_CONTENT_EXPORTER(operand);
-
- switch (operand->type)
- {
- case DPT_NONE:
- g_content_exporter_insert_into_buffer(exporter, buffer, BLC_ASSEMBLY,
- "????", 4, RTT_SECTION);
- break;
- case DPT_STRING:
- g_content_exporter_insert_into_buffer(exporter, buffer, BLC_ASSEMBLY,
- "string", 6, RTT_SECTION);
- break;
- case DPT_TYPE:
- g_content_exporter_insert_into_buffer(exporter, buffer, BLC_ASSEMBLY,
- "type", 4, RTT_SECTION);
- break;
- case DPT_PROTO:
- g_content_exporter_insert_into_buffer(exporter, buffer, BLC_ASSEMBLY,
- "proto", 5, RTT_SECTION);
- break;
- case DPT_FIELD:
- g_content_exporter_insert_into_buffer(exporter, buffer, BLC_ASSEMBLY,
- "field", 5, RTT_SECTION);
- break;
- case DPT_METHOD:
- g_content_exporter_insert_into_buffer(exporter, buffer, BLC_ASSEMBLY,
- "method", 6, RTT_SECTION);
- break;
- }
-
- g_content_exporter_insert_into_buffer(exporter, buffer, BLC_ASSEMBLY,
- "@", 1, RTT_SIGNS);
-
-
- //g_content_exporter_to_buffer(G_CONTENT_EXPORTER(operand->reg), buffer, options);
-
- len = snprintf(value, 20, "%d", operand->index);
- /*
- strcpy(value, "12345");
-
- len = 5;
- */
- g_content_exporter_insert_into_buffer(exporter, buffer, BLC_ASSEMBLY,
- value, len, RTT_IMMEDIATE);
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : operand = opérande à consulter. *
-* *
-* Description : Indique la nature de la table de constantes visée ici. *
-* *
-* Retour : Type de table constantes visée. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-DalvikPoolType g_dalvik_pool_operand_get_pool_type(const GDalvikPoolOperand *operand)
-{
- return operand->type;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : operand = opérande à consulter. *
-* *
-* Description : Indique l'indice de l'élément dans la table de constantes. *
-* *
-* Retour : Indice de l'élément visé dans la table de constantes. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-uint32_t g_dalvik_pool_operand_get_index(const GDalvikPoolOperand *operand)
-{
- return operand->index;
-
-}
-
-
-
-/* ---------------------------------------------------------------------------------- */
-/* OPERANDES VISANT UNE ADRESSE DE CODE */
-/* ---------------------------------------------------------------------------------- */
-
-
-/* Indique le type défini par la GLib pour un opérande de ciblage de code Dalvik. */
-G_DEFINE_TYPE(GDalvikTargetOperand, g_dalvik_target_operand, G_TYPE_DALVIK_OPERAND);
-
-
-/******************************************************************************
-* *
-* Paramètres : klass = classe à initialiser. *
-* *
-* Description : Initialise la classe des opérandes de ciblage de code Dalvik.*
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_dalvik_target_operand_class_init(GDalvikTargetOperandClass *klass)
-{
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : operand = instance à initialiser. *
-* *
-* Description : Initialise une instance d'opérande de ciblage de code Dalvik.*
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_dalvik_target_operand_init(GDalvikTargetOperand *operand)
-{
- GContentExporter *parent; /* Instance parente */
-
- parent = G_CONTENT_EXPORTER(operand);
-
- parent->add_text = (add_text_fc)g_dalvik_target_operand_add_text;
- parent->export_buffer = (export_buffer_fc)g_dalvik_target_operand_to_buffer;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : data = flux de données à analyser. *
-* pos = position courante dans ce flux. [OUT] *
-* len = taille totale des données à analyser. *
-* size = taille de l'opérande. *
-* endian = ordre des bits dans la source. *
-* base = adresse de référence pour le calcul. *
-* *
-* Description : Crée un opérande visant un instruction Dalvik. *
-* *
-* Retour : Opérande mis en place. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-GArchOperand *g_dalvik_target_operand_new(const bin_t *data, off_t *pos, off_t len, MemoryDataSize size, SourceEndian endian, vmpa_t base)
-{
- GDalvikTargetOperand *result; /* Structure à retourner */
- int8_t val8; /* Valeur sur 8 bits */
- int16_t val16; /* Valeur sur 16 bits */
- int32_t val32; /* Valeur sur 32 bits */
- vmpa_t address; /* Adresse finale visée */
-
- switch (size)
- {
- case MDS_8_BITS_SIGNED:
- read_s8(&val8, data, pos, len, endian);
- address = base + val8 * sizeof(uint16_t);
- break;
- case MDS_16_BITS_SIGNED:
- read_s16(&val16, data, pos, len, endian);
- address = base + val16 * sizeof(uint16_t);
- break;
- case MDS_32_BITS_SIGNED:
- read_s32(&val32, data, pos, len, endian);
- address = base + val32 * sizeof(uint16_t);
- break;
- default:
- return NULL;
- break;
- }
-
- result = g_object_new(G_TYPE_DALVIK_TARGET_OPERAND, NULL);
- result->immediate = G_IMM_OPERAND(g_imm_operand_new_from_value(MDS_32_BITS/*FIXME*/, (uint32_t)address/* FIXME */));
-
- return G_ARCH_OPERAND(result);
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : operand = opérande à transcrire. *
-* options = options de rendu. *
-* rendering = support effectif final des lignes de code. *
-* stream = flux ouvert en écriture. *
-* *
-* Description : Ajoute du texte simple à un fichier ouvert en écriture. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_dalvik_target_operand_add_text(const GDalvikTargetOperand *operand, GRenderingOptions *options, MainRendering rendering, FILE *stream)
-{
- g_content_exporter_add_text(G_CONTENT_EXPORTER(operand->immediate), options, rendering, stream);
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : operand = opérande à transcrire. *
-* buffer = espace où placer ledit contenu. *
-* options = options de rendu. *
-* *
-* Description : Ajoute à un tampon GLib le contenu de l'instance spécifiée. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_dalvik_target_operand_to_buffer(const GDalvikTargetOperand *operand, GBufferLine *buffer, GRenderingOptions *options)
-{
- g_content_exporter_to_buffer(G_CONTENT_EXPORTER(operand->immediate), buffer, options);
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : operand = opérande à traiter. *
-* *
-* Description : Fournit l'adresse représentée par une opérande Dalvik. *
-* *
-* Retour : Valeur portée par l'opérande. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-const GImmOperand *g_dalvik_target_operand_get_value(const GDalvikTargetOperand *operand)
-{
- return operand->immediate;
-
-}
-
-
-
-/* ---------------------------------------------------------------------------------- */
-/* AIDE A LA CREATION D'OPERANDES */
-/* ---------------------------------------------------------------------------------- */
-
-
/******************************************************************************
* *
* Paramètres : instr = instruction dont la définition est incomplète. [OUT]*
diff --git a/src/arch/dalvik/operand.h b/src/arch/dalvik/operand.h
index 452bb5e..a596225 100644
--- a/src/arch/dalvik/operand.h
+++ b/src/arch/dalvik/operand.h
@@ -1,6 +1,6 @@
/* OpenIDA - Outil d'analyse de fichiers binaires
- * operand.h - prototypes pour la gestion des operandes de l'architecture Dalvik
+ * operand.h - prototypes pour l'aide à la création d'opérandes Dalvik
*
* Copyright (C) 2010 Cyrille Bagard
*
@@ -25,158 +25,14 @@
#define _ARCH_DALVIK_OPERAND_H
-#include "../immediate.h"
+#include "operands/args.h"
+#include "operands/pool.h"
+#include "operands/register.h"
+#include "operands/target.h"
#include "../instruction.h"
-#include "../../common/endianness.h"
-/* ----------------------- COQUILLE VIDE POUR OPERANDE DALVIK ----------------------- */
-
-
-#define G_TYPE_DALVIK_OPERAND g_dalvik_operand_get_type()
-#define G_DALVIK_OPERAND(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_dalvik_operand_get_type(), GDalvikOperand))
-#define G_IS_DALVIK_OPERAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_dalvik_operand_get_type()))
-#define G_DALVIK_OPERAND_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE((inst), g_dalvik_operand_get_type(), GDalvikOperandIface))
-
-
-/* Définition d'un opérande de Dalvik (instance) */
-typedef struct _GDalvikOperand GDalvikOperand;
-
-/* Définition d'un opérande de Dalvik (classe) */
-typedef struct _GDalvikOperandClass GDalvikOperandClass;
-
-
-/* Indique le type défini par la GLib pour un opérande de Dalvik. */
-GType g_dalvik_operand_get_type(void);
-
-
-
-/* --------------------- OPERANDES VISANT UN REGISTRE DE DALVIK --------------------- */
-
-
-#define G_TYPE_DALVIK_REGISTER_OPERAND g_dalvik_register_operand_get_type()
-#define G_DALVIK_REGISTER_OPERAND(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_dalvik_register_operand_get_type(), GDalvikRegisterOperand))
-#define G_IS_DALVIK_REGISTER_OPERAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_dalvik_register_operand_get_type()))
-#define G_DALVIK_REGISTER_OPERAND_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE((inst), g_dalvik_register_operand_get_type(), GDalvikRegisterOperandIface))
-
-
-/* Définition d'un opérande visant un registre Dalvik (instance) */
-typedef struct _GDalvikRegisterOperand GDalvikRegisterOperand;
-
-/* Définition d'un opérande visant un registre Dalvik (classe) */
-typedef struct _GDalvikRegisterOperandClass GDalvikRegisterOperandClass;
-
-
-/* Indique le type défini par la GLib pour un opérande de registre Dalvik. */
-GType g_dalvik_register_operand_get_type(void);
-
-/* Crée un opérande visant un registre Dalvik. */
-GArchOperand *g_dalvik_register_operand_new(const bin_t *, off_t *, off_t, bool *, MemoryDataSize, SourceEndian);
-
-
-
-/* -------------------- LISTE D'OPERANDES RASSEMBLES EN ARGUMENT -------------------- */
-
-
-#define G_TYPE_DALVIK_ARGS_OPERAND g_dalvik_args_operand_get_type()
-#define G_DALVIK_ARGS_OPERAND(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_dalvik_args_operand_get_type(), GDalvikArgsOperand))
-#define G_IS_DALVIK_ARGS_OPERAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_dalvik_args_operand_get_type()))
-#define G_DALVIK_ARGS_OPERAND_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE((inst), g_dalvik_args_operand_get_type(), GDalvikArgsOperandIface))
-
-
-/* Définition d'un opérande visant une liste d'opérandes Dalvik (instance) */
-typedef struct _GDalvikArgsOperand GDalvikArgsOperand;
-
-/* Définition d'un opérande visant une liste d'opérandes Dalvik (classe) */
-typedef struct _GDalvikArgsOperandClass GDalvikArgsOperandClass;
-
-
-/* Indique le type défini par la GLib pour une liste d'arguments Dalvik. */
-GType g_dalvik_args_operand_get_type(void);
-
-/* Crée un réceptacle pour opérandes Dalvik servant d'arguments. */
-GArchOperand *g_dalvik_args_operand_new(void);
-
-/* Ajoute un élément à la liste d'arguments Dalvik. */
-void g_dalvik_args_operand_add(GDalvikArgsOperand *, GArchOperand *);
-
-
-
-/* ----------------- OPERANDES POINTANT VERS LA TABLE DE CONSTANTES ----------------- */
-
-
-
-#define G_TYPE_DALVIK_POOL_OPERAND g_dalvik_pool_operand_get_type()
-#define G_DALVIK_POOL_OPERAND(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_dalvik_pool_operand_get_type(), GDalvikPoolOperand))
-#define G_IS_DALVIK_POOL_OPERAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_dalvik_pool_operand_get_type()))
-#define G_DALVIK_POOL_OPERAND_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE((inst), g_dalvik_pool_operand_get_type(), GDalvikPoolOperandIface))
-
-
-/* Définition d'un opérande visant un élément de table de constantes Dalvik (instance) */
-typedef struct _GDalvikPoolOperand GDalvikPoolOperand;
-
-/* Définition d'un opérande visant un élément de table de constantes Dalvik (classe) */
-typedef struct _GDalvikPoolOperandClass GDalvikPoolOperandClass;
-
-
-/* Type de table de constantes */
-typedef enum _DalvikPoolType
-{
- DPT_NONE = 0x0,
- DPT_STRING = 0x1,
- DPT_TYPE = 0x2,
- DPT_PROTO = 0x3,
- DPT_FIELD = 0x4,
- DPT_METHOD = 0x5
-
-} DalvikPoolType;
-
-
-/* Indique le type défini par la GLib pour un un élément de table de constantes Dalvik. */
-GType g_dalvik_pool_operand_get_type(void);
-
-/* Crée un opérande visant un élément constant Dalvik. */
-GArchOperand *g_dalvik_pool_operand_new(DalvikPoolType, const bin_t *, off_t *, off_t, MemoryDataSize, SourceEndian);
-
-/* Indique la nature de la table de constantes visée ici. */
-DalvikPoolType g_dalvik_pool_operand_get_pool_type(const GDalvikPoolOperand *);
-
-/* Indique l'indice de l'élément dans la table de constantes. */
-uint32_t g_dalvik_pool_operand_get_index(const GDalvikPoolOperand *);
-
-
-
-/* ---------------------- OPERANDES VISANT UNE ADRESSE DE CODE ---------------------- */
-
-
-#define G_TYPE_DALVIK_TARGET_OPERAND g_dalvik_target_operand_get_type()
-#define G_DALVIK_TARGET_OPERAND(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_dalvik_target_operand_get_type(), GDalvikTargetOperand))
-#define G_IS_DALVIK_TARGET_OPERAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_dalvik_target_operand_get_type()))
-#define G_DALVIK_TARGET_OPERAND_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE((inst), g_dalvik_target_operand_get_type(), GDalvikTargetOperandIface))
-
-
-/* Définition d'un opérande visant une adresse de code Dalvik (instance) */
-typedef struct _GDalvikTargetOperand GDalvikTargetOperand;
-
-/* Définition d'un opérande visant une adresse de code Dalvik (classe) */
-typedef struct _GDalvikTargetOperandClass GDalvikTargetOperandClass;
-
-
-/* Indique le type défini par la GLib pour un opérande de ciblage de code Dalvik. */
-GType g_dalvik_target_operand_get_type(void);
-
-/* Crée un opérande visant un instruction Dalvik. */
-GArchOperand *g_dalvik_target_operand_new(const bin_t *, off_t *, off_t, MemoryDataSize, SourceEndian, vmpa_t);
-
-/* Fournit l'adresse représentée par une opérande Dalvik. */
-const GImmOperand *g_dalvik_target_operand_get_value(const GDalvikTargetOperand *);
-
-
-
-/* ------------------------- AIDE A LA CREATION D'OPERANDES ------------------------- */
-
-
/**
* Cf. les documentations suivantes :
* - http://www.netmite.com/android/mydroid/dalvik/docs/instruction-formats.html
diff --git a/src/arch/dalvik/operands/Makefile.am b/src/arch/dalvik/operands/Makefile.am
new file mode 100644
index 0000000..b6cba3c
--- /dev/null
+++ b/src/arch/dalvik/operands/Makefile.am
@@ -0,0 +1,20 @@
+
+noinst_LTLIBRARIES = libarchdalvikoperands.la
+
+libarchdalvikoperands_la_SOURCES = \
+ args.h args.c \
+ pool.h pool.c \
+ register.h register.c \
+ target.h target.c
+
+libarchdalvik_la_CFLAGS = $(AM_CFLAGS)
+
+
+INCLUDES = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS)
+
+AM_CPPFLAGS =
+
+AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS)
+
+
+SUBDIRS =
diff --git a/src/arch/dalvik/operands/args.c b/src/arch/dalvik/operands/args.c
new file mode 100644
index 0000000..367a718
--- /dev/null
+++ b/src/arch/dalvik/operands/args.c
@@ -0,0 +1,189 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * args.c - listes d'opérandes rassemblées en arguments
+ *
+ * Copyright (C) 2010 Cyrille Bagard
+ *
+ * This file is part of OpenIDA.
+ *
+ * OpenIDA 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.
+ *
+ * OpenIDA 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 "args.h"
+
+
+#include "../../operand-int.h"
+
+
+
+/* Définition d'un opérande visant une liste d'opérandes Dalvik (instance) */
+struct _GDalvikArgsOperand
+{
+ GArchOperand parent; /* Instance parente */
+
+ GArchOperand **args; /* Liste d'arguments */
+ size_t count; /* Taille de cette liste */
+
+};
+
+
+/* Définition d'un opérande visant une liste d'opérandes Dalvik (classe) */
+struct _GDalvikArgsOperandClass
+{
+ GArchOperandClass parent; /* Classe parente */
+
+};
+
+
+/* Initialise la classe des listes d'opérandes Dalvik. */
+static void g_dalvik_args_operand_class_init(GDalvikArgsOperandClass *);
+
+/* Initialise une instance de liste d'opérandes Dalvik. */
+static void g_dalvik_args_operand_init(GDalvikArgsOperand *);
+
+/* Traduit un opérande en version humainement lisible. */
+static void g_dalvik_args_operand_print(const GDalvikArgsOperand *, GBufferLine *, AsmSyntax);
+
+
+
+/* Indique le type défini par la GLib pour une liste d'arguments Dalvik. */
+G_DEFINE_TYPE(GDalvikArgsOperand, g_dalvik_args_operand, G_TYPE_ARCH_OPERAND);
+
+
+/******************************************************************************
+* *
+* Paramètres : klass = classe à initialiser. *
+* *
+* Description : Initialise la classe des listes d'opérandes Dalvik. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_dalvik_args_operand_class_init(GDalvikArgsOperandClass *klass)
+{
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : operand = instance à initialiser. *
+* *
+* Description : Initialise une instance de liste d'opérandes Dalvik. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_dalvik_args_operand_init(GDalvikArgsOperand *operand)
+{
+ GArchOperand *parent; /* Instance parente */
+
+ parent = G_ARCH_OPERAND(operand);
+
+ parent->print = (operand_print_fc)g_dalvik_args_operand_print;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : - *
+* *
+* Description : Crée un réceptacle pour opérandes Dalvik servant d'arguments.*
+* *
+* Retour : Opérande mis en place. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GArchOperand *g_dalvik_args_operand_new(void)
+{
+ GDalvikArgsOperand *result; /* Structure à retourner */
+
+ result = g_object_new(G_TYPE_DALVIK_ARGS_OPERAND, NULL);
+
+ return G_ARCH_OPERAND(result);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : operand = opérande à traiter. *
+* line = ligne tampon où imprimer l'opérande donné. *
+* syntax = type de représentation demandée. *
+* *
+* Description : Traduit un opérande en version humainement lisible. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_dalvik_args_operand_print(const GDalvikArgsOperand *operand, GBufferLine *line, AsmSyntax syntax)
+{
+ size_t i; /* Boucle de parcours */
+
+ g_buffer_line_insert_text(line, BLC_ASSEMBLY, "{", 1, RTT_HOOK);
+
+ if (operand->count > 0)
+ {
+ g_arch_operand_print(operand->args[0], line, syntax);
+
+ for (i = 1; i < operand->count; i++)
+ {
+ g_buffer_line_insert_text(line, BLC_ASSEMBLY, ",", 1, RTT_PUNCT);
+ g_buffer_line_insert_text(line, BLC_ASSEMBLY, " ", 1, RTT_RAW);
+
+ g_arch_operand_print(operand->args[i], line, syntax);
+
+ }
+
+ }
+
+ g_buffer_line_insert_text(line, BLC_ASSEMBLY, "}", 1, RTT_HOOK);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : operand = opérande à compléter. *
+* arg = nouvel argument pour un appel. *
+* *
+* Description : Ajoute un élément à la liste d'arguments Dalvik. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_dalvik_args_operand_add(GDalvikArgsOperand *operand, GArchOperand *arg)
+{
+ operand->args = (GArchOperand **)realloc(operand->args,
+ ++operand->count * sizeof(GArchOperand *));
+
+ operand->args[operand->count - 1] = arg;
+
+}
diff --git a/src/arch/dalvik/operands/args.h b/src/arch/dalvik/operands/args.h
new file mode 100644
index 0000000..87ec9ae
--- /dev/null
+++ b/src/arch/dalvik/operands/args.h
@@ -0,0 +1,61 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * args.h - prototypes pour les listes d'opérandes rassemblées en arguments
+ *
+ * Copyright (C) 2010 Cyrille Bagard
+ *
+ * This file is part of OpenIDA.
+ *
+ * OpenIDA 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.
+ *
+ * OpenIDA 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_OPERANDS_ARGS_H
+#define _ARCH_DALVIK_OPERANDS_ARGS_H
+
+
+#include <glib-object.h>
+
+
+#include "../../operand.h"
+
+
+
+#define G_TYPE_DALVIK_ARGS_OPERAND g_dalvik_args_operand_get_type()
+#define G_DALVIK_ARGS_OPERAND(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_dalvik_args_operand_get_type(), GDalvikArgsOperand))
+#define G_IS_DALVIK_ARGS_OPERAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_dalvik_args_operand_get_type()))
+#define G_DALVIK_ARGS_OPERAND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_DALVIK_ARGS_OPERAND, GDalvikArgsOperandClass))
+#define G_IS_DALVIK_ARGS_OPERAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_DALVIK_ARGS_OPERAND))
+#define G_DALVIK_ARGS_OPERAND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_DALVIK_ARGS_OPERAND, GDalvikArgsOperandClass))
+
+
+/* Définition d'un opérande visant une liste d'opérandes Dalvik (instance) */
+typedef struct _GDalvikArgsOperand GDalvikArgsOperand;
+
+/* Définition d'un opérande visant une liste d'opérandes Dalvik (classe) */
+typedef struct _GDalvikArgsOperandClass GDalvikArgsOperandClass;
+
+
+/* Indique le type défini par la GLib pour une liste d'arguments Dalvik. */
+GType g_dalvik_args_operand_get_type(void);
+
+/* Crée un réceptacle pour opérandes Dalvik servant d'arguments. */
+GArchOperand *g_dalvik_args_operand_new(void);
+
+/* Ajoute un élément à la liste d'arguments Dalvik. */
+void g_dalvik_args_operand_add(GDalvikArgsOperand *, GArchOperand *);
+
+
+
+#endif /* _ARCH_DALVIK_OPERANDS_ARGS_H */
diff --git a/src/arch/dalvik/operands/pool.c b/src/arch/dalvik/operands/pool.c
new file mode 100644
index 0000000..a7b264b
--- /dev/null
+++ b/src/arch/dalvik/operands/pool.c
@@ -0,0 +1,240 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * pool.c - opérandes pointant vers la table des constantes
+ *
+ * Copyright (C) 2010 Cyrille Bagard
+ *
+ * This file is part of OpenIDA.
+ *
+ * OpenIDA 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.
+ *
+ * OpenIDA 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 "pool.h"
+
+
+#include "../../operand-int.h"
+
+
+
+/* Définition d'un opérande visant un élément de table de constantes Dalvik (instance) */
+struct _GDalvikPoolOperand
+{
+ GArchOperand parent; /* Instance parente */
+
+ DalvikPoolType type; /* Type de table visée */
+ uint32_t index; /* Indice de l'élément visé */
+
+};
+
+
+/* Définition d'un opérande visant un élément de table de constantes Dalvik (classe) */
+struct _GDalvikPoolOperandClass
+{
+ GArchOperandClass parent; /* Classe parente */
+
+};
+
+
+/* Initialise la classe des opérandes de constante Dalvik. */
+static void g_dalvik_pool_operand_class_init(GDalvikPoolOperandClass *);
+
+/* Initialise une instance d'opérande de constante Dalvik. */
+static void g_dalvik_pool_operand_init(GDalvikPoolOperand *);
+
+/* Traduit un opérande en version humainement lisible. */
+static void g_dalvik_pool_operand_print(const GDalvikPoolOperand *, GBufferLine *, AsmSyntax);
+
+
+
+/* Indique le type défini par la GLib pour un un élément de table de constantes Dalvik. */
+G_DEFINE_TYPE(GDalvikPoolOperand, g_dalvik_pool_operand, G_TYPE_ARCH_OPERAND);
+
+
+/******************************************************************************
+* *
+* Paramètres : klass = classe à initialiser. *
+* *
+* Description : Initialise la classe des opérandes de constante Dalvik. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_dalvik_pool_operand_class_init(GDalvikPoolOperandClass *klass)
+{
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : operand = instance à initialiser. *
+* *
+* Description : Initialise une instance d'opérande de constante Dalvik. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_dalvik_pool_operand_init(GDalvikPoolOperand *operand)
+{
+ GArchOperand *parent; /* Instance parente */
+
+ parent = G_ARCH_OPERAND(operand);
+
+ parent->print = (operand_print_fc)g_dalvik_pool_operand_print;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : type = type de table visée avec la référence. *
+* data = flux de données à analyser. *
+* pos = position courante dans ce flux. [OUT] *
+* len = taille totale des données à analyser. *
+* size = taille de l'opérande, et donc du registre. *
+* endian = ordre des bits dans la source. *
+* *
+* Description : Crée un opérande visant un élément constant Dalvik. *
+* *
+* Retour : Opérande mis en place. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GArchOperand *g_dalvik_pool_operand_new(DalvikPoolType type, const bin_t *data, off_t *pos, off_t len, MemoryDataSize size, SourceEndian endian)
+{
+ GDalvikPoolOperand *result; /* Structure à retourner */
+ uint8_t index8; /* Indice sur 8 bits */
+ uint16_t index16; /* Indice sur 16 bits */
+ bool test; /* Bilan de lecture */
+
+ switch (size)
+ {
+ case MDS_8_BITS:
+ test = read_u8(&index8, data, pos, len, endian);
+ break;
+ case MDS_16_BITS:
+ test = read_u16(&index16, data, pos, len, endian);
+ break;
+ default:
+ test = false;
+ break;
+ }
+
+ if (!test)
+ return NULL;
+
+ result = g_object_new(G_TYPE_DALVIK_POOL_OPERAND, NULL);
+
+ result->type = type;
+ result->index = (size == MDS_8_BITS ? index8 : index16);
+
+ return G_ARCH_OPERAND(result);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : operand = opérande à traiter. *
+* line = ligne tampon où imprimer l'opérande donné. *
+* syntax = type de représentation demandée. *
+* *
+* Description : Traduit un opérande en version humainement lisible. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_dalvik_pool_operand_print(const GDalvikPoolOperand *operand, GBufferLine *line, AsmSyntax syntax)
+{
+ char value[20]; /* Chaîne à imprimer */
+ size_t len; /* Taille de l'élément inséré */
+
+ switch (operand->type)
+ {
+ case DPT_NONE:
+ g_buffer_line_insert_text(line, BLC_ASSEMBLY, "????", 4, RTT_SECTION);
+ break;
+ case DPT_STRING:
+ g_buffer_line_insert_text(line, BLC_ASSEMBLY, "string", 6, RTT_SECTION);
+ break;
+ case DPT_TYPE:
+ g_buffer_line_insert_text(line, BLC_ASSEMBLY, "type", 4, RTT_SECTION);
+ break;
+ case DPT_PROTO:
+ g_buffer_line_insert_text(line, BLC_ASSEMBLY, "proto", 5, RTT_SECTION);
+ break;
+ case DPT_FIELD:
+ g_buffer_line_insert_text(line, BLC_ASSEMBLY, "field", 5, RTT_SECTION);
+ break;
+ case DPT_METHOD:
+ g_buffer_line_insert_text(line, BLC_ASSEMBLY, "method", 6, RTT_SECTION);
+ break;
+ }
+
+ g_buffer_line_insert_text(line, BLC_ASSEMBLY, "@", 1, RTT_SIGNS);
+
+ len = snprintf(value, 20, "%d", operand->index);
+ g_buffer_line_insert_text(line, BLC_ASSEMBLY, value, len, RTT_IMMEDIATE);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : operand = opérande à consulter. *
+* *
+* Description : Indique la nature de la table de constantes visée ici. *
+* *
+* Retour : Type de table constantes visée. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+DalvikPoolType g_dalvik_pool_operand_get_pool_type(const GDalvikPoolOperand *operand)
+{
+ return operand->type;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : operand = opérande à consulter. *
+* *
+* Description : Indique l'indice de l'élément dans la table de constantes. *
+* *
+* Retour : Indice de l'élément visé dans la table de constantes. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+uint32_t g_dalvik_pool_operand_get_index(const GDalvikPoolOperand *operand)
+{
+ return operand->index;
+
+}
diff --git a/src/arch/dalvik/operands/pool.h b/src/arch/dalvik/operands/pool.h
new file mode 100644
index 0000000..b74692d
--- /dev/null
+++ b/src/arch/dalvik/operands/pool.h
@@ -0,0 +1,79 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * pool.h - prototypes pour les opérandes pointant vers la table des constantes
+ *
+ * Copyright (C) 2010 Cyrille Bagard
+ *
+ * This file is part of OpenIDA.
+ *
+ * OpenIDA 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.
+ *
+ * OpenIDA 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_OPERANDS_POOL_H
+#define _ARCH_DALVIK_OPERANDS_POOL_H
+
+
+#include <glib-object.h>
+#include <stdint.h>
+
+
+#include "../../operand.h"
+#include "../../../common/endianness.h"
+
+
+
+#define G_TYPE_DALVIK_POOL_OPERAND g_dalvik_pool_operand_get_type()
+#define G_DALVIK_POOL_OPERAND(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_dalvik_pool_operand_get_type(), GDalvikPoolOperand))
+#define G_IS_DALVIK_POOL_OPERAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_dalvik_pool_operand_get_type()))
+#define G_DALVIK_POOL_OPERAND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_DALVIK_POOL_OPERAND, GDalvikPoolOperandClass))
+#define G_IS_DALVIK_POOL_OPERAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_DALVIK_POOL_OPERAND))
+#define G_DALVIK_POOL_OPERAND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_DALVIK_POOL_OPERAND, GDalvikPoolOperandClass))
+
+
+/* Définition d'un opérande visant un élément de table de constantes Dalvik (instance) */
+typedef struct _GDalvikPoolOperand GDalvikPoolOperand;
+
+/* Définition d'un opérande visant un élément de table de constantes Dalvik (classe) */
+typedef struct _GDalvikPoolOperandClass GDalvikPoolOperandClass;
+
+
+/* Type de table de constantes */
+typedef enum _DalvikPoolType
+{
+ DPT_NONE = 0x0,
+ DPT_STRING = 0x1,
+ DPT_TYPE = 0x2,
+ DPT_PROTO = 0x3,
+ DPT_FIELD = 0x4,
+ DPT_METHOD = 0x5
+
+} DalvikPoolType;
+
+
+/* Indique le type défini par la GLib pour un un élément de table de constantes Dalvik. */
+GType g_dalvik_pool_operand_get_type(void);
+
+/* Crée un opérande visant un élément constant Dalvik. */
+GArchOperand *g_dalvik_pool_operand_new(DalvikPoolType, const bin_t *, off_t *, off_t, MemoryDataSize, SourceEndian);
+
+/* Indique la nature de la table de constantes visée ici. */
+DalvikPoolType g_dalvik_pool_operand_get_pool_type(const GDalvikPoolOperand *);
+
+/* Indique l'indice de l'élément dans la table de constantes. */
+uint32_t g_dalvik_pool_operand_get_index(const GDalvikPoolOperand *);
+
+
+
+#endif /* _ARCH_DALVIK_OPERANDS_POOL_H */
diff --git a/src/arch/dalvik/operands/register.c b/src/arch/dalvik/operands/register.c
new file mode 100644
index 0000000..22c210e
--- /dev/null
+++ b/src/arch/dalvik/operands/register.c
@@ -0,0 +1,212 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * register.c - opérandes visant un registre Dalvik
+ *
+ * Copyright (C) 2010 Cyrille Bagard
+ *
+ * This file is part of OpenIDA.
+ *
+ * OpenIDA 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.
+ *
+ * OpenIDA 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 "register.h"
+
+
+#include "../register.h"
+#include "../../operand-int.h"
+
+
+
+/* Définition d'un opérande visant un registre Dalvik (instance) */
+struct _GDalvikRegisterOperand
+{
+ GArchOperand parent; /* Instance parente */
+
+ GDalvikRegister *reg; /* Registre représenté */
+
+};
+
+
+/* Définition d'un opérande visant un registre Dalvik (classe) */
+struct _GDalvikRegisterOperandClass
+{
+ GArchOperandClass parent; /* Classe parente */
+
+};
+
+
+/* Initialise la classe des opérandes de registre Dalvik. */
+static void g_dalvik_register_operand_class_init(GDalvikRegisterOperandClass *);
+
+/* Initialise une instance d'opérande de registre Dalvik. */
+static void g_dalvik_register_operand_init(GDalvikRegisterOperand *);
+
+/* Compare un opérande avec un autre. */
+static bool g_dalvik_register_operand_compare(const GDalvikRegisterOperand *, const GDalvikRegisterOperand *);
+
+/* Traduit un opérande en version humainement lisible. */
+static void g_dalvik_register_operand_print(const GDalvikRegisterOperand *, GBufferLine *, AsmSyntax);
+
+
+
+
+/* Indique le type défini par la GLib pour un opérande de registre Dalvik. */
+G_DEFINE_TYPE(GDalvikRegisterOperand, g_dalvik_register_operand, G_TYPE_ARCH_OPERAND);
+
+
+/******************************************************************************
+* *
+* Paramètres : klass = classe à initialiser. *
+* *
+* Description : Initialise la classe des opérandes de registre Dalvik. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_dalvik_register_operand_class_init(GDalvikRegisterOperandClass *klass)
+{
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : operand = instance à initialiser. *
+* *
+* Description : Initialise une instance d'opérande de registre Dalvik. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_dalvik_register_operand_init(GDalvikRegisterOperand *operand)
+{
+ GArchOperand *parent; /* Instance parente */
+
+ parent = G_ARCH_OPERAND(operand);
+
+ parent->compare = (operand_compare_fc)g_dalvik_register_operand_compare;
+ parent->print = (operand_print_fc)g_dalvik_register_operand_print;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : data = flux de données à analyser. *
+* pos = position courante dans ce flux. [OUT] *
+* len = taille totale des données à analyser. *
+* low = position éventuelle des 4 bits visés. [OUT] *
+* size = taille de l'opérande, et donc du registre. *
+* endian = ordre des bits dans la source. *
+* *
+* Description : Crée un opérande visant un registre Dalvik. *
+* *
+* Retour : Opérande mis en place. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GArchOperand *g_dalvik_register_operand_new(const bin_t *data, off_t *pos, off_t len, bool *low, MemoryDataSize size, SourceEndian endian)
+{
+ GDalvikRegisterOperand *result; /* Structure à retourner */
+ uint8_t index8; /* Indice sur 8 bits */
+ uint16_t index16; /* Indice sur 16 bits */
+ bool test; /* Bilan de lecture */
+
+ switch (size)
+ {
+ case MDS_4_BITS:
+ test = read_u4(&index8, data, pos, len, low, endian);
+ break;
+ case MDS_8_BITS:
+ test = read_u8(&index8, data, pos, len, endian);
+ break;
+ case MDS_16_BITS:
+ test = read_u16(&index16, data, pos, len, endian);
+ break;
+ default:
+ test = false;
+ break;
+ }
+
+ if (!test)
+ return NULL;
+
+ result = g_object_new(G_TYPE_DALVIK_REGISTER_OPERAND, NULL);
+
+ switch (size)
+ {
+ case MDS_4_BITS:
+ case MDS_8_BITS:
+ result->reg = g_dalvik_register_new(index8);
+ break;
+ case MDS_16_BITS:
+ result->reg = g_dalvik_register_new(index16);
+ break;
+ default:
+ break;
+ }
+
+ return G_ARCH_OPERAND(result);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : a = premier opérande à consulter. *
+* b = second opérande à consulter. *
+* *
+* Description : Compare un opérande avec un autre. *
+* *
+* Retour : Bilan de la comparaison. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static bool g_dalvik_register_operand_compare(const GDalvikRegisterOperand *a, const GDalvikRegisterOperand *b)
+{
+ return g_dalvik_register_compare(a->reg, b->reg);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : operand = opérande à traiter. *
+* line = ligne tampon où imprimer l'opérande donné. *
+* syntax = type de représentation demandée. *
+* *
+* Description : Traduit un opérande en version humainement lisible. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_dalvik_register_operand_print(const GDalvikRegisterOperand *operand, GBufferLine *line, AsmSyntax syntax)
+{
+ g_dalvik_pool_operand_print(operand->reg, line, syntax);
+
+}
diff --git a/src/arch/dalvik/operands/register.h b/src/arch/dalvik/operands/register.h
new file mode 100644
index 0000000..00b05fb
--- /dev/null
+++ b/src/arch/dalvik/operands/register.h
@@ -0,0 +1,59 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * register.h - prototypes pour les opérandes visant un registre Dalvik
+ *
+ * Copyright (C) 2010 Cyrille Bagard
+ *
+ * This file is part of OpenIDA.
+ *
+ * OpenIDA 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.
+ *
+ * OpenIDA 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_OPERANDS_REGISTER_H
+#define _ARCH_DALVIK_OPERANDS_REGISTER_H
+
+
+#include <glib-object.h>
+
+
+#include "../../operand.h"
+#include "../../../common/endianness.h"
+
+
+
+#define G_TYPE_DALVIK_REGISTER_OPERAND g_dalvik_register_operand_get_type()
+#define G_DALVIK_REGISTER_OPERAND(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_dalvik_register_operand_get_type(), GDalvikRegisterOperand))
+#define G_IS_DALVIK_REGISTER_OPERAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_dalvik_register_operand_get_type()))
+#define G_DALVIK_REGISTER_OPERAND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_DALVIK_REGISTER_OPERAND, GDalvikRegisterOperandClass))
+#define G_IS_DALVIK_REGISTER_OPERAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_DALVIK_REGISTER_OPERAND))
+#define G_DALVIK_REGISTER_OPERAND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_DALVIK_REGISTER_OPERAND, GDalvikRegisterOperandClass))
+
+
+/* Définition d'un opérande visant un registre Dalvik (instance) */
+typedef struct _GDalvikRegisterOperand GDalvikRegisterOperand;
+
+/* Définition d'un opérande visant un registre Dalvik (classe) */
+typedef struct _GDalvikRegisterOperandClass GDalvikRegisterOperandClass;
+
+
+/* Indique le type défini par la GLib pour un opérande de registre Dalvik. */
+GType g_dalvik_register_operand_get_type(void);
+
+/* Crée un opérande visant un registre Dalvik. */
+GArchOperand *g_dalvik_register_operand_new(const bin_t *, off_t *, off_t, bool *, MemoryDataSize, SourceEndian);
+
+
+
+#endif /* _ARCH_DALVIK_OPERANDS_REGISTER_H */
diff --git a/src/arch/dalvik/operands/target.c b/src/arch/dalvik/operands/target.c
new file mode 100644
index 0000000..9b82ba2
--- /dev/null
+++ b/src/arch/dalvik/operands/target.c
@@ -0,0 +1,194 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * target.c - opérandes visant une adresse de code
+ *
+ * Copyright (C) 2010 Cyrille Bagard
+ *
+ * This file is part of OpenIDA.
+ *
+ * OpenIDA 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.
+ *
+ * OpenIDA 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 "target.h"
+
+
+#include "../../operand-int.h"
+
+
+
+/* Définition d'un opérande visant une adresse de code Dalvik (instance) */
+struct _GDalvikTargetOperand
+{
+ GArchOperand parent; /* Instance parente */
+
+ GImmOperand *immediate; /* Adresse visée reconstituée */
+
+};
+
+
+/* Définition d'un opérande visant une adresse de code Dalvik (classe) */
+struct _GDalvikTargetOperandClass
+{
+ GArchOperandClass parent; /* Classe parente */
+
+};
+
+
+/* Initialise la classe des opérandes de ciblage de code Dalvik. */
+static void g_dalvik_target_operand_class_init(GDalvikTargetOperandClass *);
+
+/* Initialise une instance d'opérande de ciblage de code Dalvik. */
+static void g_dalvik_target_operand_init(GDalvikTargetOperand *);
+
+/* Traduit un opérande en version humainement lisible. */
+static void g_dalvik_target_operand_print(const GDalvikTargetOperand *, GBufferLine *, AsmSyntax);
+
+
+
+/* Indique le type défini par la GLib pour un opérande de ciblage de code Dalvik. */
+G_DEFINE_TYPE(GDalvikTargetOperand, g_dalvik_target_operand, G_TYPE_ARCH_OPERAND);
+
+
+/******************************************************************************
+* *
+* Paramètres : klass = classe à initialiser. *
+* *
+* Description : Initialise la classe des opérandes de ciblage de code Dalvik.*
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_dalvik_target_operand_class_init(GDalvikTargetOperandClass *klass)
+{
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : operand = instance à initialiser. *
+* *
+* Description : Initialise une instance d'opérande de ciblage de code Dalvik.*
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_dalvik_target_operand_init(GDalvikTargetOperand *operand)
+{
+ GArchOperand *parent; /* Instance parente */
+
+ parent = G_ARCH_OPERAND(operand);
+
+ parent->print = (operand_print_fc)g_dalvik_target_operand_print;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : data = flux de données à analyser. *
+* pos = position courante dans ce flux. [OUT] *
+* len = taille totale des données à analyser. *
+* size = taille de l'opérande. *
+* endian = ordre des bits dans la source. *
+* base = adresse de référence pour le calcul. *
+* *
+* Description : Crée un opérande visant un instruction Dalvik. *
+* *
+* Retour : Opérande mis en place. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GArchOperand *g_dalvik_target_operand_new(const bin_t *data, off_t *pos, off_t len, MemoryDataSize size, SourceEndian endian, vmpa_t base)
+{
+ GDalvikTargetOperand *result; /* Structure à retourner */
+ int8_t val8; /* Valeur sur 8 bits */
+ int16_t val16; /* Valeur sur 16 bits */
+ int32_t val32; /* Valeur sur 32 bits */
+ vmpa_t address; /* Adresse finale visée */
+
+ switch (size)
+ {
+ case MDS_8_BITS_SIGNED:
+ read_s8(&val8, data, pos, len, endian);
+ address = base + val8 * sizeof(uint16_t);
+ break;
+ case MDS_16_BITS_SIGNED:
+ read_s16(&val16, data, pos, len, endian);
+ address = base + val16 * sizeof(uint16_t);
+ break;
+ case MDS_32_BITS_SIGNED:
+ read_s32(&val32, data, pos, len, endian);
+ address = base + val32 * sizeof(uint16_t);
+ break;
+ default:
+ return NULL;
+ break;
+ }
+
+ result = g_object_new(G_TYPE_DALVIK_TARGET_OPERAND, NULL);
+ result->immediate = G_IMM_OPERAND(g_imm_operand_new_from_value(MDS_32_BITS/*FIXME*/, (uint32_t)address/* FIXME */));
+
+ return G_ARCH_OPERAND(result);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : operand = opérande à traiter. *
+* line = ligne tampon où imprimer l'opérande donné. *
+* syntax = type de représentation demandée. *
+* *
+* Description : Traduit un opérande en version humainement lisible. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_dalvik_target_operand_print(const GDalvikTargetOperand *operand, GBufferLine *line, AsmSyntax syntax)
+{
+ g_arch_operand_print(G_ARCH_OPERAND(operand->immediate), line, syntax);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : operand = opérande à traiter. *
+* *
+* Description : Fournit l'adresse représentée par une opérande Dalvik. *
+* *
+* Retour : Valeur portée par l'opérande. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+const GImmOperand *g_dalvik_target_operand_get_value(const GDalvikTargetOperand *operand)
+{
+ return operand->immediate;
+
+}
diff --git a/src/arch/dalvik/operands/target.h b/src/arch/dalvik/operands/target.h
new file mode 100644
index 0000000..9b1641c
--- /dev/null
+++ b/src/arch/dalvik/operands/target.h
@@ -0,0 +1,61 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * target.h - prototypes pour les opérandes visant une adresse de code
+ *
+ * Copyright (C) 2010 Cyrille Bagard
+ *
+ * This file is part of OpenIDA.
+ *
+ * OpenIDA 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.
+ *
+ * OpenIDA 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_OPERANDS_TARGET_H
+#define _ARCH_DALVIK_OPERANDS_TARGET_H
+
+
+#include <glib-object.h>
+
+
+#include "../../immediate.h"
+
+
+
+#define G_TYPE_DALVIK_TARGET_OPERAND g_dalvik_target_operand_get_type()
+#define G_DALVIK_TARGET_OPERAND(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_dalvik_target_operand_get_type(), GDalvikTargetOperand))
+#define G_IS_DALVIK_TARGET_OPERAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_dalvik_target_operand_get_type()))
+#define G_DALVIK_TARGET_OPERAND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_DALVIK_TARGET_OPERAND, GDalvikTargetOperandClass))
+#define G_IS_DALVIK_TARGET_OPERAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_DALVIK_TARGET_OPERAND))
+#define G_DALVIK_TARGET_OPERAND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_DALVIK_TARGET_OPERAND, GDalvikTargetOperandClass))
+
+
+/* Définition d'un opérande visant une adresse de code Dalvik (instance) */
+typedef struct _GDalvikTargetOperand GDalvikTargetOperand;
+
+/* Définition d'un opérande visant une adresse de code Dalvik (classe) */
+typedef struct _GDalvikTargetOperandClass GDalvikTargetOperandClass;
+
+
+/* Indique le type défini par la GLib pour un opérande de ciblage de code Dalvik. */
+GType g_dalvik_target_operand_get_type(void);
+
+/* Crée un opérande visant un instruction Dalvik. */
+GArchOperand *g_dalvik_target_operand_new(const bin_t *, off_t *, off_t, MemoryDataSize, SourceEndian, vmpa_t);
+
+/* Fournit l'adresse représentée par une opérande Dalvik. */
+const GImmOperand *g_dalvik_target_operand_get_value(const GDalvikTargetOperand *);
+
+
+
+#endif /* _ARCH_DALVIK_OPERANDS_TARGET_H */
diff --git a/src/arch/dalvik/register.c b/src/arch/dalvik/register.c
index dd5a512..cf926d2 100644
--- a/src/arch/dalvik/register.c
+++ b/src/arch/dalvik/register.c
@@ -52,14 +52,11 @@ struct _GDalvikRegisterClass
#define MAX_REGNAME_LEN 8
-/* Construit la chaîne de caractères correspondant à l'opérande. */
-static void g_dalvik_register_to_string(const GDalvikRegister *, AsmSyntax, char [MAX_REGNAME_LEN], size_t *);
+/* Initialise la classe des registres Dalvik. */
+static void g_dalvik_register_class_init(GDalvikRegisterClass *);
-/* Ajoute du texte simple à un fichier ouvert en écriture. */
-static void g_dalvik_register_add_text(const GDalvikRegister *, GRenderingOptions *, MainRendering, FILE *);
-
-/* Ajoute à un tampon GLib le contenu de l'instance spécifiée. */
-static void g_dalvik_register_to_buffer(const GDalvikRegister *, GBufferLine *, GRenderingOptions *);
+/* Initialise une instance de registre Dalvik. */
+static void g_dalvik_register_init(GDalvikRegister *);
@@ -71,7 +68,7 @@ G_DEFINE_TYPE(GDalvikRegister, g_dalvik_register, G_TYPE_CONTENT_EXPORTER);
* *
* Paramètres : klass = classe à initialiser. *
* *
-* Description : Initialise la classe des lignes de représentation. *
+* Description : Initialise la classe des registres Dalvik. *
* *
* Retour : - *
* *
@@ -89,7 +86,7 @@ static void g_dalvik_register_class_init(GDalvikRegisterClass *klass)
* *
* Paramètres : reg = instance à initialiser. *
* *
-* Description : Initialise une instance de ligne de représentation. *
+* Description : Initialise une instance de registre Dalvik. *
* *
* Retour : - *
* *
@@ -99,12 +96,6 @@ static void g_dalvik_register_class_init(GDalvikRegisterClass *klass)
static void g_dalvik_register_init(GDalvikRegister *reg)
{
- GContentExporter *parent; /* Instance parente */
-
- parent = G_CONTENT_EXPORTER(reg);
-
- parent->add_text = (add_text_fc)g_dalvik_register_add_text;
- parent->export_buffer = (export_buffer_fc)g_dalvik_register_to_buffer;
}
@@ -166,12 +157,11 @@ bool g_dalvik_register_compare(const GDalvikRegister *a, const GDalvikRegister *
/******************************************************************************
* *
-* Paramètres : operand = opérande à transcrire. *
-* syntax = type de représentation demandée. *
-* key = description humaine du registre. [OUT] *
-* klen = nombre de caractères utilisés. [OUT] *
+* Paramètres : reg = registre à transcrire. *
+* line = ligne tampon où imprimer l'opérande donné. *
+* syntax = type de représentation demandée. *
* *
-* Description : Construit la chaîne de caractères correspondant à l'opérande.*
+* Description : Traduit un registre en version humainement lisible. *
* *
* Retour : - *
* *
@@ -179,78 +169,28 @@ bool g_dalvik_register_compare(const GDalvikRegister *a, const GDalvikRegister *
* *
******************************************************************************/
-static void g_dalvik_register_to_string(const GDalvikRegister *reg, AsmSyntax syntax, char key[MAX_REGNAME_LEN], size_t *klen)
+void g_dalvik_pool_operand_print(const GDalvikRegister *reg, GBufferLine *line, AsmSyntax syntax)
{
+ char key[MAX_REGNAME_LEN]; /* Mot clef principal */
+ size_t klen; /* Taille de ce mot clef */
+
switch (syntax)
{
case ASX_INTEL:
- *klen = snprintf(key, MAX_REGNAME_LEN, "v%hd", reg->index);
+ klen = snprintf(key, MAX_REGNAME_LEN, "v%hd", reg->index);
break;
case ASX_ATT:
- *klen = snprintf(key, MAX_REGNAME_LEN, "%%v%hd", reg->index);
+ klen = snprintf(key, MAX_REGNAME_LEN, "%%v%hd", reg->index);
break;
default:
- *klen = 0;
+ klen = 0;
break;
}
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : reg = registre X86 à transcrire. *
-* options = options de rendu. *
-* rendering = support effectif final des lignes de code. *
-* stream = flux ouvert en écriture. *
-* *
-* Description : Ajoute du texte simple à un fichier ouvert en écriture. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_dalvik_register_add_text(const GDalvikRegister *reg, GRenderingOptions *options, MainRendering rendering, FILE *stream)
-{
- char key[MAX_REGNAME_LEN]; /* Mot clef principal */
- size_t klen; /* Taille de ce mot clef */
-
- g_dalvik_register_to_string(reg, g_rendering_options_get_syntax(options), key, &klen);
-
- g_content_exporter_insert_text(G_CONTENT_EXPORTER(reg), stream,
- key, klen, RTT_REGISTER);
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : reg = registre X86 à transcrire. *
-* buffer = espace où placer ledit contenu. *
-* options = options de rendu. *
-* *
-* Description : Ajoute à un tampon GLib le contenu de l'instance spécifiée. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_dalvik_register_to_buffer(const GDalvikRegister *reg, GBufferLine *buffer, GRenderingOptions *options)
-{
- char key[MAX_REGNAME_LEN]; /* Mot clef principal */
- size_t klen; /* Taille de ce mot clef */
-
- g_dalvik_register_to_string(reg, g_rendering_options_get_syntax(options), key, &klen);
-
- g_content_exporter_insert_into_buffer(G_CONTENT_EXPORTER(reg), buffer, BLC_ASSEMBLY,
- key, klen, RTT_REGISTER);
+ g_buffer_line_insert_text(line, BLC_ASSEMBLY, key, klen, RTT_REGISTER);
}
diff --git a/src/arch/dalvik/register.h b/src/arch/dalvik/register.h
index 7767a9b..9b405a5 100644
--- a/src/arch/dalvik/register.h
+++ b/src/arch/dalvik/register.h
@@ -30,6 +30,7 @@
#include "../archbase.h"
+#include "../../glibext/gbufferline.h"
@@ -57,6 +58,9 @@ GDalvikRegister *g_dalvik_register_new(uint16_t);
/* Compare un registre avec un autre. */
bool g_dalvik_register_compare(const GDalvikRegister *, const GDalvikRegister *);
+/* Traduit un registre en version humainement lisible. */
+void g_dalvik_pool_operand_print(const GDalvikRegister *, GBufferLine *, AsmSyntax);
+
/* Indique si le registre correspond à ebp ou similaire. */
bool g_dalvik_register_is_base_pointer(const GDalvikRegister *);
diff --git a/src/arch/immediate.c b/src/arch/immediate.c
index c3a2f6b..ec689b8 100644
--- a/src/arch/immediate.c
+++ b/src/arch/immediate.c
@@ -793,7 +793,7 @@ static void g_imm_operand_print(const GImmOperand *operand, GBufferLine *line, A
len = g_imm_operand_to_string(operand, syntax, value);
- g_buffer_line_insert_text(line, BLC_ASSEMBLY_HEAD, value, len, RTT_IMMEDIATE);
+ g_buffer_line_insert_text(line, BLC_ASSEMBLY, value, len, RTT_IMMEDIATE);
}
diff --git a/src/arch/instruction.c b/src/arch/instruction.c
index cfc8ace..677a1a3 100644
--- a/src/arch/instruction.c
+++ b/src/arch/instruction.c
@@ -39,10 +39,10 @@ static void g_arch_instruction_class_init(GArchInstructionClass *);
static void g_arch_instruction_init(GArchInstruction *);
/* Ajoute du texte simple à un fichier ouvert en écriture. */
-static void g_arch_instruction_add_text(const GArchInstruction *, GRenderingOptions *, MainRendering, FILE *);
+static void g_arch_instruction_add_text(const GArchInstruction *, GRenderingOptions *, MainRendering, FILE *) __attribute__ ((deprecated));
/* Ajoute à un tampon GLib le contenu de l'instance spécifiée. */
-static void g_arch_instruction_to_buffer(const GArchInstruction *, GBufferLine *, GRenderingOptions *);
+static void g_arch_instruction_to_buffer(const GArchInstruction *, GBufferLine *, GRenderingOptions *) __attribute__ ((deprecated));
@@ -241,7 +241,7 @@ void g_arch_instruction_set_location(GArchInstruction *instr, off_t offset, off_
* *
******************************************************************************/
-void g_arch_instruction_get_location(GArchInstruction *instr, off_t *offset, off_t *length, vmpa_t *address)
+void g_arch_instruction_get_location(const GArchInstruction *instr, off_t *offset, off_t *length, vmpa_t *address)
{
if (offset != NULL) *offset = instr->offset;
if (length != NULL) *length = instr->length;
@@ -578,6 +578,81 @@ size_t g_arch_instruction_get_destinations(const GArchInstruction *instr, GArchI
/******************************************************************************
* *
+* Paramètres : instr = instruction d'assemblage à représenter. *
+* buffer = espace où placer ledit contenu. *
+* syntax = type de représentation demandée. *
+* *
+* Description : Ajoute à un tampon GLib le contenu de l'instance spécifiée. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_arch_instruction_print(const GArchInstruction *instr, GCodeBuffer *buffer, MemoryDataSize msize, const bin_t *content, AsmSyntax syntax)
+{
+ GBufferLine *line; /* Ligne de destination */
+ char address[VMPA_MAX_SIZE]; /* Adresse au format texte */
+ size_t len; /* Taille de l'élément inséré */
+ char *bin_code; /* Tampon du code binaire */
+ off_t i; /* Boucle de parcours #1 */
+ const char *key; /* Mot clef principal */
+ size_t klen; /* Taille de ce mot clef */
+ size_t j; /* Boucle de parcours #2 */
+
+ line = g_code_buffer_append_new_line(buffer);
+
+ /* Adresse virtuelle ou physique */
+
+ len = vmpa_to_string(instr->address, msize, address);
+
+ g_buffer_line_insert_text(line, BLC_ADDRESS, address, len, RTT_RAW);
+
+ /* Code brut */
+
+ bin_code = (char *)calloc(instr->length * 3, sizeof(char));
+
+ for (i = 0; i < instr->length; i++)
+ {
+ if ((i + 1) < instr->length)
+ snprintf(&bin_code[i * (2 + 1)], 4, "%02hhx ", content[instr->offset + i]);
+ else
+ snprintf(&bin_code[i * (2 + 1)], 3, "%02hhx", content[instr->offset + i]);
+ }
+
+ g_buffer_line_insert_text(line, BLC_BINARY,
+ bin_code, instr->length * 3 - 1, RTT_RAW_CODE);
+
+ free(bin_code);
+
+ /* Instruction proprement dite */
+
+ key = instr->get_text(instr, NULL/* FIXME */, 0/* FIXME */);
+ klen = strlen(key);
+
+ g_buffer_line_insert_text(line, BLC_ASSEMBLY_HEAD, key, klen, RTT_INSTRUCTION);
+
+ if (instr->operands_count > 0)
+ {
+ g_arch_operand_print(instr->operands[0], line, syntax);
+
+ for (j = 1; j < instr->operands_count; j++)
+ {
+ g_buffer_line_insert_text(line, BLC_ASSEMBLY, ",", 1, RTT_PUNCT);
+ g_buffer_line_insert_text(line, BLC_ASSEMBLY, " ", 1, RTT_NONE);
+
+ g_arch_operand_print(instr->operands[j], line, syntax);
+
+ }
+
+ }
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : instr = instruction d'origine à convertir. *
* ctx = contexte de la phase de décompilation. *
* *
@@ -643,7 +718,7 @@ void g_arch_instruction_add_to_list(GArchInstruction **list, GArchInstruction *i
* *
******************************************************************************/
-GArchInstruction *g_arch_instruction_get_next_iter(GArchInstruction *list, const GArchInstruction *iter, vmpa_t max)
+GArchInstruction *g_arch_instruction_get_next_iter(const GArchInstruction *list, const GArchInstruction *iter, vmpa_t max)
{
GArchInstruction *result; /* Elément suivant à renvoyer */
diff --git a/src/arch/instruction.h b/src/arch/instruction.h
index 7932fdc..07a6054 100644
--- a/src/arch/instruction.h
+++ b/src/arch/instruction.h
@@ -70,7 +70,7 @@ GType g_arch_instruction_get_type(void);
void g_arch_instruction_set_location(GArchInstruction *, off_t, off_t, vmpa_t);
/* Fournit la localisation d'une instruction. */
-void g_arch_instruction_get_location(GArchInstruction *, off_t *, off_t *, vmpa_t *);
+void g_arch_instruction_get_location(const GArchInstruction *, off_t *, off_t *, vmpa_t *);
/* Attache un opérande supplémentaire à une instruction. */
void g_arch_instruction_attach_extra_operand(GArchInstruction *, GArchOperand *);
@@ -88,7 +88,7 @@ void g_arch_instruction_replace_operand(GArchInstruction *, GArchOperand *, cons
void g_arch_instruction_detach_operand(GArchInstruction *, GArchOperand *);
/* Traduit une instruction en version humainement lisible. */
-char *g_arch_instruction_get_text(const GArchInstruction *, const GExeFormat *, AsmSyntax);
+char *g_arch_instruction_get_text(const GArchInstruction *, const GExeFormat *, AsmSyntax) __attribute__ ((deprecated));
@@ -118,6 +118,9 @@ size_t g_arch_instruction_get_destinations(const GArchInstruction *, GArchInstru
/* --------------------- CONVERSIONS DU FORMAT DES INSTRUCTIONS --------------------- */
+/* Ajoute à un tampon GLib le contenu de l'instance spécifiée. */
+void g_arch_instruction_print(const GArchInstruction *, GCodeBuffer *, MemoryDataSize, const bin_t *, AsmSyntax);
+
/* Décompile une instruction de façon générique. */
GDecInstruction *g_arch_instruction_decompile(const GArchInstruction *, GDecContext *);
@@ -130,7 +133,7 @@ GDecInstruction *g_arch_instruction_decompile(const GArchInstruction *, GDecCont
void g_arch_instruction_add_to_list(GArchInstruction **, GArchInstruction *);
/* Fournit l'élement suivant un autre pour un parcours. */
-GArchInstruction *g_arch_instruction_get_next_iter(GArchInstruction *, const GArchInstruction *, vmpa_t);
+GArchInstruction *g_arch_instruction_get_next_iter(const GArchInstruction *, const GArchInstruction *, vmpa_t);
/* Recherche une instruction d'après son adresse. */
GArchInstruction *g_arch_instruction_find_by_address(GArchInstruction *, vmpa_t, bool);