判斷檔案是否是可執行檔案

2021-03-31 10:44:28 字數 1487 閱讀 9661

判斷檔案是否是可執行檔案其實可以呼叫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

main(int argv,char *argc)

/*判斷檔案是否可以正確開啟*/

if((fp=fopen(agrc[1],"rb"))==null)

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/***mand/目錄下的dos命令看看,提示它們的第25個位元組為0x1e,在試試ping和***stat這樣的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]);

這樣看起來就完美多了。

本人愚件,請過往的高手賜教!

linux 執行可執行檔案

1 首先,需要了解一下a.out這個目標檔案。a.out在linux下是elf executable linkable format 檔案格式,該目標檔案由乙個檔案頭 段 資料段 已初始化 從定位資訊區 符號表及符號名字字串構成,如下左圖所示,經過鏈結後生成執行檔案如下右圖所示,需要說明的是1 bs...

API函式執行可執行檔案

shellexecute hwnd hwnd,父視窗控制代碼 lpcstr lpoperation,操作型別 lpcstr lpfile,要進行操作的檔案或路徑 lpcstr lpparameters,當lpoperation為 explore 時指定要傳遞的引數,通常設為null lpcstr l...

Linux下執行可執行檔案

我們通常會為計算機配置環境變數 path,echo path 檢視當前的環境變數包含的目錄。這些目錄下的可執行檔案就無需輸入完整路徑來執行,直接輸入命令就行,我們shell中常使用的一些linux命令,例如man,cat等的目錄都被包含在該path目錄中,所以直接在shell中輸入這些命令就可以。即...