web-dev-qa-db-fra.com

Utilisation de grep pour rechercher des chaînes hexadécimales dans un fichier

J'ai essayé toute la journée pour que cela fonctionne. Est-ce que quelqu'un sait comment obtenir grep, ou quelque chose de similaire, pour récupérer des décalages de chaînes hexadécimales dans un fichier?

J'ai un tas d'hexdumps dont j'ai besoin pour vérifier les chaînes, puis réexécuter et vérifier si la valeur a changé.

J'ai essayé hexdump et dd, mais le problème est parce que c'est un flux, je perds mon décalage pour les fichiers.

Quelqu'un doit avoir eu ce problème et une solution de contournement. Que puis-je faire?

Pour clarifier, j'ai une série de régions de mémoire sous-évaluées de GDB.

J'essaie de réduire un nombre en recherchant tous les endroits où le numéro est stocké, puis en le faisant à nouveau et en vérifiant si la nouvelle valeur est stockée au même emplacement de mémoire.

Je ne peux pas faire quoi que ce soit avec grep parce que je recherche des valeurs hexadécimales, donc toutes les fois que j'ai essayé (comme un bazillion, en gros), cela ne me donnera pas la sortie correcte.

Les vidages hexadécimaux ne sont que des fichiers binaires complets, les paterns sont dans les valeurs flottantes à larges donc 8? octets?

Les motifs n'enveloppent pas les lignes que je connais. Je suis conscient de ce que cela change, et je peux faire le même processus et comparer les listes pour voir quelle correspondance. Les décharges hexadécimales finissent normalement (au total) 100 mégaoctets.

Perl POURRAIT être une option, mais à ce stade, je suppose que mon manque de connaissances avec bash et ses outils est le principal coupable.

C'est un peu difficile d'expliquer la sortie que je reçois car je ne reçois vraiment aucune sortie ..

J'anticipe (et j'attends) quelque chose dans le sens de:

<offset>:<searched value>

Quelle est la sortie assez standard que j'obtiendrais normalement avec grep -URbFo <searchterm> . > <output>

Le problème est que lorsque j'essaie de rechercher des valeurs hexadécimales, j'obtiens le problème de ne pas simplement rechercher les valeurs hexadécimales, donc si je recherche 00, je devrais obtenir un million de visites, car c'est toujours l'espace vide, mais à la place, sa recherche pour 00 comme texte, donc en hex, 3030. Une idée?

Je peux le forcer à utiliser hexdump ou quelque chose du lien, mais comme c'est un flux, il ne me donnera pas les décalages et le nom de fichier dans lesquels il a trouvé une correspondance.

En utilisant grep -b l'option ne semble pas fonctionner non plus, j'ai essayé tous les indicateurs qui semblaient utiles à ma situation, et rien n'a fonctionné.

En utilisant xxd -u /usr/bin/xxd à titre d'exemple, j'obtiens une sortie qui serait utile, mais je ne peux pas l'utiliser pour la recherche ..

