diff options
Diffstat (limited to 'plugins/libcsem')
| -rw-r--r-- | plugins/libcsem/Makefile.am | 13 | ||||
| -rw-r--r-- | plugins/libcsem/exit.c | 122 | ||||
| -rw-r--r-- | plugins/libcsem/exit.h | 37 | ||||
| -rw-r--r-- | plugins/libcsem/semantic.c | 62 | ||||
| -rw-r--r-- | plugins/libcsem/semantic.h | 39 | 
5 files changed, 273 insertions, 0 deletions
| diff --git a/plugins/libcsem/Makefile.am b/plugins/libcsem/Makefile.am new file mode 100644 index 0000000..1c8ad9c --- /dev/null +++ b/plugins/libcsem/Makefile.am @@ -0,0 +1,13 @@ + +lib_LTLIBRARIES = liblibcsem.la + +liblibcsem_la_SOURCES =					\ +	exit.h exit.c						\ +	semantic.h semantic.c + +liblibcsem_la_CFLAGS = $(AM_CFLAGS) + + +AM_CPPFLAGS = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS) -I../../src + +AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS) diff --git a/plugins/libcsem/exit.c b/plugins/libcsem/exit.c new file mode 100644 index 0000000..fbe0923 --- /dev/null +++ b/plugins/libcsem/exit.c @@ -0,0 +1,122 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * exit.c - définition des sorties comme points de non retour + * + * Copyright (C) 2015 Cyrille Bagard + * + *  This file is part of Chrysalide. + * + *  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 "exit.h" + + + +/* Modifie toutes les instructions appelant exit(). */ +static void mark_one_kind_of_exit_as_return(const GLoadedBinary *, const char *); + + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : binary = binaire dont le contenu est en cours de traitement. * +*                                                                             * +*  Description : Modifie toutes les instructions appelant exit().             * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void mark_one_kind_of_exit_as_return(const GLoadedBinary *binary, const char *fname) +{ +    GBinFormat *format;                     /* Format du fichier binaire   */ +    GBinSymbol *symbol;                     /* Symbole de fonction trouvé  */ +    const mrange_t *range;                  /* Emplacement du symbole      */ +    GArchProcessor *proc;                   /* Architecture du binaire     */ +    GArchInstruction *instr;                /* Instruction de sortie       */ +    GArchInstruction **sources;             /* Instructions diverses liées */ +    InstructionLinkType *types;             /* Types de lien existants     */ +    size_t count;                           /* Nbre de sources affichées   */ +    size_t i;                               /* Boucle de parcours          */ + +    format = G_BIN_FORMAT(g_loaded_binary_get_format(binary)); + +    if (!g_binary_format_find_symbol_by_label(format, fname, &symbol)) +        goto mokoear_exit; + +    if (g_binary_symbol_get_target_type(symbol) != STP_ROUTINE) +        goto mokoear_done_with_sym; + +    range = g_binary_symbol_get_range(symbol); + +    proc = g_loaded_binary_get_processor(binary); + +    instr = g_arch_processor_find_instr_by_address(proc,  get_mrange_addr(range)); + +    count = g_arch_instruction_get_sources(instr, &sources, &types); + +    for (i = 0; i < count; i++) +    { +        if (types[i] != ILT_CALL) continue; + +        g_arch_instruction_define_as_return(sources[i], true); + +    } + +    g_object_unref(G_OBJECT(proc)); + + mokoear_done_with_sym: + +    g_object_unref(G_OBJECT(symbol)); + + mokoear_exit: + +    //g_object_unref(G_OBJECT(format)); + +    ; + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : binary = binaire dont le contenu est en cours de traitement. * +*                                                                             * +*  Description : Modifie toutes les instructions appelant exit().             * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +void mark_exit_calls_as_return_instructions(const GLoadedBinary *binary) +{ +    const char **iter;                      /* Boucle de parcours          */ + +    static const char *exit_functions[] = { +        "exit", +        "_exit", +        "_Exit", +        NULL +    }; + +    for (iter = exit_functions; *iter != NULL; iter++) +        mark_one_kind_of_exit_as_return(binary, *iter); + +} diff --git a/plugins/libcsem/exit.h b/plugins/libcsem/exit.h new file mode 100644 index 0000000..f580036 --- /dev/null +++ b/plugins/libcsem/exit.h @@ -0,0 +1,37 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * exit.h - prototypes pour la définition des sorties comme points de non retour + * + * Copyright (C) 2015 Cyrille Bagard + * + *  This file is part of Chrysalide. + * + *  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 _PLUGINS_LIBCSEM_EXIT_H +#define _PLUGINS_LIBCSEM_EXIT_H + + +#include <analysis/binary.h> + + + +/* Modifie toutes les instructions appelant exit(). */ +void mark_exit_calls_as_return_instructions(const GLoadedBinary *); + + + +#endif  /* _PLUGINS_LIBCSEM_EXIT_H */ diff --git a/plugins/libcsem/semantic.c b/plugins/libcsem/semantic.c new file mode 100644 index 0000000..2da2ea6 --- /dev/null +++ b/plugins/libcsem/semantic.c @@ -0,0 +1,62 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * semantic.c - prise en charge personnalisée de la bibliothèque C + * + * Copyright (C) 2015 Cyrille Bagard + * + *  This file is part of Chrysalide. + * + *  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 "semantic.h" + + +#include <plugins/plugin-def.h> + + +#include "exit.h" + + + +DEFINE_CHRYSALIDE_ACTIVE_PLUGIN("LibC semantics", "Register semantic information relative to the libc", "0.1.0", +                                PGA_DISASSEMBLY_HOOKED_POST); + + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : plugin = greffon à manipuler.                                * +*                action = type d'action attendue.                             * +*                binary = binaire dont le contenu est en cours de traitement. * +*                                                                             * +*  Description : Exécute une action pendant un désassemblage de binaire.      * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +G_MODULE_EXPORT void process_binary_disassembly(const GPluginModule *plugin, PluginAction action, GLoadedBinary *binary) +{ +    if (action == PGA_DISASSEMBLY_HOOKED_POST) +    { +        /* Traitement de appels à exit() ou fonctions similaires */ +        mark_exit_calls_as_return_instructions(binary); + +    } + +} diff --git a/plugins/libcsem/semantic.h b/plugins/libcsem/semantic.h new file mode 100644 index 0000000..72ce0ce --- /dev/null +++ b/plugins/libcsem/semantic.h @@ -0,0 +1,39 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * semantic.h - prototypes pour la prise en charge personnalisée de la bibliothèque C + * + * Copyright (C) 2015 Cyrille Bagard + * + *  This file is part of Chrysalide. + * + *  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 _PLUGINS_LIBCSEM_SEMANTIC_H +#define _PLUGINS_LIBCSEM_SEMANTIC_H + + +#include <format/elf/elf.h> +#include <plugins/plugin.h> +#include <plugins/plugin-int.h> + + + +/* Exécute une action pendant un désassemblage de binaire. */ +G_MODULE_EXPORT void process_binary_disassembly(const GPluginModule *, PluginAction, GLoadedBinary *); + + + +#endif  /* _PLUGINS_LIBCSEM_SEMANTIC_H */ | 
