/* Chrysalide - Outil d'analyse de fichiers binaires
* core.c - greffon détaillant les appels système
*
* Copyright (C) 2018 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
#include "db.h"
#include "hops_armv7.h"
#include "hunter.h"
DEFINE_CHRYSALIDE_PLUGIN("GLnxSyscallsPlugin", "Linux System Calls", "Describes each Linux system call with its arguments", \
"0.1.0", EMPTY_PG_LIST(.required), AL(PGA_PLUGIN_INIT, PGA_DISASSEMBLY_ENDED));
/******************************************************************************
* *
* Paramètres : plugin = greffon à manipuler. *
* *
* Description : Prend acte du chargement du greffon. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
G_MODULE_EXPORT bool chrysalide_plugin_init(GPluginModule *plugin)
{
bool result; /* Bilan à retourner */
sqlite3 *db; /* Base de données présente */
db = open_syscalls_database(plugin);
if (db != NULL)
{
introduce_syscalls_database(db, plugin);
close_syscalls_database(db);
result = true;
}
else
result = false;
return result;
}
/******************************************************************************
* *
* Paramètres : plugin = greffon à manipuler. *
* action = type d'action attendue. *
* binary = binaire dont le contenu est en cours de traitement.*
* status = barre de statut à tenir informée. *
* context = contexte de désassemblage. *
* *
* 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, GtkStatusStack *status, GProcContext *context)
{
GBinFormat *format; /* Format du binaire chargé */
const char *arch; /* Architecture d'exécution */
const hunting_ops *hops; /* Opérations particulières */
size_t sym_count; /* Nombre de ces symboles */
guint runs_count; /* Qté d'exécutions parallèles */
size_t run_size; /* Volume réparti par exécution*/
activity_id_t id; /* Identifiant de progression */
GWorkQueue *queue; /* Gestionnaire de différés */
wgroup_id_t gid; /* Identifiant pour les tâches */
guint i; /* Boucle de parcours */
size_t begin; /* Début de bloc de traitement */
size_t end; /* Fin d'un bloc de traitement */
GGateHunter *hunter; /* Tâche d'étude à programmer */
format = G_BIN_FORMAT(g_loaded_binary_get_format(binary));
arch = g_exe_format_get_target_machine(G_EXE_FORMAT(format));
if (strcmp(arch, "armv7") == 0)
hops = get_armv7_hunting_ops();
else
{
g_plugin_module_log_variadic_message(plugin, LMT_WARNING,
_("No suitable backend to track syscalls!"));
goto pbd_exit;
}
g_binary_format_lock_symbols_rd(format);
sym_count = g_binary_format_count_symbols(format);
run_size = compute_run_size(sym_count, &runs_count);
id = gtk_status_stack_add_activity(status, _("Looking for Linux syscalls..."), sym_count);
queue = get_work_queue();
gid = g_work_queue_define_work_group(queue);
for (i = 0; i < runs_count; i++)
{
begin = i * run_size;
if ((i + 1) == runs_count)
end = sym_count;
else
end = begin + run_size;
hunter = g_gate_hunter_new(plugin, binary, context, begin, end, id, hops);
g_work_queue_schedule_work(queue, G_DELAYED_WORK(hunter), gid);
}
g_work_queue_wait_for_completion(queue, gid);
g_work_queue_delete_work_group(queue, gid);
gtk_status_stack_remove_activity(status, id);
g_binary_format_unlock_symbols_rd(format);
pbd_exit:
g_object_unref(G_OBJECT(format));
}