【问题标题】:Check if valid executable or shell file by checking magic number in C通过检查 C 中的幻数来检查是否有效的可执行文件或 shell 文件
【发布时间】:2018-04-10 07:46:24
【问题描述】:

您将认识的幻数如下表所示。

文件类型的名称 文件开头的幻数(字节):

-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: %d\n", Ccount);
    printf("C header: %d\n", Hcount);
    printf("Object: %d\n", Ocount);
    printf("Make: %d\n", Mfile);
    printf("Executable: %d\n", Execount);
    printf("Shell: %d\n", Shcount);
    printf("Other: %d\n", O);

【问题讨论】:

  • 什么是file?您在哪里尝试从任何文件中读取“魔法”?
  • @Someprogrammerdude 抱歉,添加代码时错过了。已编辑
  • 你的问题。您实际上必须将文件中的数据读取到缓冲区中,然后将缓冲区的内容与您的幻数进行比较。 A good beginners book 应该解释读取(和写入)文件所需的一切。

标签: c magic-numbers


【解决方案1】:

从文件中读取 4 个字节的数据,然后执行 memcmp .. 类似这样的操作

char buf[4] ; 
fread(buf,sizeof(char),4,file) ; 
memcmp(buf,magic1,sizeof(magic1)); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2014-08-09
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多