知道内存偏移量和字符串长度的文件中的十六进制字符串

时间:2011-08-26 10:17:55

标签: c string memory-management hex

早上好stackoverflow!

我正在尝试从二进制文件中提取十六进制字符串。我无法直接找到这个字符串,但我知道该字符串长度为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 :(得分:0)

由于你只对指针地址感兴趣,而不是它指向的数据,你也可以使用void *,而你不必做& buffer [0],它不是数组。

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

我添加0x10 + 4以跳过找到的十六进制字节序列,并添加字节直到搜索到的字符串。

答案 1 :(得分:0)

您需要做的就是使用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));
}