summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/analysis/binary.c4
-rw-r--r--src/common/sort.c31
-rw-r--r--src/common/sort.h4
-rw-r--r--src/format/format-int.h5
-rw-r--r--src/format/format.c189
-rw-r--r--src/format/format.h14
-rw-r--r--src/format/symiter.c5
7 files changed, 243 insertions, 9 deletions
diff --git a/src/analysis/binary.c b/src/analysis/binary.c
index f38cf66..1a93470 100644
--- a/src/analysis/binary.c
+++ b/src/analysis/binary.c
@@ -1694,7 +1694,7 @@ bool *g_loaded_binary_display_decomp_lines(GLoadedBinary *binary)
* Remarques : - *
* *
******************************************************************************/
-
+#include "../gui/core/global.h"
void ack_completed_disassembly(GDelayedDisassembly *disass, GLoadedBinary *binary)
{
//GRenderingLine *line; /* "Première" ligne de rendu */
@@ -1706,7 +1706,7 @@ void ack_completed_disassembly(GDelayedDisassembly *disass, GLoadedBinary *binar
-
+ g_binary_format_complete_analysis(G_BIN_FORMAT(binary->format), get_global_status());
diff --git a/src/common/sort.c b/src/common/sort.c
index 014d6c7..5cf3132 100644
--- a/src/common/sort.c
+++ b/src/common/sort.c
@@ -94,6 +94,37 @@ int sort_unsigned_long(unsigned long a, unsigned long b)
/******************************************************************************
* *
+* Paramètres : a = premier élément à consulter et comparer. *
+* b = second élément à consulter et comparer. *
+* *
+* Description : Compare une valeur de 64 bits avec une autre. *
+* *
+* Retour : Bilan de la comparaison. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+int sort_uint64_t(uint64_t a, uint64_t b)
+{
+ int result; /* Bilan à renvoyer */
+
+ if (a < b)
+ result = -1;
+
+ else if (a > b)
+ result = 1;
+
+ else
+ result = 0;
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : a = premier élément à consulter et comparer. *
* b = second élément à consulter et comparer. *
* compar = méthode de comparaison entre éléments. *
diff --git a/src/common/sort.h b/src/common/sort.h
index a887543..4ec5214 100644
--- a/src/common/sort.h
+++ b/src/common/sort.h
@@ -26,6 +26,7 @@
#include <stdbool.h>
+#include <stdint.h>
#include <stdlib.h>
@@ -36,6 +37,9 @@ int sort_boolean(bool, bool);
/* Compare une valeur avec une autre. */
int sort_unsigned_long(unsigned long, unsigned long);
+/* Compare une valeur de 64 bits avec une autre. */
+int sort_uint64_t(uint64_t, uint64_t);
+
/* Compare un pointeur avec un autre. */
int sort_pointer(const void *, const void *, __compar_fn_t);
diff --git a/src/format/format-int.h b/src/format/format-int.h
index f377ca3..5c1ae07 100644
--- a/src/format/format-int.h
+++ b/src/format/format-int.h
@@ -39,6 +39,9 @@
/* Indique le boutisme employé par le format binaire analysé. */
typedef SourceEndian (* format_get_endian_fc) (const GBinFormat *);
+/* Réalise un traitement post-désassemblage. */
+typedef void (* format_complete_analysis_fc) (GBinFormat *, GtkStatusStack *);
+
/* Procède à la décompilation complète du format. */
typedef void (* format_decompile_fc) (const GBinFormat *, void/*GCodeBuffer*/ *, const char *);
@@ -105,6 +108,8 @@ struct _GBinFormatClass
format_get_endian_fc get_endian; /* Boutisme employé */
+ format_complete_analysis_fc complete; /* Terminaison d'analyse */
+
};
diff --git a/src/format/format.c b/src/format/format.c
index 5b96b59..88367f6 100644
--- a/src/format/format.c
+++ b/src/format/format.c
@@ -64,6 +64,9 @@ static void g_binary_format_delete_duplicated_symbols(GBinFormat *);
/* Recherche le symbole associé à une adresse. */
static bool _g_binary_format_find_symbol(const GBinFormat *, const vmpa2t *, __compar_fn_t, size_t *, GBinSymbol **);
+/* Recherche un symbole particulier. */
+static bool __g_binary_format_find_symbol(const GBinFormat *, const void *, __compar_fn_t, size_t *, GBinSymbol **);
+
/* Indique le type défini pour un format binaire générique. */
@@ -369,6 +372,31 @@ void g_binary_format_activate_disassembling_context(GBinFormat *format, GProcCon
}
+/******************************************************************************
+* *
+* Paramètres : format = description de l'exécutable à manipuler. *
+* status = barre de statut à tenir informée. *
+* *
+* Description : Réalise un traitement post-désassemblage. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_binary_format_complete_analysis(GBinFormat *format, GtkStatusStack *status)
+{
+ GBinFormatClass *class; /* Classe de l'instance */
+
+ class = G_BIN_FORMAT_GET_CLASS(format);
+
+ if (class->complete != NULL)
+ class->complete(format, status);
+
+}
+
+
/* ---------------------------------------------------------------------------------- */
/* RASSEMBLEMENT ET GESTION DE SYMBOLES */
@@ -450,6 +478,26 @@ void g_binary_format_lock_unlock_symbols_wr(GBinFormat *format, bool state)
* *
* Paramètres : format = architecture à consulter via la procédure. *
* *
+* Description : Assure qu'un verrou est bien posé pour l'accès aux symboles. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+#ifndef NDEBUG
+void g_binary_format_check_for_symbols_lock(const GBinFormat *format)
+{
+ assert(g_atomic_int_get(&format->sym_locked) > 0);
+
+}
+#endif
+
+
+/******************************************************************************
+* *
+* Paramètres : format = architecture à consulter via la procédure. *
+* *
* Description : Fournit la marque de dernière modification des symboles. *
* *
* Retour : Marque de la dernière modification de la liste de symboles. *
@@ -882,11 +930,6 @@ bool g_binary_format_find_symbol_by_label(GBinFormat *format, const char *label,
static bool _g_binary_format_find_symbol(const GBinFormat *format, const vmpa2t *addr, __compar_fn_t fn, size_t *index, GBinSymbol **symbol)
{
- bool result; /* Bilan à retourner */
- void *found; /* Résultat de recherches */
-
- assert(g_atomic_int_get(&format->sym_locked) > 0);
-
/**
* Pour ce qui est des justifications quant à la vérification suivante,
* se référer aux commentaires placés dans g_binary_format_add_symbol().
@@ -894,7 +937,35 @@ static bool _g_binary_format_find_symbol(const GBinFormat *format, const vmpa2t
assert(has_phys_addr(addr));
- found = bsearch(addr, format->symbols, format->sym_count, sizeof(GBinSymbol *), fn);
+ return __g_binary_format_find_symbol(format, addr, fn, index, symbol);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : format = informations chargées à consulter. *
+* key = clef fournie pour distinguer les éléments. *
+* fn = méthode de comparaison des symboles. *
+* index = indice de l'éventuel symbole trouvé ou NULL. [OUT] *
+* symbol = éventuel symbole trouvé à déréfenrencer. [OUT] *
+* *
+* Description : Recherche un symbole particulier. *
+* *
+* Retour : true si l'opération a été un succès, false sinon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static bool __g_binary_format_find_symbol(const GBinFormat *format, const void *key, __compar_fn_t fn, size_t *index, GBinSymbol **symbol)
+{
+ bool result; /* Bilan à retourner */
+ void *found; /* Résultat de recherches */
+
+ assert(g_atomic_int_get(&format->sym_locked) > 0);
+
+ found = bsearch(key, format->symbols, format->sym_count, sizeof(GBinSymbol *), fn);
if (found != NULL)
{
@@ -913,8 +984,11 @@ static bool _g_binary_format_find_symbol(const GBinFormat *format, const vmpa2t
else
{
- *symbol = NULL;
+ if (symbol != NULL)
+ *symbol = NULL;
+
result = false;
+
}
return result;
@@ -926,6 +1000,45 @@ static bool _g_binary_format_find_symbol(const GBinFormat *format, const vmpa2t
* *
* Paramètres : format = informations chargées à consulter. *
* addr = adresse à cibler lors des recherches. *
+* index = indice de l'éventuel symbole trouvé. [OUT] *
+* *
+* Description : Recherche l'indice du symbole correspondant à une adresse. *
+* *
+* Retour : true si l'opération a été un succès, false sinon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool g_binary_format_find_symbol_index_at(GBinFormat *format, const vmpa2t *addr, size_t *index)
+{
+ bool result; /* Bilan à retourner */
+
+ int find_symbol(const vmpa2t *addr, const GBinSymbol **sym)
+ {
+ const mrange_t *range; /* Espace mémoire parcouru */
+
+ range = g_binary_symbol_get_range(*sym);
+
+ return cmp_vmpa(addr, get_mrange_addr(range));
+
+ }
+
+ g_binary_format_lock_symbols_rd(format);
+
+ result = _g_binary_format_find_symbol(format, addr, (__compar_fn_t)find_symbol, index, NULL);
+
+ g_binary_format_unlock_symbols_rd(format);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : format = informations chargées à consulter. *
+* addr = adresse à cibler lors des recherches. *
* symbol = éventuel symbole trouvé à déréfenrencer. [OUT] *
* *
* Description : Recherche le symbole correspondant à une adresse. *
@@ -1056,6 +1169,68 @@ bool g_binary_format_find_next_symbol_at(GBinFormat *format, const vmpa2t *addr,
/******************************************************************************
* *
* Paramètres : format = informations chargées à consulter. *
+* range = zone à cibler lors des recherches. *
+* index = indice de l'éventuel symbole trouvé. [OUT] *
+* *
+* Description : Recherche le premier symbole inclus dans une zone mémoire. *
+* *
+* Retour : true si l'opération a été un succès, false sinon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool g_binary_format_find_first_symbol_inside(GBinFormat *format, const mrange_t *range, size_t *index)
+{
+ bool result; /* Bilan à retourner */
+ const GBinSymbol *prev; /* Symbole précédent */
+ const mrange_t *srange; /* Espace mémoire associé */
+ int ret; /* Bilan de comparaison */
+
+ int find_symbol(const mrange_t *ref_range, const GBinSymbol **sym)
+ {
+ const mrange_t *sym_range; /* Espace mémoire parcouru */
+
+ int ret;
+
+ sym_range = g_binary_symbol_get_range(*sym);
+
+ ret = cmp_mrange_with_vmpa(ref_range, get_mrange_addr(sym_range));
+
+ ret *= -1;
+
+ return ret;
+
+ }
+
+ g_rw_lock_reader_lock(&format->syms_lock);
+
+ result = __g_binary_format_find_symbol(format, range, (__compar_fn_t)find_symbol, index, NULL);
+
+ if (result)
+ while (*index > 0)
+ {
+ prev = format->symbols[*index - 1];
+ srange = g_binary_symbol_get_range(prev);
+
+ ret = cmp_mrange_with_vmpa(range, get_mrange_addr(srange));
+ assert(ret <= 0);
+
+ if (ret < 0) break;
+ else (*index)--;
+
+ }
+
+ g_rw_lock_reader_unlock(&format->syms_lock);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : format = informations chargées à consulter. *
* addr = adresse à cibler lors des recherches. *
* strict = indication de tolérance acceptée. *
* symbol = éventuel symbole trouvé à déréfenrencer. [OUT] *
diff --git a/src/format/format.h b/src/format/format.h
index 9a3a6e3..4052482 100644
--- a/src/format/format.h
+++ b/src/format/format.h
@@ -70,6 +70,9 @@ void g_binary_format_preload_disassembling_context(GBinFormat *, GProcContext *,
/* Définit les points de départ d'un contexte de désassemblage. */
void g_binary_format_activate_disassembling_context(GBinFormat *, GProcContext *, GtkStatusStack *);
+/* Réalise un traitement post-désassemblage. */
+void g_binary_format_complete_analysis(GBinFormat *, GtkStatusStack *);
+
/* ---------------------- RASSEMBLEMENT ET GESTION DE SYMBOLES ---------------------- */
@@ -87,6 +90,11 @@ void g_binary_format_lock_unlock_symbols_wr(GBinFormat *, bool);
#define g_binary_format_lock_symbols_wr(f) g_binary_format_lock_unlock_symbols_wr(f, true)
#define g_binary_format_unlock_symbols_wr(f) g_binary_format_lock_unlock_symbols_wr(f, false)
+/* Assure qu'un verrou est bien posé pour l'accès aux symboles. */
+#ifndef NDEBUG
+void g_binary_format_check_for_symbols_lock(const GBinFormat *);
+#endif
+
/* Fournit la marque de dernière modification des symboles. */
unsigned int g_binary_format_get_symbols_stamp(const GBinFormat *);
@@ -108,6 +116,9 @@ char *create_string_label(GBinFormat *, const vmpa2t *, size_t);
/* Recherche le symbole correspondant à une étiquette. */
bool g_binary_format_find_symbol_by_label(GBinFormat *, const char *, GBinSymbol **);
+/* Recherche l'indice du symbole correspondant à une adresse. */
+bool g_binary_format_find_symbol_index_at(GBinFormat *, const vmpa2t *, size_t *);
+
/* Recherche le symbole correspondant à une adresse. */
bool g_binary_format_find_symbol_at(GBinFormat *, const vmpa2t *, GBinSymbol **);
@@ -117,6 +128,9 @@ bool g_binary_format_find_symbol_for(GBinFormat *, const vmpa2t *, GBinSymbol **
/* Recherche le symbole suivant celui lié à une adresse. */
bool g_binary_format_find_next_symbol_at(GBinFormat *, const vmpa2t *, GBinSymbol **);
+/* Recherche le premier symbole inclus dans une zone mémoire. */
+bool g_binary_format_find_first_symbol_inside(GBinFormat *, const mrange_t *, size_t *);
+
/* Recherche le symbole correspondant à une adresse. */
bool g_binary_format_resolve_symbol(GBinFormat *, const vmpa2t *, bool, GBinSymbol **, phys_t *);
diff --git a/src/format/symiter.c b/src/format/symiter.c
index 74b4abb..230b4ac 100644
--- a/src/format/symiter.c
+++ b/src/format/symiter.c
@@ -63,6 +63,11 @@ sym_iter_t *create_symbol_iterator(GBinFormat *format, size_t index)
{
sym_iter_t *result; /* Structure à retourner */
+#ifndef NDEBUG
+ if (index > 0)
+ g_binary_format_check_for_symbols_lock(format);
+#endif
+
result = (sym_iter_t *)malloc(sizeof(sym_iter_t));
g_object_ref(G_OBJECT(format));