【发布时间】:2022-01-05 21:28:21
【问题描述】:
我想从二进制文件(例如文件 ELF hava 7f 45 4c 46)中获取幻数。我写了一个程序来打印出文件的幻数,但我得到了错误 zsh: segmentation fault ./magic.我应该如何解决这个问题?
int main()
{
//setlocale(LC_ALL, "Russian");
//FILE *fp;
//fopen (&fp, "/Documents/OCP/lab1test/lab1call", "rb");
FILE *fp;
long fSize;
fp = fopen("/Documents/OCP/lab1test/lab1call", "rb");
fseek (fp , 0 , SEEK_END);
fSize = ftell (fp);
rewind (fp);
char *magic_number;
magic_number=(char *)malloc(fSize+1);
//unsigned char magic_number[4];
fread(magic_number, sizeof(char), 4, fp);
printf ("A magic number of your file is:\n");
//magic_number[4] = '\0';
//for (int i = 0; i < 4; i++)
printf ("%02hhx%02hhx%02hhx%02hhx\n ", magic_number[0],magic_number[1], magic_number[2], magic_number[3]);
printf("\n");
}
【问题讨论】:
-
你不需要基于整个文件大小的这么大的 malloc。如果您只从文件中读取前 4 个字节,则只能 malloc 4 个字节。想象一下,如果您正在读取小于 4 字节的文件,并且现在您使用基于该文件大小的 malloc(例如:只有 2B),您的指针会被分配 2B 并且您试图在 fread 中存储 4 个字节,这可能会导致段错误.
-
在 gdb 之类的调试器中运行它(在使用
-g选项编译以获取二进制文件中的调试信息之后),以查看它在哪里得到了段错误。 -
检查
fp在fopen之后是否不为NULL -
/Documents看起来不是有效路径。对所有函数调用进行基本的错误检查,在这种情况下特别是fopen。 -
你也可以使用简单的数组
char magic_number[4]而不用malloc。
标签: c linux magic-numbers