1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| #include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
// Affichage buffer à l'écran (juste pour vérifier)
void hexdump(unsigned char *buffer, unsigned long n) {
unsigned char *pt;
unsigned long i;
for (i=0, pt=buffer; i < n; i++, pt++)
printf("%02x ", *pt);
fputc('\n', stdout);
}
// Conversion d'un caractère "hexa" en valeur hexa
unsigned short car2hex(unsigned char c) {
// Le caractère '0' (ascii 48) vaut 0 (donc il vaut '0' - '0')
if isdigit(c) return c - '0';
// Le caractère 'a' (ascii 97) vaut 10 (donc il vaut 'a' - 'a' + 10)
return tolower(c) - 'a' + 10;
}
// Recherche d'une chaine dans un dump
unsigned char* findDump(unsigned char *buffer, unsigned short n, unsigned char *str) {
// Conversion de la string représentant de l'hexa en vrai hexa
// Il est impératif que la chaine soit de taille paire, sinon perte dernier octet
// D'abord, mémoire pour récupérer la conversion
size_t len=strlen(str);
unsigned char *hexa=malloc((len/2) * sizeof(unsigned char));
// Maintenant conversion caractère vers hexa
for (size_t i=0; i < len; i+=2) {
hexa[i/2]=car2hex(str[i]) * 0x10 + car2hex(str[i+1]);
//printf("i=%lu, (%c %c), %02x\n", i, str[i], str[i+1], hexa[i/2]);
}
// hexdump(hexa, len/2);
// On a maintenant une valeur hexa (binaire) à trouver dans un buffer binaire
// Bizarrement memmem (qui sert à ça) ne fonctionne pas (en plus mon compilo me dit qu'il ne la connait pas)
// Dommage, car suffisait d'écrire directement return memmem(buffer, n, hexa, len/2)
// Pas grave, on va se taper le balayage du buffer à la mano
unsigned long i;
unsigned char *pt;
for (i=0, pt=buffer; i < n; i++, pt++) {
if (memcmp(pt, hexa, len/2) == 0) {
//printf("%p, %p, %hu\n", buffer, pt, pt-buffer);
free(hexa);
return pt;
break;
}
}
// Pas trouvé
free(hexa);
return NULL;
}
int main() {
unsigned char buffer[1000];
unsigned long nb;
FILE *fp=fopen("client", "r");
nb=fread(buffer, sizeof(unsigned char), 1000, fp);
fclose(fp);
printf("nb=%lu\n", nb);
// hexdump(buffer, nb);
printf("%hu\n", findDump(buffer, nb, "002011") - buffer); // Ici, affichage 23 qui est bien la 24° position de la chaine "002011" dans le dump (la première position commence à 0)
} |
Partager