OVH Cloud OVH Cloud

Rechercher une chaîne dans un fichier binaire

56 réponses
Avatar
Patrick Stadelmann
Hello,

Je cherche un outil (ou les paramètres appropriés à passer à un outil
standard) qui puisse me donner la position de toutes les occurrences
d'une chaîne dans un fichier (le fichier fait 50 Go en fait un "dump"
d'un disque crashé obtenu avec dd).

J'ai essayé "grep -b" mais il n'aime pas trop les parties binaires. Mon
autre option est de passer par "hexdump -C" d'abord, mais comme là ma
chaîne risque d'être à cheval sur deux lignes...

Une idée ?

Merci,

Patrick
--
Patrick Stadelmann <Patrick.Stadelmann@unine.ch>

10 réponses

1 2 3 4 5
Avatar
blanc
Patrick Stadelmann wrote:

Je cherche un outil (ou les paramètres appropriés à passer à un outil
standard) qui puisse me donner la position de toutes les occurrences
d'une chaîne dans un fichier (le fichier fait 50 Go en fait un "dump"
d'un disque crashé obtenu avec dd).


HexEdit ?
<http://www.macupdate.com/info.php/id/17562>

JPaul.
--
/==/==- Jean-Paul BLANC
/ /--/--// quelque-part (somewhere)
|/| L | en (in)
/|| = ||| FRANCE

Avatar
junk
Patrick Stadelmann wrote:

Je cherche un outil (ou les paramètres appropriés à passer à un outil
standard) qui puisse me donner la position de toutes les occurrences
d'une chaîne dans un fichier (le fichier fait 50 Go en fait un "dump"
d'un disque crashé obtenu avec dd).


Voici un programme très rapide, adapté d'un exercice fait à l'école
d'ingénieurs.

Je poste le programme sans plus d'explications pour ne pas gâcher le
plaisir des futurs étudiants. Si quelqu'un est intéressé par le code
commenté en détail, je peux le lui envoyer par email.

Version compilée : http://seriot.ch/temp/docs/binaryFind.zip

-- makefile

binaryFind: binaryFind.c
cc -O4 binaryFind.c -o binaryFind

-- binaryFind.c

/* DL/NS, 200402/200507
*
* Compte les occurrences d'une chaîne dans un flots d'octets,
* affiche les positions des occurrences, algorithme en O(n).
*/

#include <stdio.h>
#include <string.h>

int byg(const char *pattern, FILE *file);

int main(int argc, char **argv) {

FILE *file;

if (argc != 3) {
fprintf(stderr, "Usage: %s pattern filen", *argv);
return 1;
}

if ((file = fopen(argv[2], "r")) == NULL) {
perror(argv[2]);
return(1);
}

printf("found "%s" %d time(s)n",
argv[1],
byg(argv[1], file));

fclose(file);
return 0;
}

int initVectors(int *vector, const char *pattern) {
int i;
int patternLength = strlen(pattern);

for (i=0; i<128; i++) {
vector[i] = 0;
}

for (i=0; i<patternLength; i++) {
vector[pattern[i]] |= 1<<i;
}

return 0;
}

int byg(const char *pattern, FILE *file) {
char currentChar;
int foundCount = 0;
int result = 0;
int adr = -strlen(pattern);
int mask = 1 << (strlen(pattern)-1);
int vector[128];

initVectors(vector, pattern);

while(fread(&currentChar, sizeof(char), 1, file)) {
adr++;

if((currentChar >= 0) & (currentChar < 128)) {
result = vector[(char)currentChar] & (result<<1 | 1);

if (result & mask) {
foundCount++;
printf("0x%xn", adr);
}
}
}

return foundCount;
}

--
Nicolas Seriot

Avatar
filh
Nicolas Seriot wrote:


