From 492f78fc955e181ff4ba7e7d6b578e5f76afb858 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Thu, 2 Dec 2010 22:57:08 +0000
Subject: Decompiled more Dex instructions (const and return).

git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@197 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
---
 ChangeLog                     |  24 +++++++
 src/arch/dalvik/Makefile.am   |   1 +
 src/arch/dalvik/dop_const.c   |  10 ---
 src/arch/dalvik/dop_ret.c     |  81 +++++++++++++++++++++
 src/arch/dalvik/instruction.c |  10 +--
 src/arch/dalvik/translate.h   |   6 ++
 src/decomp/expr/Makefile.am   |   3 +-
 src/decomp/expr/return.c      | 159 ++++++++++++++++++++++++++++++++++++++++++
 src/decomp/expr/return.h      |  60 ++++++++++++++++
 9 files changed, 338 insertions(+), 16 deletions(-)
 create mode 100644 src/arch/dalvik/dop_ret.c
 create mode 100644 src/decomp/expr/return.c
 create mode 100644 src/decomp/expr/return.h

diff --git a/ChangeLog b/ChangeLog
index 729f051..17d62f7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,29 @@
 10-12-02  Cyrille Bagard <nocbos@gmail.com>
 
+	* src/arch/dalvik/dop_const.c:
+	Clean code.
+
+	* src/arch/dalvik/dop_ret.c:
+	New entry: decompile returning instructions.
+
+	* src/arch/dalvik/instruction.c:
+	Update code.
+
+	* src/arch/dalvik/Makefile.am:
+	Add dop_ret to libarchdalvik_la_SOURCES.
+
+	* src/arch/dalvik/translate.h:
+	Extend the list of translation routines.
+
+	* src/decomp/expr/Makefile.am:
+	Add return.[ch] to libdecompexpr_la_SOURCES.
+
+	* src/decomp/expr/return.c:
+	* src/decomp/expr/return.h:
+	New entries: create an expression for the 'return' keyword.
+
+10-12-02  Cyrille Bagard <nocbos@gmail.com>
+
 	* src/analysis/decomp/decompiler.c:
 	Change debug code.
 
diff --git a/src/arch/dalvik/Makefile.am b/src/arch/dalvik/Makefile.am
index 8dc93ae..3c58a0e 100644
--- a/src/arch/dalvik/Makefile.am
+++ b/src/arch/dalvik/Makefile.am
@@ -9,6 +9,7 @@ libarchdalvik_la_SOURCES =				\
 	dop_array.c							\
 	dop_const.c							\
 	dop_invoke.c						\
+	dop_ret.c							\
 	op_add.c							\
 	op_aget.c							\
 	op_and.c							\
