diff options
Diffstat (limited to 'src/analysis')
-rw-r--r-- | src/analysis/content-int.h | 5 | ||||
-rw-r--r-- | src/analysis/content.c | 25 | ||||
-rw-r--r-- | src/analysis/content.h | 3 | ||||
-rw-r--r-- | src/analysis/contents/file.c | 47 | ||||
-rw-r--r-- | src/analysis/contents/restricted.c | 47 | ||||
-rw-r--r-- | src/analysis/disass/area.c | 6 |
6 files changed, 122 insertions, 11 deletions
diff --git a/src/analysis/content-int.h b/src/analysis/content-int.h index 24cea81..558e32c 100644 --- a/src/analysis/content-int.h +++ b/src/analysis/content-int.h @@ -41,6 +41,9 @@ typedef void (* compute_checksum_fc) (GBinContent *, GChecksum *); /* Détermine le nombre d'octets lisibles. */ typedef phys_t (* compute_size_fc) (const GBinContent *); +/* Avance la tête de lecture d'une certaine quantité de données. */ +typedef bool (* seek_fc) (const GBinContent *, vmpa2t *, phys_t); + /* Donne accès à une portion des données représentées. */ typedef const bin_t * (* get_raw_access_fc) (const GBinContent *, vmpa2t *, phys_t); @@ -82,6 +85,8 @@ struct _GBinContentIface compute_size_fc compute_size; /* Calcul de la taille totale */ + seek_fc seek; /* Avancée de tête de lecture */ + get_raw_access_fc get_raw_access; /* Accès brut à une position */ read_raw_fc read_raw; /* Lecture brute */ diff --git a/src/analysis/content.c b/src/analysis/content.c index 4b4645f..898bf43 100644 --- a/src/analysis/content.c +++ b/src/analysis/content.c @@ -216,6 +216,31 @@ phys_t g_binary_content_compute_size(const GBinContent *content) * * * Paramètres : content = contenu binaire à venir lire. * * addr = position de la tête de lecture. * +* length = quantité d'octets à provisionner. * +* * +* Description : Avance la tête de lecture d'une certaine quantité de données.* +* * +* Retour : Bilan de l'opération : true en cas de succès, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_binary_content_seek(const GBinContent *content, vmpa2t *addr, phys_t length) +{ + GBinContentIface *iface; /* Interface utilisée */ + + iface = G_BIN_CONTENT_GET_IFACE(content); + + return iface->seek(content, addr, length); + +} + + +/****************************************************************************** +* * +* Paramètres : content = contenu binaire à venir lire. * +* addr = position de la tête de lecture. * * length = quantité d'octets à lire. * * * * Description : Donne accès à une portion des données représentées. * diff --git a/src/analysis/content.h b/src/analysis/content.h index f1e5bbf..4ec4f61 100644 --- a/src/analysis/content.h +++ b/src/analysis/content.h @@ -69,6 +69,9 @@ const gchar *g_binary_content_get_checksum(GBinContent *); /* Détermine le nombre d'octets lisibles. */ phys_t g_binary_content_compute_size(const GBinContent *); +/* Avance la tête de lecture d'une certaine quantité de données. */ +bool g_binary_content_seek(const GBinContent *, vmpa2t *, phys_t); + /* Donne accès à une portion des données représentées. */ const bin_t *g_binary_content_get_raw_access(const GBinContent *, vmpa2t *, phys_t); diff --git a/src/analysis/contents/file.c b/src/analysis/contents/file.c index 95cfd5d..e7bebd0 100644 --- a/src/analysis/contents/file.c +++ b/src/analysis/contents/file.c @@ -85,6 +85,9 @@ static void g_file_content_compute_checksum(GFileContent *, GChecksum *); /* Détermine le nombre d'octets lisibles. */ static phys_t g_file_content_compute_size(const GFileContent *); +/* Avance la tête de lecture d'une certaine quantité de données. */ +static bool g_file_content_seek(const GFileContent *, vmpa2t *, phys_t); + /* Donne accès à une portion des données représentées. */ static const bin_t *g_file_content_get_raw_access(const GFileContent *, vmpa2t *, phys_t); @@ -183,6 +186,8 @@ static void g_file_content_interface_init(GBinContentInterface *iface) iface->compute_size = (compute_size_fc)g_file_content_compute_size; + iface->seek = (seek_fc)g_file_content_seek; + iface->get_raw_access = (get_raw_access_fc)g_file_content_get_raw_access; iface->read_raw = (read_raw_fc)g_file_content_read_raw; @@ -479,31 +484,59 @@ static phys_t g_file_content_compute_size(const GFileContent *content) * * * Paramètres : content = contenu binaire à venir lire. * * addr = position de la tête de lecture. * -* length = quantité d'octets à lire. * +* length = quantité d'octets à provisionner. * * * -* Description : Donne accès à une portion des données représentées. * +* Description : Avance la tête de lecture d'une certaine quantité de données.* * * -* Retour : Pointeur vers les données à lire ou NULL en cas d'échec. * +* Retour : Bilan de l'opération : true en cas de succès, false sinon. * * * * Remarques : - * * * ******************************************************************************/ -static const bin_t *g_file_content_get_raw_access(const GFileContent *content, vmpa2t *addr, phys_t length) +static bool g_file_content_seek(const GFileContent *content, vmpa2t *addr, phys_t length) { phys_t offset; /* Emplacement de départ */ offset = get_phy_addr(addr); if (offset == VMPA_NO_PHYSICAL) - return NULL; + return false; if ((offset + length) >= get_mrange_length(&content->range)) - return NULL; + return false; advance_vmpa(addr, length); - return &content->data[offset]; + return true; + +} + + +/****************************************************************************** +* * +* Paramètres : content = contenu binaire à venir lire. * +* addr = position de la tête de lecture. * +* length = quantité d'octets à lire. * +* * +* Description : Donne accès à une portion des données représentées. * +* * +* Retour : Pointeur vers les données à lire ou NULL en cas d'échec. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static const bin_t *g_file_content_get_raw_access(const GFileContent *content, vmpa2t *addr, phys_t length) +{ + phys_t offset; /* Emplacement de départ */ + bool allowed; /* Capacité d'avancer ? */ + + offset = get_phy_addr(addr); + + allowed = g_file_content_seek(content, addr, length); + + return (allowed ? &content->data[offset] : NULL); } diff --git a/src/analysis/contents/restricted.c b/src/analysis/contents/restricted.c index e342242..1f996d1 100644 --- a/src/analysis/contents/restricted.c +++ b/src/analysis/contents/restricted.c @@ -69,6 +69,9 @@ static void g_restricted_content_finalize(GRestrictedContent *); /* Calcule une empreinte unique (SHA256) pour les données. */ static void g_restricted_content_compute_checksum(GRestrictedContent *, GChecksum *); +/* Avance la tête de lecture d'une certaine quantité de données. */ +static bool g_restricted_content_seek(const GRestrictedContent *, vmpa2t *, phys_t); + /* Donne accès à une portion des données représentées. */ static const bin_t *g_restricted_content_get_raw_access(const GRestrictedContent *, vmpa2t *, phys_t); @@ -161,6 +164,8 @@ static void g_restricted_content_interface_init(GBinContentInterface *iface) { iface->compute_checksum = (compute_checksum_fc)g_restricted_content_compute_checksum; + iface->seek = (seek_fc)g_restricted_content_seek; + iface->get_raw_access = (get_raw_access_fc)g_restricted_content_get_raw_access; iface->read_raw = (read_raw_fc)g_restricted_content_read_raw; @@ -286,6 +291,48 @@ static void g_restricted_content_compute_checksum(GRestrictedContent *content, G * * * Paramètres : content = contenu binaire à venir lire. * * addr = position de la tête de lecture. * +* length = quantité d'octets à provisionner. * +* * +* Description : Avance la tête de lecture d'une certaine quantité de données.* +* * +* Retour : Bilan de l'opération : true en cas de succès, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool g_restricted_content_seek(const GRestrictedContent *content, vmpa2t *addr, phys_t length) +{ + bool result; /* Bilan de lecture à renvoyer */ + vmpa2t old; /* Copie de sauvegarde */ + + if (!mrange_contains_addr(&content->range, addr)) + { + result = false; + goto bad_range; + } + + copy_vmpa(&old, addr); + + result = g_binary_content_seek(content->internal, addr, length); + + if (result && !mrange_contains_addr_inclusive(&content->range, addr)) + { + copy_vmpa(addr, &old); + result = false; + } + + bad_range: + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : content = contenu binaire à venir lire. * +* addr = position de la tête de lecture. * * length = quantité d'octets à lire. * * * * Description : Donne accès à une portion des données représentées. * diff --git a/src/analysis/disass/area.c b/src/analysis/disass/area.c index b1d4bb1..c9612af 100644 --- a/src/analysis/disass/area.c +++ b/src/analysis/disass/area.c @@ -206,11 +206,9 @@ static bool is_range_blank_in_mem_area_v2(mem_area_v2 *area, phys_t start, phys_ { bool result; /* Résultat à renvoyer */ - if ((start + len) > get_mrange_length(&area->range)) - result = false; + assert((start + len) <= get_mrange_length(&area->range)); - else - result = !test_in_bit_field(area->processed, start, len); + result = !test_in_bit_field(area->processed, start, len); return result; |