下表
显示了您将识别的幻数。
文件类型名称 文件开头的幻数(字节):
-Executable ASCII characters DEL, ‘E’, ‘L’ and ‘F’
-Shell script ASCII characters ‘#’ and ‘!’
标准文件扩展名优先,即使它们包含幻数。例如,如果文件具有扩展名.o
则object
即使它还具有executable
文件的神奇数字。
到目前为止,我没有通过实现我拥有的代码来尝试,它似乎没有检查数字并添加到exe文件的总数中。是逻辑不正确还是更简单的检查方法?
任何帮助不胜感激
int main (int argc, char** argv) {
//
const unsigned char magic1[4] = {0x7f, 0x45, 0x4c, 0x46}; //DEL, E, L, F
char *endSlash = strrchr (argv[count], '/');
endSlash = endSlash ? endSlash + 1: argv[count];
char *endDot = strrchr (endSlash, '.');
FILE *file;
for (count = 1; count < argc; count++) {
file = fopen(argv[count], "r");
if (strcmp(endSlash, "Makefile") == 0 || strcmp(endSlash, "makefile") == 0) {
Mfile++;
}
else if (endDot == NULL) {
O++;
}
else if (endDot[1] == 'c' && endDot[2] == 0) {
Ccount++;
}
else if (endDot[1] == 'h' && endDot[2] == 0) {
Hcount++;
}
else if (endDot[1] == 'o' && endDot[2] == 0) {
Ocount++;
}
else if (memcmp(file, magic1, sizeof(magic1)) == 0) { //is this actually checking and comparing bytes of magic1?
Execount++;
}
else {
O++;
}
}
printf("C source: %dn", Ccount);
printf("C header: %dn", Hcount);
printf("Object: %dn", Ocount);
printf("Make: %dn", Mfile);
printf("Executable: %dn", Execount);
printf("Shell: %dn", Shcount);
printf("Other: %dn", O);
从文件中读取4个字节的数据,然后做memcmp..像这样的东西
char buf[4] ;
fread(buf,sizeof(char),4,file) ;
memcmp(buf,magic1,sizeof(magic1));