早上好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)。然后,在我获得相对偏移的情况下,我怎么能找到未知字符串?
答案 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));
}