Найти шестнадцатеричную строку в файле, зная смещение памяти и длину строки - PullRequest
0 голосов
/ 26 августа 2011

Доброе утро, переполнение стека!

Я пытаюсь извлечь из двоичного файла шестнадцатеричную строку.Я не могу найти эту строку напрямую, но я знаю, что длина строки 0x30 и начинается 0x10 после известной шестнадцатеричной строки.

Так вот мой код

 FILE *f = NULL;
    unsigned char *buffer = NULL;
    unsigned long fileLen;

    unsigned char known_string[] = {0x45, 0x45, 0x45, 0x45};


printf("Opening file...\n");  
    f = fopen(argv[1], "rb");

    if (!f) {
        fprintf(stderr, "Unable to open %s\n", argv[1]);
        return -1;
    }

// Get the length
    fseek(f, 0, SEEK_END);
    fileLen=ftell(f);

    fseek(f, 0, SEEK_SET);

// Allocate memory
    buffer=malloc(fileLen);

    if (!buffer)
    {
        fprintf(stderr, "Memory error!\n");
        fclose(f);
        return -1;
    }

// File to buffer

fread(buffer, fileLen, 1, f);
    fclose(f);

printf("Buffer starts: %p\n", &buffer[0]);
printf("Buffer ends: %p\n", &buffer[fileLen]);

// Determines offset of known_string

char *p = memmem(buffer, fileLen, bytes, 4);
if (!p) {
    return -1;
} else {

  printf(" General offset: %x\n", p);    
}

  free(buffer);

Итакобщее смещение известной строки, но мне нужно получить одно относительно файла.Я немного застрял на этом этапе.Я думаю, что я должен сделать что-то вроде p - & buffer [0], но p и & buffer [0] не одного типа, и p даже не является действительным смещением (например, 678987 вместо 10678987).Тогда в случае, если я получил относительное смещение, как я могу найти неизвестную строку?

Ответы [ 2 ]

0 голосов
/ 27 августа 2011

Все, что вам нужно сделать, это использовать unsigned char * для типа p - тогда вы можете просто вычесть:

unsigned char *p = memmem(buffer, fileLen, bytes, 4);

if (!p) {
    return -1;
} else {
  printf(" General offset: %p\n", p);    
  printf(" Offset within file: %llx\n", (unsigned long long)(p - buffer));
}
0 голосов
/ 26 августа 2011

Поскольку вас интересует только адрес указателя, а не данные, на которые он указывает, вы также можете использовать void *, и вам не нужно делать & buffer [0], это не массив. *

unsigned long off_to_string = 0x10 + 4 + ((void *)p) - ((void *)buffer);

Я добавляю 0x10 + 4, чтобы пропустить найденную последовательность шестнадцатеричных байтов и байты до искомой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...