diff --git a/src/arch/dalvik/dop_const.c b/src/arch/dalvik/dop_const.c
index ea88089..9d42926 100644
--- a/src/arch/dalvik/dop_const.c
+++ b/src/arch/dalvik/dop_const.c
@@ -45,20 +45,10 @@
 GDecInstruction *dalvik_decomp_instr_const(const GArchInstruction *instr, GDecContext *ctx)
 {
     GDecInstruction *result;                /* Instruction à retourner     */
-
-
     GArchOperand *operand;                  /* Opérande de l'instruction   */
     GDecInstruction *reg;                   /* Pseudo-registre redéfini    */
     GDecInstruction *imm;                   /* Valeur immédiate décompilée */
 
-
-    result = NULL;
-
-
-    printf("PAssaage !\n");
-
-
-
     operand = g_arch_instruction_get_operand(instr, 0);
     reg = g_dec_context_convert_register(ctx, operand);
 
diff --git a/src/arch/dalvik/dop_ret.c b/src/arch/dalvik/dop_ret.c
new file mode 100644
index 0000000..3d3f29f
--- /dev/null
+++ b/src/arch/dalvik/dop_ret.c
@@ -0,0 +1,81 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * dop_ret.c - décompilation des ordres de retour
+ *
+ * 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 "translate.h"
+
+
+#include "../../decomp/expr/return.h"
+
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : instr = instruction d'origine à convertir.                   *
+*                ctx   = contexte de la phase de décompilation.               *
+*                                                                             *
+*  Description : Décompile une instruction de type 'return'.                  *
+*                                                                             *
+*  Retour      : Instruction mise en place ou NULL.                           *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+GDecInstruction *dalvik_decomp_instr_return(const GArchInstruction *instr, GDecContext *ctx)
+{
+    GDecInstruction *result;                /* Instruction à retourner     */
+    GArchOperand *operand;                  /* Opérande de l'instruction   */
+    GDecInstruction *reg;                   /* Pseudo-registre redéfini    */
+
+    operand = g_arch_instruction_get_operand(instr, 0);
+    reg = g_dec_context_convert_register(ctx, operand);
+
+    result = g_return_expression_new(G_DEC_EXPRESSION(reg));
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : instr = instruction d'origine à convertir.                   *
+*                ctx   = contexte de la phase de décompilation.               *
+*                                                                             *
+*  Description : Décompile une instruction de type 'return-void'.             *
+*                                                                             *
+*  Retour      : Instruction mise en place ou NULL.                           *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+GDecInstruction *dalvik_decomp_instr_return_void(const GArchInstruction *instr, GDecContext *ctx)
+{
+    GDecInstruction *result;                /* Instruction à retourner     */
+
+    result = g_return_expression_new(NULL);
+
+    return result;
+
+}
diff --git a/src/arch/dalvik/instruction.c b/src/arch/dalvik/instruction.c
index e8059d6..ca48fe2 100644
--- a/src/arch/dalvik/instruction.c
+++ b/src/arch/dalvik/instruction.c
@@ -80,12 +80,12 @@ static dalvik_instruction _instructions[DOP_COUNT] = {
     [DOP_MOVE_RESULT_WIDE]      = { 0x0b, "move-result-wide" },
     [DOP_MOVE_RESULT_OBJECT]    = { 0x0c, "move-result-object" },
     [DOP_MOVE_EXCEPTION]        = { 0x0d, "move-exception" },
-    [DOP_RETURN_VOID]           = { 0x0e, "return-void" },
-    [DOP_RETURN]                = { 0x0f, "return" },
-    [DOP_RETURN_WIDE]           = { 0x10, "return-wide" },
-    [DOP_RETURN_OBJECT]         = { 0x11, "return-object" },
+    [DOP_RETURN_VOID]           = { 0x0e, "return-void",        dalvik_decomp_instr_return_void },
+    [DOP_RETURN]                = { 0x0f, "return",             dalvik_decomp_instr_return },
+    [DOP_RETURN_WIDE]           = { 0x10, "return-wide",        dalvik_decomp_instr_return },
+    [DOP_RETURN_OBJECT]         = { 0x11, "return-object",      dalvik_decomp_instr_return },
     [DOP_CONST_4]               = { 0x12, "const/4",            dalvik_decomp_instr_const },
-    [DOP_CONST_16]              = { 0x13, "const/16" },
+    [DOP_CONST_16]              = { 0x13, "const/16",           dalvik_decomp_instr_const },
     [DOP_CONST]                 = { 0x14, "const" },
     [DOP_CONST_HIGH16]          = { 0x15, "const/high16" },
     [DOP_CONST_WIDE_16]         = { 0x16, "const-wide/16" },
diff --git a/src/arch/dalvik/translate.h b/src/arch/dalvik/translate.h
index 779c133..0f408e6 100644
--- a/src/arch/dalvik/translate.h
+++ b/src/arch/dalvik/translate.h
@@ -44,6 +44,12 @@ GDecInstruction *dalvik_decomp_instr_const(const GArchInstruction *, GDecContext
 /* Décompile une instruction de type 'invoke-virtual'. */
 GDecInstruction *dalvik_decomp_instr_invoke_virtual(const GArchInstruction *, GDecContext *);
 
+/* Décompile une instruction de type 'return'. */
+GDecInstruction *dalvik_decomp_instr_return(const GArchInstruction *, GDecContext *);
+
+/* Décompile une instruction de type 'return-void'. */
+GDecInstruction *dalvik_decomp_instr_return_void(const GArchInstruction *, GDecContext *);
+
 
 /* Décompile une instruction de type 'opérations arithmétiques'. */
 GDecInstruction *dalvik_decomp_instr_arithm_2addr(const GArchInstruction *, GDecContext *);
diff --git a/src/decomp/expr/Makefile.am b/src/decomp/expr/Makefile.am
index 3c15758..d6d6d04 100644
--- a/src/decomp/expr/Makefile.am
+++ b/src/decomp/expr/Makefile.am
@@ -8,7 +8,8 @@ libdecompexpr_la_SOURCES =				\
 	block.h block.c						\
 	call.h call.c						\
 	immediate.h immediate.c				\
-	pseudo.h pseudo.c
+	pseudo.h pseudo.c					\
+	return.h return.c
 
 libdecompexpr_la_LDFLAGS = 
 
diff --git a/src/decomp/expr/return.c b/src/decomp/expr/return.c
new file mode 100644
index 0000000..e29f022
--- /dev/null
+++ b/src/decomp/expr/return.c
@@ -0,0 +1,159 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * return.c - représentation des ordres de retour
+ *
+ * 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 "return.h"
+
+
+#include "../expression-int.h"
+
+
+
+/* Définition d'un ordre de retour (instance) */
+struct _GReturnExpression
+{
+    GDecExpression parent;                  /* A laisser en premier        */
+
+    GDecExpression *payload;                /* Eventuel paquet associé     */
+
+};
+
+
+/* Définition d'un ordre de retour (classe) */
+struct _GReturnExpressionClass
+{
+    GDecExpressionClass parent;             /* A laisser en premier        */
+
+};
+
+
+
+/* Initialise la classe des ordres de retour. */
+static void g_return_expression_class_init(GReturnExpressionClass *);
+
+/* Initialise une instance d'ordre de retour. */
+static void g_return_expression_init(GReturnExpression *);
+
+/* Imprime pour l'écran un version humaine d'une expression. */
+static void g_return_expression_print(const GReturnExpression *, GCodeBuffer *, GBufferLine *, GLangOutput *);
+
+
+
+/* Indique le type défini pour un ordre de retour. */
+G_DEFINE_TYPE(GReturnExpression, g_return_expression, G_TYPE_DEC_EXPRESSION);
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : klass = classe à initialiser.                                *
+*                                                                             *
+*  Description : Initialise la classe des ordres de retour.                   *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void g_return_expression_class_init(GReturnExpressionClass *klass)
+{
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : expr = instance à initialiser.                               *
+*                                                                             *
+*  Description : Initialise une instance d'ordre de retour.                   *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void g_return_expression_init(GReturnExpression *expr)
+{
+    GDecInstruction *instr;                 /* Autre version de l'objet    */
+
+    instr = G_DEC_INSTRUCTION(expr);
+
+    instr->print = (dec_instr_print_fc)g_return_expression_print;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : payload = éventuelle expression à associer au retour.        *
+*                                                                             *
+*  Description : Constitue un ordre de retour vers l'appelant.                *
+*                                                                             *
+*  Retour      : Expression mise en place.                                    *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+GDecInstruction *g_return_expression_new(GDecExpression *payload)
+{
+    GReturnExpression *result;              /* Expression à retourner      */
+
+    result = g_object_new(G_TYPE_RETURN_EXPRESSION, NULL);
+
+    result->payload = payload;
+
+    return G_DEC_INSTRUCTION(result);
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : expr   = expression à transcrire en version humaine.         *
+*                buffer = tampon où doit se réaliser l'insertion.             *
+*                line   = ligne d'impression prête à emploi ou NULL.          *
+*                output = langage de programmation de sortie.                 *
+*                                                                             *
+*  Description : Imprime pour l'écran un version humaine d'une expression.    *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void g_return_expression_print(const GReturnExpression *expr, GCodeBuffer *buffer, GBufferLine *line, GLangOutput *output)
+{
+    g_buffer_line_insert_text(line, BLC_ASSEMBLY_HEAD, "return", 6, RTT_KEY_WORD);
+
+    if (expr->payload != NULL)
+    {
+        g_buffer_line_insert_text(line, BLC_ASSEMBLY_HEAD, " ", 1, RTT_RAW);
+
+        g_dec_instruction_print(G_DEC_INSTRUCTION(expr->payload),
+                                buffer, line, output);
+
+    }
+
+}
diff --git a/src/decomp/expr/return.h b/src/decomp/expr/return.h
new file mode 100644
index 0000000..093ee32
--- /dev/null
+++ b/src/decomp/expr/return.h
@@ -0,0 +1,60 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * return.h - prototypes pour la représentation des ordres de retour
+ *
+ * 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 _DECOMP_EXPR_RETURN_H
+#define _DECOMP_EXPR_RETURN_H
+
+
+#include <glib-object.h>
+
+
+#include "../expression.h"
+#include "../instruction.h"
+
+
+
+#define G_TYPE_RETURN_EXPRESSION               g_return_expression_get_type()
+#define G_RETURN_EXPRESSION(obj)               (G_TYPE_CHECK_INSTANCE_CAST((obj), g_return_expression_get_type(), GReturnExpression))
+#define G_IS_RETURN_EXPRESSION(obj)            (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_return_expression_get_type()))
+#define G_RETURN_EXPRESSION_CLASS(klass)       (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_RETURN_EXPRESSION, GReturnExpressionClass))
+#define G_IS_RETURN_EXPRESSION_CLASS(klass)    (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_RETURN_EXPRESSION))
+#define G_RETURN_EXPRESSION_GET_CLASS(obj)     (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_RETURN_EXPRESSION, GReturnExpressionClass))
+
+
+
+/* Définition d'un ordre de retour (instance) */
+typedef struct _GReturnExpression GReturnExpression;
+
+/* Définition d'un ordre de retour (classe) */
+typedef struct _GReturnExpressionClass GReturnExpressionClass;
+
+
+/* Indique le type défini pour un ordre de retour. */
+GType g_return_expression_get_type(void);
+
+/* Constitue un ordre de retour vers l'appelant. */
+GDecInstruction *g_return_expression_new(GDecExpression *);
+
+
+
+#endif  /* _DECOMP_EXPR_RETURN_H */
-- 
cgit v0.11.2-87-g4458