0004760: 73CC 6446 161E 266A 3140 5E79 4D37 FDC6  s.dF..&j1@^yM7..
0004770: BF04 0E34 A44E 5BE7 229F 9EEF 5F4F DFFA  ...4.N[."..._O..
0004780: FADE 0C01 0000 000C 0000 0000 0000 0000  ................

Belle sortie, juste ce que je veux voir, mais ça ne marche pas pour moi dans cette situation ..

Voici certaines des choses que j'ai essayées depuis la publication de ceci:

xxd -u /usr/bin/xxd | grep 'DF'
00017b0: 4010 8D05 0DFF FF0A 0300 53E3 0610 A003  @.........S.....

root# grep -ibH "df" /usr/bin/xxd
Binary file /usr/bin/xxd matches
xxd -u /usr/bin/xxd | grep -H 'DF'
(standard input):00017b0: 4010 8D05 0DFF FF0A 0300 53E3 0610 A003  @.........S.....
26
user650649

Nous avons essayé plusieurs choses avant d'arriver à une solution acceptable:

xxd -u /usr/bin/xxd | grep 'DF'
00017b0: 4010 8D05 0DFF FF0A 0300 53E3 0610 A003  @.........S.....


root# grep -ibH "df" /usr/bin/xxd
Binary file /usr/bin/xxd matches
xxd -u /usr/bin/xxd | grep -H 'DF'
(standard input):00017b0: 4010 8D05 0DFF FF0A 0300 53E3 0610 A003  @.........S.....

Ensuite, nous avons pu obtenir des résultats utilisables avec

xxd -u /usr/bin/xxd > /tmp/xxd.hex ; grep -H 'DF' /tmp/xxd

Notez que l'utilisation d'une cible de recherche simple comme `` DF '' ne correspondra pas correctement aux caractères qui s'étendent sur les limites d'octets, c'est-à-dire.

xxd -u /usr/bin/xxd | grep 'DF'
00017b0: 4010 8D05 0DFF FF0A 0300 53E3 0610 A003  @.........S.....
--------------------^^

Nous utilisons donc une expression rationnelle ORed pour rechercher "DF" OR "DF" (le searchTarget précédé ou suivi d'un caractère d'espace).

Le résultat final semble être

xxd -u -ps -c 10000000000 DumpFile > DumpFile.hex
egrep ' DF|DF ' Dumpfile.hex

0001020: 0089 0424 8D95 D8F5 FFFF 89F0 E8DF F6FF  ...$............
-----------------------------------------^^
0001220: 0C24 E871 0B00 0083 F8FF 89C3 0F84 DF03  .$.q............
--------------------------------------------^^
12
shellter

Cela semble fonctionner pour moi:

grep --only-matching --byte-offset --binary --text --Perl-regexp "<\x-hex pattern>" <file>

forme courte:

grep -obUaP "<\x-hex pattern>" <file>

Exemple:

grep -obUaP "\x01\x02" /bin/grep

Sortie (binaire cygwin):

153: <\x01\x02>
33210: <\x01\x02>
53453: <\x01\x02>

Vous pouvez donc à nouveau le récupérer pour extraire les décalages. Mais n'oubliez pas d'utiliser à nouveau le mode binaire.

56
Fr0sT

Il y a aussi un outil assez pratique appelé binwalk , écrit en python, qui fournit une correspondance de modèle binaire (et bien plus encore). Voici comment rechercher une chaîne binaire, qui génère l'offset en décimal et hexadécimal (à partir de docs ):

$ binwalk -R "\x00\x01\x02\x03\x04" firmware.bin
DECIMAL     HEX         DESCRIPTION
--------------------------------------------------------------------------
377654      0x5C336     Raw string signature
11
Pierz

grep a un commutateur -P permettant d'utiliser la syntaxe d'expression rationnelle de Perl, l'expression régulière de Perl permet de regarder les octets, en utilisant la syntaxe\x ...

vous pouvez donc rechercher une chaîne hexadécimale donnée dans un fichier avec: grep -aP "\xdf"

mais la sortie ne sera pas très utile; en effet, il vaut mieux faire une regexp sur la sortie hexdump;

Le grep -P peut cependant être utile pour simplement trouver des fichiers correspondant à un modèle binaire donné. Ou pour faire une requête binaire d'un modèle qui se produit réellement dans le texte (voir par exemple Comment faire une expression rationnelle des idéogrammes CJK (dans utf-8) )

9
Pablo Saratxaga

Si vous souhaitez rechercher des chaînes imprimables , vous pouvez utiliser:

strings -ao filename | grep string

les chaînes afficheront toutes les chaînes imprimables à partir d'un binaire avec décalages, et grep cherchera à l'intérieur.

Si vous souhaitez rechercher une chaîne binaire , voici votre ami:

5
jm666

Je viens de l'utiliser:

grep -c $'\x0c' filename

Pour rechercher et compter un caractère de contrôle de page dans le fichier.

Donc, pour inclure un décalage dans la sortie:

grep -b -o $'\x0c' filename | less

Je passe simplement le résultat à moins parce que le caractère que je recherche ne s'imprime pas bien et moins affiche les résultats proprement. Exemple de sortie:

21:^L
23:^L
2005:^L
4
user3510073