Recherche Binaire ou Comment rechercher une image dans un *.exe

Description

Beaucoup d'entres-vous sont persuadés qu'on ne peut que rechercher du texte
avec les fonctions de recherches classiques (Pos & PosEx ...)

Eh ben .... c'est totalement faux !!!
en effet il suffit de charger, correctement, les données(Binaires) à rechercher
dans une chaine de caractères et faire de même avec le fichier(binaire) servant
à la recherche.

Pour preuve, ci-joint le code qui recherche une Image dans une Application ou
un Fichier Dfm en Binaire le tout utilisant au choix :
PosEx (version ASM)
ou
BMHPascalNatifEx (une version du Boyer-Moore en pure pascal)

en ce qui concerne la, soit disant, limite de recherche de la table de saut
du Boyer-Moore à 256 caractères ...
Ici l'image recherchée fait 144 507 Octets
Donc bien au-dessus des 256 caractères

Le code compile aussi avec les versions Unicode de Delphi
Bien sur il y a des warnings (conversion implicite de AnsiString en string)
c'est normal et la correction est simple si on devait en avoir besoin ...

Mais le but ici était juste de prouver que l'on peut rechercher du binaire
avec des fonctions, prévues de base, pour les chaines de caractères ;)

Pour bien comprendre le code ...
Il faut faire abstraction du fait que string = chaine de caractères et basta !
Il faut voir le type string comme un conteneur multi-formats
et en respectant une règle simple :
Initialiser la taille de la string avant d'y copier des données

en respectant cela on peut y stocker tout et n'importe quoi

Mais quel est l'intérêt ? me direz-vous !
Il faut allouer l'espace nescessaire par un SetLength
tout comme les Pointeurs avec un GetMem mais contrairement à ces derniers
pas besoin de libérer les string alloués ... Delphi s'en charge
(autant de risque de fuite de mémoire en moins)

On peut utiliser toutes les fonctions prévues pour les string (recherche, copie ... )
Bien sur il est inutile d'essayer de les afficher dans un TMemo ou autre ^^

La flexibilitée de cette méthode est un atout non négligeable
surtout pour stocker et relire des données de formats différents
le tout dans un seul et même fichier

Et bien sur, les données sont toujours utilisables. Il y a 2 exemples dans le Zip
Une image chargé dans une string pour la démo de recherche
- chargement des données dans une string
- j'ai changé le mode d'affectation (MoveMemory) l'ancien code est en commentaire
- on effectue une recherche avec des fonctions standards pour string
- si trouvé on recopie les données trouvées avec la fonction copie
- et on affiche l'image trouvée à l'écran avec StrToImage (preuve du fonctionnement) ^^
- StrToImage ne sert qu'à afficher une image Jpeg contenue dans une string
Et pour varier un peu 2 sons au format wav
- chargement des données dans une string
- et utilisation direct des deux string pour jouer les sons avec PlaySound



@+ Cirec

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.