diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/analysis/binary.c | 72 | ||||
-rw-r--r-- | src/arch/instruction.c | 47 | ||||
-rw-r--r-- | src/arch/instruction.h | 6 | ||||
-rw-r--r-- | src/arch/x86/operand.c | 61 | ||||
-rw-r--r-- | src/arch/x86/operand.h | 14 | ||||
-rw-r--r-- | src/plugins/pglist.c | 35 | ||||
-rw-r--r-- | src/plugins/pglist.h | 3 | ||||
-rw-r--r-- | src/plugins/plugin-def.h | 11 | ||||
-rw-r--r-- | src/plugins/plugin.c | 19 | ||||
-rw-r--r-- | src/plugins/plugin.h | 4 |
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); |