diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2020-04-13 22:53:32 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2020-04-13 22:53:32 (GMT) |
commit | 0794024b412604ae5e5aca0f104b5a8f3ec5412c (patch) | |
tree | c5b73975561cf95e9c65f84b27423f218ffab2b0 /src/format | |
parent | e75a1aea506869d441fc084f78102367be1f9ed2 (diff) |
Avoided to look for syscalls in a kernel binary.
Diffstat (limited to 'src/format')
-rw-r--r-- | src/format/format-int.h | 45 | ||||
-rw-r--r-- | src/format/format.c | 129 | ||||
-rw-r--r-- | src/format/format.h | 33 | ||||
-rw-r--r-- | src/format/symbol-int.h | 6 |
4 files changed, 203 insertions, 10 deletions
diff --git a/src/format/format-int.h b/src/format/format-int.h index c8f2b1a..4ef9793 100644 --- a/src/format/format-int.h +++ b/src/format/format-int.h @@ -29,6 +29,7 @@ #include "preload.h" +#include "../glibext/objhole.h" #include "../gtkext/gtkstatusstack.h" #include "../mangling/demangler.h" @@ -56,6 +57,18 @@ typedef void (* format_complete_analysis_fc) (GBinFormat *, wgroup_id_t, GtkStat /* Rythme des allocations pour les entrées de code */ #define EXTRA_POINT_BLOCK 20 +/* Informations glissées dans la structure GObject de GBinFormat */ +typedef union _fmt_obj_extra +{ + struct + { + FormatFlag flags; /* Informations complémentaires*/ + + }; + + gint lock; /* Gestion d'accès aux fanions */ + +} fmt_obj_extra; /* Description d'une erreur */ typedef struct _fmt_error @@ -67,7 +80,6 @@ typedef struct _fmt_error } fmt_error; - /* Format binaire générique (instance) */ struct _GBinFormat { @@ -99,8 +111,39 @@ struct _GBinFormat gint error_locked; /* Statut d'accès à la liste */ #endif +#if __SIZEOF_INT__ == __SIZEOF_LONG__ + + /** + * L'inclusion des informations suivantes dépend de l'architecture. + * + * Si la structure GObject possède un trou, on remplit de préférence + * ce dernier. + */ + + fmt_obj_extra extra; /* Externalisation embarquée */ + +#endif + }; +/** + * Accès aux informations éventuellement déportées. + */ + +#if __SIZEOF_INT__ == __SIZEOF_LONG__ + +# define INIT_BIN_FORMAT_EXTRA(fmt) fmt->extra.lock = 0 + +# define GET_BIN_FORMAT_EXTRA(fmt) &fmt->extra + +#else + +# define INIT_BIN_FORMAT_EXTRA(fmt) INIT_GOBJECT_EXTRA(G_OBJECT(fmt)) + +# define GET_BIN_FORMAT_EXTRA(fmt) GET_GOBJECT_EXTRA(G_OBJECT(fmt), fmt_obj_extra) + +#endif + /* Format binaire générique (classe) */ struct _GBinFormatClass { diff --git a/src/format/format.c b/src/format/format.c index 533d641..2be7d5c 100644 --- a/src/format/format.c +++ b/src/format/format.c @@ -123,6 +123,8 @@ static void g_binary_format_class_init(GBinFormatClass *klass) static void g_binary_format_init(GBinFormat *format) { + INIT_BIN_FORMAT_EXTRA(format); + g_rw_lock_init(&format->pt_lock); format->info = g_preload_info_new(); @@ -288,6 +290,133 @@ GBinContent *g_binary_format_get_content(const GBinFormat *format) /****************************************************************************** * * +* Paramètres : format = format à venir modifier. * +* flag = drapeau d'information complémentaire à planter. * +* * +* Description : Ajoute une information complémentaire à un format. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_binary_format_set_flag(GBinFormat *format, FormatFlag flag) +{ + bool result; /* Bilan à retourner */ + fmt_obj_extra *extra; /* Données insérées à modifier */ + + extra = GET_BIN_FORMAT_EXTRA(format); + + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + + result = !(extra->flags & flag); + + extra->flags |= flag; + + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : format = format à venir modifier. * +* flag = drapeau d'information complémentaire à planter. * +* * +* Description : Retire une information complémentaire à un format. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_binary_format_unset_flag(GBinFormat *format, FormatFlag flag) +{ + bool result; /* Bilan à retourner */ + fmt_obj_extra *extra; /* Données insérées à modifier */ + + extra = GET_BIN_FORMAT_EXTRA(format); + + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + + result = (extra->flags & flag); + + extra->flags &= ~flag; + + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : format = format à venir consulter. * +* flag = drapeau d'information à rechercher. * +* * +* Description : Détermine si un format possède un fanion particulier. * +* * +* Retour : Bilan de la détection. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_binary_format_has_flag(const GBinFormat *format, FormatFlag flag) +{ + bool result; /* Bilan à retourner */ + fmt_obj_extra *extra; /* Données insérées à modifier */ + + extra = GET_BIN_FORMAT_EXTRA(format); + + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + + result = (extra->flags & flag); + + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : format = format à venir consulter. * +* * +* Description : Fournit les particularités du format. * +* * +* Retour : Somme de tous les fanions associés au format. * +* * +* Remarques : - * +* * +******************************************************************************/ + +FormatFlag g_binary_format_get_flags(const GBinFormat *format) +{ + FormatFlag result; /* Fanions à retourner */ + fmt_obj_extra *extra; /* Données insérées à modifier */ + + extra = GET_BIN_FORMAT_EXTRA(format); + + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + + result = (extra->flags & FFL_MASK); + + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : format = description de l'exécutable à consulter. * * * * Description : Indique la désignation interne du format. * diff --git a/src/format/format.h b/src/format/format.h index 626bb8a..f11b1db 100644 --- a/src/format/format.h +++ b/src/format/format.h @@ -40,14 +40,23 @@ /* Depuis ../mangling/demangler.h : Décodeur de désignations générique (instance) */ typedef struct _GCompDemangler GCompDemangler; +/* Indications supplémentaires liées aux formats */ +typedef enum _FormatFlag +{ + FFL_NONE = (0 << 0), /* Aucune propriété */ + FFL_RUN_IN_KERNEL_SPACE = (1 << 0), /* Exécution en espace noyau */ + + FFL_MASK = (1 << 1) - 1, /* Indication de nature */ +} FormatFlag; -#define G_TYPE_BIN_FORMAT g_binary_format_get_type() -#define G_BIN_FORMAT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_binary_format_get_type(), GBinFormat)) -#define G_IS_BIN_FORMAT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_binary_format_get_type())) -#define G_BIN_FORMAT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_BIN_FORMAT, GBinFormatClass)) -#define G_IS_BIN_FORMAT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_BIN_FORMAT)) -#define G_BIN_FORMAT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_BIN_FORMAT, GBinFormatClass)) + +#define G_TYPE_BIN_FORMAT g_binary_format_get_type() +#define G_BIN_FORMAT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_BIN_FORMAT, GBinFormat)) +#define G_IS_BIN_FORMAT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_BIN_FORMAT)) +#define G_BIN_FORMAT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_BIN_FORMAT, GBinFormatClass)) +#define G_IS_BIN_FORMAT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_BIN_FORMAT)) +#define G_BIN_FORMAT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_BIN_FORMAT, GBinFormatClass)) /* Format binaire générique (instance) */ @@ -63,6 +72,18 @@ GType g_binary_format_get_type(void); /* Fournit une référence vers le contenu binaire analysé. */ GBinContent *g_binary_format_get_content(const GBinFormat *); +/* Ajoute une information complémentaire à un format. */ +bool g_binary_format_set_flag(GBinFormat *, FormatFlag); + +/* Retire une information complémentaire à un format. */ +bool g_binary_format_unset_flag(GBinFormat *, FormatFlag); + +/* Détermine si un format possède un fanion particulier. */ +bool g_binary_format_has_flag(const GBinFormat *, FormatFlag); + +/* Fournit les particularités du format. */ +FormatFlag g_binary_format_get_flags(const GBinFormat *); + /* Indique la désignation interne du format. */ const char *g_binary_format_get_name(const GBinFormat *); diff --git a/src/format/symbol-int.h b/src/format/symbol-int.h index 5e77a4d..99cee88 100644 --- a/src/format/symbol-int.h +++ b/src/format/symbol-int.h @@ -34,7 +34,7 @@ typedef char * (* get_symbol_label_fc) (const GBinSymbol *); -/* Informations glissées dans la structure GObject de GArchInstruction */ +/* Informations glissées dans la structure GObject de GBinSymbol */ typedef union _sym_obj_extra { struct @@ -82,9 +82,9 @@ struct _GBinSymbol #if __SIZEOF_INT__ == __SIZEOF_LONG__ -# define INIT_BIN_SYMBOL_EXTRA(sym) ins->extra.lock = 0 +# define INIT_BIN_SYMBOL_EXTRA(sym) sym->extra.lock = 0 -# define GET_BIN_SYMBOL_EXTRA(sym) &ins->extra +# define GET_BIN_SYMBOL_EXTRA(sym) &sym->extra #else |