判断文件是否是可执行文件

来源:互联网 发布:windows loader 下载 编辑:程序博客网 时间:2024/05/16 10:20
  判断文件是否是可执行文件其实可以调用API函数GetBinaryType来完成。但是我不想用这个方法,因为还有其他的方法来判断,虽然这样比较麻烦,也不一定特别的准,但是我觉得这可以让我们对文件有所了解。好,let's go!
  在windows操作系统下,可执行文件的第25个字节是0x40,因此可以编写程序来读取文件的第25个字节的内容从而判断文件是否是可执行文件。 这里我编写的程序是用C语言编写的。读取文件的第25个字节我借助于缓冲型I/O系统中的fseek()函数可以完成其读取操作,它可以设置文件位置,调用方法为:int fseek(FILE *fp,long int num_bytes,int origin);其中fp是调用fopen()时所返回的文件指针,num_bytes是一个长整型量,表示由origin位置到当前位置的字节数。具体相关操作,在代码中解释。代码如下:

#include <stdio.h>
main(int argv,char *argc[])
{
    FILE *fp;
    char c;
    /*判断是否输入了要判断的文件名*/
    if(argv!=2)
    {
        printf("usage:%S filename/n",argc[0]);
        exit(1);
    }
    /*判断文件是否可以正确打开*/
    if((fp=fopen(agrc[1],"rb"))==NULL)
    {
        printf("can not file open/n");
        exit(1);
    }
    fseek(fp,24L,1,SEEK_SET);
    /*c语言的第一个字节的从0开始,因此第25个字节应该是24,在24后面加L说明是长整形,这一点十分重要*/
    /*SEET_SET是一个宏名,SEEK_SET的整型量为0,意思是把文件开头当作起点*/
    fread(&c,1,1,fp);
    /*fread()函数把当前的1个字符(即第25个字节的字符)读到了c变量中*/
    if(c==0x40)
        printf("%s is exefile",argv[1]);
    else
        printf("%s is not exefile",argv[1]);
    fclose(fp);
}

好了,代码就是这样了,在Turbo C 2.0下编译是没有问题的。但是经我测试发现一个问题。我用这个文件测试自身,发现提示它是一个不可执行文件,倒!我在测试一下其他用Turbo C 2.0编译出来的exe文件,也提示不是可执行文件。我在else后面加了一条语句,就是printf("%c",c);这样我知道了,用Turbo C 2.0编译出来的exe文件的第25个字节为0x22。但是,我觉得还需要测试一下,找了一个用VC编译的控制台的exe文件,OK!提示是可执行文件。试试98下的/windows/command/目录下的DOS命令看看,提示它们的第25个字节为0x1e,在试试ping和netstat这样的32位的网络命令,提示它们是可执行文件。这样我把最后几行的判断修改了一下。代码如下:

if(c==0x40)
    printf("%s is 32bit exefile/n",argv[1]);
else if(c==0x22||c==0x1e)
    printf("%s is 16bit exefile/n",argv[1]);
else
    printf("%s is not exefile/n",argv[1]);

这样看起来就完美多了。

本人愚件,请过往的高手赐教!

原创粉丝点击