for (i=0; i<patternLength; i++) {
vector[pattern[i]] |= 1<<i;


Ohhh le beau dépacement de tableau !

Décidément les concepteurs de virus ont vraiment la part belle.

FiLH

--
Le fondement du constat bourgeois, c'est le bon sens, c'est-à-dire
une vérité qui s'arrête sur l'ordre arbitraire de celui qui la parle.
Rolland Barthes.
http://www.filh.org

Avatar
Saïd
Nicolas Seriot :
Patrick Stadelmann wrote:

Je cherche un outil (ou les paramètres appropriés à passer à un outil
standard) qui puisse me donner la position de toutes les occurrences
d'une chaîne dans un fichier (le fichier fait 50 Go en fait un "dump"
d'un disque crashé obtenu avec dd).


Voici un programme très rapide, adapté d'un exercice fait à l'école
d'ingénieurs.

Je poste le programme sans plus d'explications pour ne pas gâcher le
plaisir des futurs étudiants. Si quelqu'un est intéressé par le code
commenté en détail, je peux le lui envoyer par email.

Version compilée : http://seriot.ch/temp/docs/binaryFind.zip

-- makefile

binaryFind: binaryFind.c
cc -O4 binaryFind.c -o binaryFind

-- binaryFind.c


Ca marche pas pour les chaines de plus de 32 bits, ton programme???
Mais c'est astucieux.

--
Saïd.
C programmers never die - they're just cast into void.


Avatar
junk
Saïd wrote:

Ca marche pas pour les chaines de plus de 32 bits, ton programme???


32 caractères, pas 32 bits.

Mais c'est vrai que j'aurais dû le préciser.

--
Nicolas Seriot

Avatar
Saïd
Nicolas Seriot :
Saïd wrote:

Ca marche pas pour les chaines de plus de 32 bits, ton programme???


32 caractères, pas 32 bits.



Oui, j'ai fourché. Passe les int en unsigned long long avec un exit si
strlen(chaine)>sizeof(unsigned long long) *8 (on va dire qu'un char fait 8
bits). Ca devrait allet jusqu'a 64 caracteres.

--
Saïd.
C programmers never die - they're just cast into void.


Avatar
filh
Saïd wrote:

Nicolas Seriot :
Saïd wrote:

Ca marche pas pour les chaines de plus de 32 bits, ton programme???


32 caractères, pas 32 bits.



Oui, j'ai fourché. Passe les int en unsigned long long avec un exit si
strlen(chaine)>sizeof(unsigned long long) *8 (on va dire qu'un char fait 8
bits). Ca devrait allet jusqu'a 64 caracteres.


Ben pourquoi pas sizeof (char) ?

C'est vraiment étonnant cette tendance des programmeurs à toujours
laisser une constante en dur dans le code.

FiLH



--
Le fondement du constat bourgeois, c'est le bon sens, c'est-à-dire
une vérité qui s'arrête sur l'ordre arbitraire de celui qui la parle.
Rolland Barthes.
http://www.filh.org



Avatar
Saïd
FiLH :
Saïd wrote:

Nicolas Seriot :
Saïd wrote:

Ca marche pas pour les chaines de plus de 32 bits, ton programme???


32 caractères, pas 32 bits.



Oui, j'ai fourché. Passe les int en unsigned long long avec un exit si
strlen(chaine)>sizeof(unsigned long long) *8 (on va dire qu'un char fait 8
bits). Ca devrait allet jusqu'a 64 caracteres.


Ben pourquoi pas sizeof (char) ?



Parce que sizof(char) vaut toujours 1 en tout cas 8 ca ne s'est encore
jamais vu.

--
Saïd.
C programmers never die - they're just cast into void.




Avatar
filh
Saïd wrote:

FiLH :
Saïd wrote:

Nicolas Seriot :
Saïd wrote:

Ca marche pas pour les chaines de plus de 32 bits, ton programme???


32 caractères, pas 32 bits.



Oui, j'ai fourché. Passe les int en unsigned long long avec un exit si
strlen(chaine)>sizeof(unsigned long long) *8 (on va dire qu'un char fait 8
bits). Ca devrait allet jusqu'a 64 caracteres.


Ben pourquoi pas sizeof (char) ?



Parce que sizof(char) vaut toujours 1 en tout cas 8 ca ne s'est encore
jamais vu.


Certes j'ai un peu merdé, mais ça ne change rien que si on stocke la
chaine sur autre chose que des char à 8 bits le code devient non
portable...

Et c'est ça l'essentiel.

Dans ce cas : sizeof(char) * NBY

FiLH

--
Le fondement du constat bourgeois, c'est le bon sens, c'est-à-dire
une vérité qui s'arrête sur l'ordre arbitraire de celui qui la parle.
Rolland Barthes.
http://www.filh.org





Avatar
Eric Lévénez
Le 14/07/05 17:18, dans <1gzp994.1nha9cgt1ivfpN%, « FiLH »
a écrit :

Dans ce cas : sizeof(char) * NBY


Par définition, en C, sizeof(char) vaut 1 dans tous les cas, même si char
est un 32 bits, alors il ne faut jamais fait "* sizeof(char)", car cela ne
sert à rien, autant faire "/ sizeof(char)". :-)

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.

1 2 3 4 5