summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/analysis/binary.c72
-rw-r--r--src/arch/instruction.c47
-rw-r--r--src/arch/instruction.h6
-rw-r--r--src/arch/x86/operand.c61
-rw-r--r--src/arch/x86/operand.h14
-rw-r--r--src/plugins/pglist.c35
-rw-r--r--src/plugins/pglist.h3
-rw-r--r--src/plugins/plugin-def.h11
-rw-r--r--src/plugins/plugin.c19
-rw-r--r--src/plugins/plugin.h4
10 files changed, 214 insertions, 58 deletions
diff --git a/src/analysis/binary.c b/src/analysis/binary.c
index 396dbe0..a24c3d3 100644
--- a/src/analysis/binary.c
+++ b/src/analysis/binary.c
@@ -566,10 +566,10 @@ void disassemble_openida_binary(openida_binary *binary)
uint64_t routine_offset; /* Point de départ de routine */
char *routine_desc; /* Prototype d'une routine */
+ GPluginModule **pglist; /* Liste de greffons */
+ size_t pgcount; /* Taille de cette liste */
- GPluginModule *disass; /* Eventuel greffon de désass. */
-
binary->lines = build_binary_prologue(binary->filename, binary->bin_data, binary->bin_length);
@@ -579,56 +579,46 @@ void disassemble_openida_binary(openida_binary *binary)
+ parts = /* !!! */get_elf_default_code_parts(binary->format, &parts_count);
+ qsort(parts, parts_count, sizeof(bin_part *), compare_bin_parts);
- disass = get_one_plugin_for_action(PGA_DISASSEMBLE);
-
- if (0 && disass != NULL)
- binary->lines = g_plugin_module_disassemble_binary_parts(disass, binary);
+ printf("PARTS COUNT :: %d\n", parts_count);
- else
+ for (i = 0; i < parts_count; i++)
{
- parts = /* !!! */get_elf_default_code_parts(binary->format, &parts_count);
- qsort(parts, parts_count, sizeof(bin_part *), compare_bin_parts);
-
- printf("PARTS COUNT :: %d\n", parts_count);
-
- for (i = 0; i < parts_count; i++)
- {
- get_bin_part_values(parts[i], &pos, &len, &base);
+ get_bin_part_values(parts[i], &pos, &len, &base);
- /* Décodage des instructions */
+ /* Décodage des instructions */
- start = pos;
- pos = 0;
-
- while (pos < len)
- {
- addr = base + pos;
+ start = pos;
+ pos = 0;
+ while (pos < len)
+ {
+ addr = base + pos;
- instr = g_arch_processor_decode_instruction(binary->proc, &binary->bin_data[start], &pos, len, start, addr);
- line = g_code_line_new(addr, instr, binary->options);
- g_rendering_line_add_to_lines(&binary->lines, line);
+ instr = g_arch_processor_decode_instruction(binary->proc, &binary->bin_data[start], &pos, len, start, addr);
- }
+ line = g_code_line_new(addr, instr, binary->options);
+ g_rendering_line_add_to_lines(&binary->lines, line);
- /* Ajout des prototypes de fonctions */
+ }
- for (k = 0; k < routines_count; k++)
- {
- routine_offset = g_binary_routine_get_address(routines[k]);
+ /* Ajout des prototypes de fonctions */
- if (!(base <= routine_offset && routine_offset < (base + len))) continue;
+ for (k = 0; k < routines_count; k++)
+ {
+ routine_offset = g_binary_routine_get_address(routines[k]);
- routine_desc = g_binary_routine_to_string(routines[k]);
+ if (!(base <= routine_offset && routine_offset < (base + len))) continue;
- line = g_comment_line_new(routine_offset, routine_desc, binary->options);
- g_rendering_line_insert_into_lines(&binary->lines, line, true);
+ routine_desc = g_binary_routine_to_string(routines[k]);
- free(routine_desc);
+ line = g_comment_line_new(routine_offset, routine_desc, binary->options);
+ g_rendering_line_insert_into_lines(&binary->lines, line, true);
- }
+ free(routine_desc);
}
@@ -640,8 +630,18 @@ void disassemble_openida_binary(openida_binary *binary)
line = g_rendering_line_find_by_address(binary->lines, NULL, get_exe_entry_point(binary->format));
if (line != NULL) g_rendering_line_add_flag(line, RLF_ENTRY_POINT);
+ /* Action post-désassemblage */
+ pglist = get_all_plugins_for_action(PGA_CODE_PROCESS, &pgcount);
+ if (pgcount > 0)
+ {
+ for (i = 0; i < pgcount; i++)
+ g_plugin_module_execute_action_on_binary(pglist[i], binary, PGA_CODE_PROCESS);
+
+ free(pglist);
+
+ }
}
diff --git a/src/arch/instruction.c b/src/arch/instruction.c
index e0cea9f..37b2147 100644
--- a/src/arch/instruction.c
+++ b/src/arch/instruction.c
@@ -202,6 +202,25 @@ void g_arch_instruction_attach_extra_operand(GArchInstruction *instr, GArchOpera
/******************************************************************************
* *
+* Paramètres : instr = instance à consulter. *
+* *
+* Description : Indique la quantité d'opérandes présents dans l'instruction. *
+* *
+* Retour : Nombre d'opérandes attachés. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+size_t g_arch_instruction_count_operands(const GArchInstruction *instr)
+{
+ return instr->operands_count;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : instr = instance à mettre à jour. *
* index = indice de l'opérande concernée. *
* *
@@ -227,6 +246,34 @@ const GArchOperand *g_arch_instruction_get_operand(GArchInstruction *instr, size
/******************************************************************************
* *
+* Paramètres : instr = instance à mettre à jour. *
+* new = nouvelle opérande à attacher. *
+* old = ancienne opérande à détacher. *
+* *
+* Description : Replace un opérande d'une instruction par un autre. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_arch_instruction_replace_operand(GArchInstruction *instr, GArchOperand *new, const GArchOperand *old)
+{
+ size_t i; /* Boucle de parcours */
+
+ for (i = 0; i < instr->operands_count; i++)
+ if (instr->operands[i] == old)
+ break;
+
+ if (i < instr->operands_count)
+ instr->operands[i] = new;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : instr = instance à mettre à jour. *
* opererand = instruction à venir dissocier. *
* *
diff --git a/src/arch/instruction.h b/src/arch/instruction.h
index c0cb9f6..0e6444b 100644
--- a/src/arch/instruction.h
+++ b/src/arch/instruction.h
@@ -79,9 +79,15 @@ void g_arch_instruction_attach_two_operands(GArchInstruction *, GArchOperand *,
/* Attache un opérande supplémentaire à une instruction. */
void g_arch_instruction_attach_extra_operand(GArchInstruction *, GArchOperand *);
+/* Indique la quantité d'opérandes présents dans l'instruction. */
+size_t g_arch_instruction_count_operands(const GArchInstruction *);
+
/* Fournit un opérande donné d'une instruction. */
const GArchOperand *g_arch_instruction_get_operand(GArchInstruction *, size_t);
+/* Replace un opérande d'une instruction par un autre. */
+void g_arch_instruction_replace_operand(GArchInstruction *, GArchOperand *, const GArchOperand *);
+
/* Détache un opérande liée d'une instruction. */
void g_arch_instruction_detach_operand(GArchInstruction *, GArchOperand *);
diff --git a/src/arch/x86/operand.c b/src/arch/x86/operand.c
index 8f218fc..24613cf 100644
--- a/src/arch/x86/operand.c
+++ b/src/arch/x86/operand.c
@@ -29,7 +29,6 @@
#include <stdio.h>
-#include "registers.h"
#include "../operand.h"
#include "../operand-int.h"
#include "../../common/extstr.h"
@@ -654,6 +653,66 @@ static char *g_x86_mod_rm_operand_get_text(const GX86ModRMOperand *operand, cons
}
+/******************************************************************************
+* *
+* Paramètres : operand = opérande à consulter. *
+* scale = facteur sous forme de puissance de deux. [OUT *
+* index = register principal de l'opérande. [OUT] *
+* *
+* Description : Fournit l'indice et l'échelle d'un opérande x86 ModRM. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_x86_mod_rm_operand_get_scale_and_index(const GX86ModRMOperand *operand, uint8_t *scale, const x86_register **index)
+{
+ *scale = operand->scale;
+ *index = operand->index;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : operand = opérande à consulter. *
+* *
+* Description : Fournit le registre de base d'un opérande x86 ModRM. *
+* *
+* Retour : Registre de base de l'opérande. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+const x86_register *g_x86_mod_rm_operand_get_base(const GX86ModRMOperand *operand)
+{
+ return operand->base;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : operand = opérande à consulter. *
+* *
+* Description : Fournit le décallage supplémentaire d'un opérande x86 ModRM. *
+* *
+* Retour : Décallage numérique pour l'opérande. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+const GImmOperand *g_x86_mod_rm_operand_get_displacement(const GX86ModRMOperand *operand)
+{
+ return operand->displacement;
+
+}
+
+
/* ---------------------------------------------------------------------------------- */
/* OPERANDES D'ADRESSES RELATIVES */
diff --git a/src/arch/x86/operand.h b/src/arch/x86/operand.h
index 9f4db09..cbf2ed2 100644
--- a/src/arch/x86/operand.h
+++ b/src/arch/x86/operand.h
@@ -30,6 +30,7 @@
#include "../immediate.h"
#include "../instruction.h"
+#include "registers.h"
@@ -88,9 +89,9 @@ GArchOperand *g_x86_register_operand_new_from_index(bin_t, AsmOperandSize);
#define G_TYPE_X86_MOD_RM_OPERAND g_x86_mod_rm_operand_get_type()
-#define G_X86_MOD_RM_OPERAND(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_x86_mod_rm_operand_get_type(), GX86ModRmOperand))
+#define G_X86_MOD_RM_OPERAND(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_x86_mod_rm_operand_get_type(), GX86ModRMOperand))
#define G_IS_X86_MOD_RM_OPERAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_x86_mod_rm_operand_get_type()))
-#define G_X86_MOD_RM_OPERAND_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE((inst), g_x86_mod_rm_operand_get_type(), GX86ModRmOperandIface))
+#define G_X86_MOD_RM_OPERAND_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE((inst), g_x86_mod_rm_operand_get_type(), GX86ModRMOperandIface))
/* Définition d'un opérande x86 de type ModRM (instance) */
@@ -106,6 +107,15 @@ GType g_x86_mod_rm_operand_get_type(void);
/* Crée un opérande x86 de type ModRM. */
GArchOperand *g_x86_mod_rm_operand_new(const bin_t *, off_t *, off_t, AsmOperandSize);
+/* Fournit l'indice et l'échelle d'un opérande x86 ModRM. */
+void g_x86_mod_rm_operand_get_scale_and_index(const GX86ModRMOperand *operand, uint8_t *, const x86_register **);
+
+/* Fournit le registre de base d'un opérande x86 ModRM. */
+const x86_register *g_x86_mod_rm_operand_get_base(const GX86ModRMOperand *);
+
+/* Fournit le décallage supplémentaire d'un opérande x86 ModRM. */
+const GImmOperand *g_x86_mod_rm_operand_get_displacement(const GX86ModRMOperand *);
+
/* ------------------------- OPERANDES D'ADRESSES RELATIVES ------------------------- */
diff --git a/src/plugins/pglist.c b/src/plugins/pglist.c
index 85421e6..6d47f57 100644
--- a/src/plugins/pglist.c
+++ b/src/plugins/pglist.c
@@ -77,7 +77,7 @@ bool init_all_plugins(GObject *ref)
{
_list.ref = ref;
- browse_directory_for_plugins(&_list, PACKAGE_SOURCE_DIR "/src/plugins");
+ browse_directory_for_plugins(&_list, PACKAGE_SOURCE_DIR "/plugins");
return true;
@@ -200,3 +200,36 @@ GPluginModule *get_one_plugin_for_action(PluginAction action)
return result;
}
+
+
+/******************************************************************************
+* *
+* Paramètres : action = fonctionnalité recherchée. *
+* count = nombre de greffons trouvés. [OUT] *
+* *
+* Description : Founit less greffons offrant le service demandé. *
+* *
+* Retour : Liste de greffons correspondants à libérer de la mémoire. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GPluginModule **get_all_plugins_for_action(PluginAction action, size_t *count)
+{
+ GPluginModule **result; /* Greffon à retourner */
+ size_t i; /* Boucle de parcours */
+
+ result = NULL;
+ *count = 0;
+
+ for (i = 0; i < _list.plugins_count; i++)
+ if (g_plugin_module_get_action(_list.plugins[i]) & action)
+ {
+ result = (GPluginModule **)realloc(result, ++(*count) * sizeof(GPluginModule *));
+ result[*count - 1] = _list.plugins[i];
+ }
+
+ return result;
+
+}
diff --git a/src/plugins/pglist.h b/src/plugins/pglist.h
index 4aa77cd..36b998e 100644
--- a/src/plugins/pglist.h
+++ b/src/plugins/pglist.h
@@ -41,6 +41,9 @@ bool init_all_plugins(GObject *);
/* Founit un greffon offrant le service demandé. */
GPluginModule *get_one_plugin_for_action(PluginAction);
+/* Founit less greffons offrant le service demandé. */
+GPluginModule **get_all_plugins_for_action(PluginAction, size_t *);
+
#endif /* _PLUGINS_PGLIST_H */
diff --git a/src/plugins/plugin-def.h b/src/plugins/plugin-def.h
index 68167e2..44dd3fa 100644
--- a/src/plugins/plugin-def.h
+++ b/src/plugins/plugin-def.h
@@ -27,14 +27,15 @@
#include "../analysis/binary.h"
-#include "../analysis/line.h"
/* Action(s) menée(s) par le greffon */
typedef enum _PluginAction
{
- PGA_DISASSEMBLE = (1 << 0) /* Désassemblage (non trivial) */
+ PGA_DISASSEMBLE = (1 << 0), /* Désassemblage (non trivial) */
+
+ PGA_CODE_PROCESS = (1 << 1) /* Traitement du code existant */
} PluginAction;
@@ -45,10 +46,8 @@ typedef enum _PluginAction
/* Fournit une indication sur le type d'opération(s) menée(s). */
typedef PluginAction (* get_plugin_action_fc) (void);
-
-
-/* S'occupe du désassemblage (pur) de code binaire. */
-typedef GRenderingLine * (* disassemble_binary_parts_fc) (openida_binary *);
+/* Exécute une action définie sur un binaire chargé. */
+typedef bool (* execute_action_on_binary_fc) (openida_binary *, PluginAction);
diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c
index 80daa74..0165dfa 100644
--- a/src/plugins/plugin.c
+++ b/src/plugins/plugin.c
@@ -48,7 +48,7 @@ struct _GPluginModule
init_plugin_fc init; /* Procédure d'initialisation */
- disassemble_binary_parts_fc disassemble;/* Fonction de désassemblage */
+ execute_action_on_binary_fc exec_on_bin;/* Action sur un binaire */
};
@@ -145,11 +145,9 @@ GPluginModule *g_plugin_module_new(const gchar *filename, GObject *ref)
result->action = __get_action();
-
- /* ... */
- if (result->action & PGA_DISASSEMBLE)
+ if (result->action & (PGA_DISASSEMBLE | PGA_CODE_PROCESS))
{
- if (!g_module_symbol(result->module, "disassemble_binary_parts", (gpointer *)&result->disassemble))
+ if (!g_module_symbol(result->module, "execute_action_on_binary", (gpointer *)&result->exec_on_bin))
{
printf("Err plugin disass sym\n");
//g_object_destroy(result);
@@ -202,18 +200,19 @@ PluginAction g_plugin_module_get_action(const GPluginModule *plugin)
/******************************************************************************
* *
* Paramètres : plugin = greffon à consulter. *
-* binary = binaire dont le contenu est à désassembler. *
+* binary = binaire dont le contenu est à traiter. *
+* action = action attendue. *
* *
-* Description : S'occupe du désassemblage (pur) de code binaire. *
+* Description : Exécute une action définie sur un binaire chargé. *
* *
-* Retour : Lignes de code pour la représentation à insérer. *
+* Retour : true si une action a été menée, false sinon. *
* *
* Remarques : - *
* *
******************************************************************************/
-GRenderingLine *g_plugin_module_disassemble_binary_parts(const GPluginModule *plugin, openida_binary *binary)
+bool g_plugin_module_execute_action_on_binary(const GPluginModule *plugin, openida_binary *binary, PluginAction action)
{
- return plugin->disassemble(binary);
+ return plugin->exec_on_bin(binary, action);
}
diff --git a/src/plugins/plugin.h b/src/plugins/plugin.h
index 455f17c..032f699 100644
--- a/src/plugins/plugin.h
+++ b/src/plugins/plugin.h
@@ -57,8 +57,8 @@ GPluginModule *g_plugin_module_new(const gchar *, GObject *);
/* Indique les opérations offertes par un greffon donné. */
PluginAction g_plugin_module_get_action(const GPluginModule *);
-/* S'occupe du désassemblage (pur) de code binaire. */
-GRenderingLine *g_plugin_module_disassemble_binary_parts(const GPluginModule *, openida_binary *);
+/* Exécute une action définie sur un binaire chargé. */
+bool g_plugin_module_execute_action_on_binary(const GPluginModule *, openida_binary *, PluginAction);