判断文件是否是可执行文件其实可以调用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]);
这样看起来就完美多了。
本人愚件,请过往的高手赐教!