/* Chrysalide - Outil d'analyse de fichiers binaires * core.c - intégration du support du format PE * * Copyright (C) 2017-2019 Cyrille Bagard * * This file is part of Chrysalide. * * Chrysalide 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. * * Chrysalide 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 Chrysalide. If not, see . */ #include "core.h" //#include #include #include "core-int.h" #include "format.h" #ifdef INCLUDE_PYTHON3_BINDINGS # include "python/module.h" #endif /* ---------------------- COMPOSITION DE NOUVEAU GREFFON NATIF ---------------------- */ /* Initialise la classe des greffons de support PE. */ static void g_pe_plugin_class_init(GPePluginClass *); /* Procède à l'initialisation de l'interface de gestion. */ //static void g_pe_plugin_plugin_manager_interface_init(GPluginManagerInterface *); /* Initialise une instance de greffon de support PE. */ static void g_pe_plugin_init(GPePlugin *); /* Supprime toutes les références externes. */ static void g_pe_plugin_dispose(GPePlugin *); /* Procède à la libération totale de la mémoire. */ static void g_pe_plugin_finalize(GPePlugin *); /* --------------------- IMPLEMENTATION DES FONCTIONS DE CLASSE --------------------- */ /* Prend acte de l'activation du greffon. */ static bool g_pe_plugin_enable(GPePlugin *); /* Prend acte de l'extinction du greffon. */ static void g_pe_plugin_disable(GPePlugin *); /* ---------------------------------------------------------------------------------- */ /* COMPOSITION DE NOUVEAU GREFFON NATIF */ /* ---------------------------------------------------------------------------------- */ /* Indique le type défini pour un greffon de liaison Python */ G_DEFINE_TYPE_WITH_CODE(GPePlugin, g_pe_plugin, G_TYPE_NATIVE_PLUGIN, /*G_IMPLEMENT_INTERFACE(G_TYPE_PLUGIN_MANAGER, g_pe_plugin_plugin_manager_interface_init)*/); NATIVE_PLUGIN_ENTRYPOINT(g_pe_plugin_new); /****************************************************************************** * * * Paramètres : class = classe à initialiser. * * * * Description : Initialise la classe des greffons de support PE. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_pe_plugin_class_init(GPePluginClass *class) { GObjectClass *object; /* Autre version de la classe */ GPluginModuleClass *plugin; /* Version parente de la classe*/ object = G_OBJECT_CLASS(class); object->dispose = (GObjectFinalizeFunc/* ! */)g_pe_plugin_dispose; object->finalize = (GObjectFinalizeFunc)g_pe_plugin_finalize; plugin = G_PLUGIN_MODULE_CLASS(class); plugin->enable = (pg_management_fc)g_pe_plugin_enable; plugin->disable = (pg_management_fc)g_pe_plugin_disable; } #if 0 /****************************************************************************** * * * Paramètres : iface = interface GLib à initialiser. * * * * Description : Procède à l'initialisation de l'interface de gestion. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_pe_plugin_plugin_manager_interface_init(GPluginManagerInterface *iface) { iface->handle_native = (handle_native_plugins_cb)g_pe_plugin_handle_native_plugins_loaded_event; } #endif /****************************************************************************** * * * Paramètres : plugin = instance à initialiser. * * * * Description : Initialise une instance de greffon de support PE. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_pe_plugin_init(GPePlugin *plugin) { STORE_PLUGIN_ABI(plugin); } /****************************************************************************** * * * Paramètres : plugin = instance d'objet GLib à traiter. * * * * Description : Supprime toutes les références externes. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_pe_plugin_dispose(GPePlugin *plugin) { G_OBJECT_CLASS(g_pe_plugin_parent_class)->dispose(G_OBJECT(plugin)); } /****************************************************************************** * * * Paramètres : plugin = instance d'objet GLib à traiter. * * * * Description : Procède à la libération totale de la mémoire. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_pe_plugin_finalize(GPePlugin *plugin) { G_OBJECT_CLASS(g_pe_plugin_parent_class)->finalize(G_OBJECT(plugin)); } /****************************************************************************** * * * Paramètres : filename = nom du fichier à charger. * * * * Description : Crée un module pour un greffon de support PE. * * * * Retour : Adresse de la structure mise en place. * * * * Remarques : Le transfert de propriétée du module est total. * * * ******************************************************************************/ GPluginModule *g_pe_plugin_new(GModule *module) { GPePlugin *result; /* Structure à retourner */ result = g_object_new(G_TYPE_PE_PLUGIN, NULL); if (!g_pe_plugin_create(result, module)) g_clear_object(&result); return G_PLUGIN_MODULE(result); } /****************************************************************************** * * * Paramètres : plugin = instance à initialiser pleinement. * * module = module système correspondant. * * * * Description : Met en place un module pour un greffon de support PE. * * * * Retour : Bilan de l'opération. * * * * Remarques : Le transfert de propriétée du module est total. * * * ******************************************************************************/ bool g_pe_plugin_create(GPePlugin *plugin, GModule *module) { bool result; /* Bilan à retourner */ #ifdef INCLUDE_PYTHON3_BINDINGS # define PG_REQ REQ_LIST("PyChrysalide") #else # define PG_REQ NO_REQ #endif result = g_native_plugin_create(G_NATIVE_PLUGIN(plugin), "PeFmt", "PE format support", PACKAGE_VERSION, CHRYSALIDE_WEBSITE("doc/formats"), PG_REQ, module); return result; } /* ---------------------------------------------------------------------------------- */ /* IMPLEMENTATION DES FONCTIONS DE CLASSE */ /* ---------------------------------------------------------------------------------- */ /****************************************************************************** * * * Paramètres : plugin = greffon à manipuler. * * * * Description : Prend acte de l'activation du greffon. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static bool g_pe_plugin_enable(GPePlugin *plugin) { bool result; /* Bilan à retourner */ #ifdef INCLUDE_PYTHON3_BINDINGS result = add_format_pe_module_to_python_module(); #else result = true; #endif return result; } /****************************************************************************** * * * Paramètres : plugin = greffon à manipuler. * * * * Description : Prend acte de l'extinction du greffon. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_pe_plugin_disable(GPePlugin *plugin) { } #if 0 /* ---------------------------------------------------------------------------------- */ /* INTERVENTION DANS LA GESTION DE GREFFONS */ /* INTERVENTION DANS LA GESTION DE GREFFONS */ /* INTERVENTION DANS LA GESTION DE GREFFONS */ /* ---------------------------------------------------------------------------------- */ /****************************************************************************** * * * Paramètres : plugin = interface à manipuler. * * * * Description : Accompagne la fin du chargement des modules natifs. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_pe_plugin_handle_native_plugins_loaded_event(GPePlugin *plugin) { PyGILState_STATE gstate; /* Sauvegarde d'environnement */ gstate = PyGILState_Ensure(); load_python_plugins(G_PLUGIN_MODULE(plugin)); PyGILState_Release(gstate); } /****************************************************************************** * * * Paramètres : plugin = greffon à manipuler. * * action = type d'action attendue. * * content = contenu binaire à traiter. * * wid = identifiant du groupe de traitement. * * status = barre de statut à tenir informée. * * * * Description : Procède à une opération liée à un contenu binaire. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ #if 0 G_MODULE_EXPORT void chrysalide_plugin_handle_binary_content(const GPluginModule *plugin, PluginAction action, GBinContent *content, wgroup_id_t wid, GtkStatusStack *status) { bool test; /* Bilan des accès mémoire */ GExeFormat *format; /* Format PE reconnu */ GLoadedContent *loaded; /* Représentation chargée */ GContentResolver *resolver; /* Resolveur de contenus */ test = check_pe_format(content); if (test) { format = g_pe_format_new(content); loaded = g_loaded_binary_new(format); resolver = get_current_content_resolver(); g_content_resolver_add_detected(resolver, wid, loaded); g_object_unref(G_OBJECT(resolver)); g_object_unref(G_OBJECT(loaded)); } } #endif #endif