summaryrefslogtreecommitdiff
path: root/src/format
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2020-04-13 22:53:32 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2020-04-13 22:53:32 (GMT)
commit0794024b412604ae5e5aca0f104b5a8f3ec5412c (patch)
treec5b73975561cf95e9c65f84b27423f218ffab2b0 /src/format
parente75a1aea506869d441fc084f78102367be1f9ed2 (diff)
Avoided to look for syscalls in a kernel binary.
Diffstat (limited to 'src/format')
-rw-r--r--src/format/format-int.h45
-rw-r--r--src/format/format.c129
-rw-r--r--src/format/format.h33
-rw-r--r--src/format/symbol-int.h6
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