[Windows][VC]開機自動啟動程式的幾種方法
【原文:http://www.cnblogs.com/upendi/archive/2012/07/04/sina-20110619.html】
很多監控軟體要求軟體能夠在系統重新啟動後不用使用者去點選圖示啟動專案,而是直接能夠啟動執行,方法是寫登錄檔Software\\Microsoft\\Windows\\CurrentVersion\\Run。
參考程式可以見下:(查詢程式目錄的執行檔案,存在則進行新增登錄檔操作)
//實用程式碼一
int C***Dlg::CreateRun(void)
{
//新增以下程式碼
HKEY RegKey;
CString sPath;
GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
sPath.ReleaseBuffer();
int nPos;
nPos=sPath.ReverseFind('\\');
sPath=sPath.Left(nPos);
CString lpszFile=sPath+"\\getip.exe";//這裡加上你要查詢的執行檔名稱
CFileFind fFind;
BOOL bSuccess;
bSuccess=fFind.FindFile(lpszFile);
fFind.Close();
if(bSuccess)
{
CString fullName;
fullName=lpszFile;
RegKey=NULL;
RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&RegKey);
RegSetValueEx(RegKey,"getip",0,REG_SZ,(const unsigned char*)(LPCTSTR)fullName,fullName.GetLength());//這裡加上你需要在登錄檔中註冊的內容
this->UpdateData(FALSE);
}
else
{
//theApp.SetMainSkin();
::AfxMessageBox("沒找到執行程式,自動執行失敗");
exit(0);
}
return 0;
}
//把上面的getip(共2處)替換成自己想啟動程式的名字。
————————————————————————————————————————————
————————————————————————————————————————————
實用程式碼二:
//寫入登錄檔,開機自啟動
HKEY hKey;
//找到系統的啟動項
LPCTSTR lpRun = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";
//開啟啟動項Key
long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey);
if(lRet == ERROR_SUCCESS)
{
char pFileName[MAX_PATH] = {0};
//得到程式自身的全路徑
DWORD dwRet = GetModuleFileName(NULL, pFileName, MAX_PATH);
//新增一個子Key,並設定值 // 下面的"getip"是應用程式名字(不加字尾.exe)
lRet = RegSetValueEx(hKey, "getip", 0, REG_SZ, (BYTE *)pFileName, dwRet);
//關閉登錄檔
RegCloseKey(hKey);
if(lRet != ERROR_SUCCESS)
{
AfxMessageBox("系統引數錯誤,不能隨系統啟動");
}
}
一、當前使用者專有的啟動資料夾
這是許多應用軟體自動啟動的常用位置,Windows自動啟動放入該資料夾的所有快捷方式。使用者啟動資料夾一般在:\Documents and Settings\<使用者名稱字>\「開始」選單\程式\啟動,其中“<使用者名稱字>”是當前登入的使用者帳戶名稱。
二、對所有使用者有效的啟動資料夾
這是尋找自動啟動程式的第二個重要位置,不管使用者用什麼身份登入系統,放入該資料夾的快捷方式總是自動啟動——這是它與使用者專有的啟動資料夾的區別所在。該資料夾一般在:\Documents and Settings\All Users\「開始」選單\程式\啟動。
三、Load註冊鍵
介紹該註冊鍵的資料不多,實際上它也能夠自動啟動程式。位置:HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Windows\load。
四、Userinit註冊鍵
位置:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon\Userinit。這裡也能夠使系統啟動時自動初始化程式。通常該註冊鍵下面有一個userinit.exe,如圖,但這個鍵允許指定用逗號分隔的多個程式,例如“userinit.exe,OSA.exe”(不含引號)。
五、Explorer\Run註冊鍵
和load、Userinit不同,Explorer\Run鍵在HKEY_CURRENT_USER和HKEY_LOCAL_MACHINE下都有,具體位置是:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run,和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run。
六、RunServicesOnce註冊鍵
RunServicesOnce註冊鍵用來啟動服務程式,啟動時間在使用者登入之前,而且先於其他通過註冊鍵啟動的程式。RunServicesOnce註冊鍵的位置是:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce,和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServicesOnce。
七、RunServices註冊鍵
RunServices註冊鍵指定的程式緊接RunServicesOnce指定的程式之後執行,但兩者都在使用者登入之前。RunServices的位置是:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices,和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices。
八、RunOnce\Setup註冊鍵
RunOnce\Setup指定了使用者登入之後執行的程式,它的位置是:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup,和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce\Setup。
九、RunOnce註冊鍵
安裝程式通常用RunOnce鍵自動執行程式,它的位置在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce和HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce。HKEY_LOCAL_MACHINE下面的RunOnce鍵會在使用者登入之後立即執行程式,執行時機在其他Run鍵指定的程式之前。HKEY_CURRENT_USER下面的RunOnce鍵在作業系統處理其他Run鍵以及“啟動”資料夾的內容之後執行。如果是XP,你還需要檢查一下HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx。
十、Run註冊鍵
Run是自動執行程式最常用的註冊鍵,位置在:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run,和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run。
HKEY_CURRENT_USER下面的Run鍵緊接HKEY_LOCAL_MACHINE下面的Run鍵執行,但兩者都在處理“啟動”資料夾之前。
有時候人們往往會為了一個程式的啟動而頭痛,因為一些使用者往往不知道那些檔案是如何啟動的。所以經常會有些沒用的東西掛在系統上佔用資源。有時候也會有人因為不知道如何啟動某個檔案而頭痛。更有些特洛依木馬的作者因為不清楚系統的自啟動方式而使自己的木馬輕鬆被別人發現……
Windows的自啟動方式其實有許多方式。除了一些常見的啟動方式之外,還有一些非常隱蔽的可用來啟動檔案的方式。本文總結如下,雖然不是全部,但我想應該會對大家有所幫助。文章全部以系統預設的狀態為準,以供研究。
其中(English)代表英文作業系統,(Chinese)代表中文作業系統。本文沒加說明指的全為中文Windows98作業系統。
警告:文中提及的一些操作可能會涉及到系統的穩定性。例如如果不正確地使用登錄檔編輯器可以導致可能重新安裝系統這樣嚴重的問題。微軟也不能保證因不正常使用登錄檔編輯器而造成的結果可以被解決。筆者不對使用後果負責,請根據自己的情況使用。
Windows的自啟動方式:
一.自啟動目錄:
1.第一自啟動目錄:
預設路徑位於:
C:windowsstart menuprogramsstartup(English)
C:windowsstart menuprograms啟動(Chinese)
這是最基本、最常用的Windows啟動方式,主要用於啟動一些應用軟體的自啟動專案,如Office的快捷選單。一般使用者希望啟動時所要啟動的檔案也可以通過這裡啟動,只需把所需檔案或其快捷方式放入資料夾中即可。
對應的登錄檔位置:
[HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerShell Folders]
Startup="%Directory%"
[HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerUser Shell Folders]
Startup="%Directory%"
其中“%Directory%”為啟動資料夾位置。
英文預設為: C:windowsstart menuprogramsstartup
中文預設為: C:windowsstart menuprograms啟動
在開始選單的“啟動”資料夾是可更改的,如果使用者更改了啟動資料夾,則以上登錄檔的鍵值均會改變為相應的名稱。
值得注意的是:開始選單的“啟動”資料夾中的內容雖然在預設的狀態下可以被使用者看得一清二楚。但通過改動還是可以達到相當隱蔽地啟動的目的的:
首先,“啟動”資料夾中的快捷方式或其他檔案的屬性可以改變為“隱藏”。這樣可以達到系統不啟動被隱藏的檔案,等到需要啟動的時候又可以通過更改回檔案屬性而恢復啟動的作用。
其次,其實“啟動”資料夾只是一個普通的資料夾,但是由於系統監視了這個資料夾,所以變得有些特殊,但資料夾有的功能該資料夾也是有的。譬如“啟動”資料夾的名稱是可以更改的,並且“啟動”資料夾也可以設定屬性。如果把屬性設定為“隱藏”,則在系統中的【開始】?【程式】選單中是看不到“啟動”資料夾的(即使在“資料夾選項”中已經設定了“顯示所有檔案”)。而系統還會啟動這個被隱藏的資料夾中的非隱藏檔案。
敏感的人們也許已經發現問題。舉一個例子:
如果我想啟動A木馬的server端伺服器,我可以把原來的“啟動”選單的名稱更改為“StartUp”(這裡是隨便改的,登錄檔相應的鍵值也會自動更改。)之後再建立一個名為“啟動”的資料夾,把“StartUp”選單中的檔案全部複製(這裡用複製,可以騙過使用者的檢查)到“啟動”選單中,然後把A木馬的server程式放入“StartUp”資料夾中,最後把“StartUp”資料夾隱藏。大功告成!
從外表看來,使用者的【開始】?【啟動】目錄還在,而且要啟動的檔案也在。但系統此時啟動的檔案不是名為“啟動”的資料夾中的檔案,而是名為“StartUp”的資料夾中的檔案。如果木馬做的好的話,完全可以在每次啟動的時候把“StartUp”中的檔案複製到“啟動”目錄中來達到實時更新啟動目錄的目的。由於“StartUp”資料夾被隱藏,從【開始】?【程式】中是無法看到真正的啟動選單“StartUp”的,所以達到了隱蔽啟動的目的!
這個啟動方式雖然比較隱蔽,但通過msconfig依舊可以在“啟動”頁中看出來。
2.第二自啟動目錄:
是的,其實,Windows還有另外一個自啟動目錄,而且很明顯但卻經常被人們忽略的一個。
該路徑位於:
C:WINDOWSAll UsersStart MenuProgramsStartUp(English)
C:WINDOWSAll UsersStart MenuPrograms啟動(Chinese)
這個目錄的使用方法和第一自啟動目錄是完全一樣的。只要找到該目錄,將所需要啟動的檔案拖放進去就可以達到啟動的目的。
[HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionexplorerUser Shell Folders]
"Common Startup"="%Directory%"
[HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionexplorerShell Folders]
"Common Startup"="%Directory%"
值得注意的是:該目錄在開始選單的“啟動”目錄中是完全不能被看見的。而伴隨著每次啟動,該目錄下的非隱藏檔案也會隨之啟動!另外,在Msconfig中可以看到在這個目錄下要啟動的檔案。
二.系統配置檔案啟動:
由於系統的配置檔案對於大多數的使用者來說都是相當陌生的;這就造成了這些啟動方法相對來說都是相當隱蔽的,所以這裡提到的一些方法常常會被用於做一些破壞性的操作,請讀者注意。
1.WIN.INI啟動:
啟動位置(file.exe為要啟動的檔名稱):
[windows]
load=file.exe
run=file.exe
注意:load=與run=的區別在於:通過load=執行檔案,檔案會在後臺執行(最小化);而通過run=來執行,則檔案是在預設狀態下被執行的。
2.SYSTEM.INI啟動:
啟動位置(file.exe為要啟動的檔名稱):
預設為:
[boot]
Shell=Explorer.exe
可啟動檔案後為:
[boot]
Shell=Explorer.exe file.exe
說明:
筆者記得在諾頓先生(就是開發出Norton系列軟體的人)寫的一本書裡面曾經說過,1、2這兩個檔案的有無對系統沒有什麼影響,但由於時間的關係,筆者沒有來得及試驗,有興趣者可以試一試。
不過有一點是可以肯定的,這樣的啟動方式往往會被木馬或一些惡作劇程式(如,妖之吻)利用而導致系統的不正常。由於一般使用者很少會對這兩個檔案關心,甚至有的人不知道這些檔案是做什麼用的,所以隱蔽性很好。但由於其使用的越來越頻繁,這種啟動方式也被漸漸的察覺了。使用者可以使用msconfig這個命令實現檢查是否有什麼程式被載入。具體的是在看是選單中的“執行”中輸入msconfig回車,之後按照文字說明即可。
注意:
1. 和WIN.INI檔案不同的是,SYSTEM.INI的啟動只能啟動一個指定檔案,不要把Shell=Explorer.exe file.exe換為Shell=file.exe,這樣會使Windows癱瘓!
2. 這種啟動方式提前於登錄檔啟動,所以,如果想限制登錄檔中的檔案的啟動,可是使用這種方法。
3.WININIT.INI啟動:
Wininit.ini這個檔案也許很多人不知道,一般的操作中使用者也很少能直接和這個檔案接觸。但如果你編寫過解除安裝程式的話,也許你會知道這個檔案。
WinInit即為Windows Setup Initialization Utility。翻譯成中文就是Windows安裝初始化工具。這麼說也許不明白,如果看到如下提示資訊:
Please wait while Setup updates your configuration files.
This may take a few minutes...
大家也許就都知道了!這個就是Wininit.ini在起作用!
由於在Windows下,許多的可執行檔案和驅動檔案是被執行到記憶體中受到系統保護的。所以在Windows的正常狀態下更改這些檔案就成了問題,因此出現了Wininit.ini這個檔案來幫助系統做這件事情。它會在系統裝載Windows之前讓系統執行一些命令,包括複製,刪除,重新命名等,以完成更新檔案的目的。Wininit.ini檔案存在於Windows目錄下,但在一般時候我們在C:Windows目錄下找不到這個檔案,只能找到它的exe程式Wininit.exe。原因就是Wininit.ini在每次被系統執行完它其中的命令時就會被系統自動刪除,直到再次出現新的Wininit.ini檔案……之後再被刪除。
檔案格式:
[rename]
file1=file2
file1=file2的意思是把file2檔案複製為檔名為file1的檔案,相當於覆蓋file1檔案。
這樣啟動時,Windows就實現了用file2更新file1的目的;如果file1不存在,實際結果是將file2複製並改名為file1;如果要刪除檔案,則可使用如下命令:
[rename]
nul=file2
這也就是說把file2變為空,即刪除的意思。
以上檔名都必須包含完整路徑。
注意:
1.由於Wininit.ini檔案處理的檔案是在Windows啟動以前處理的,所以不支援長檔名。
2.以上的檔案複製、刪除、重新命名等均是不提示使用者的情況下執行的。有些病毒也會利用這個檔案對系統進行破壞,所以使用者如果發現系統無故出現:
Please wait while Setup updates your configuration files.
This may take a few minutes...
那麼也許系統就有問題了。
3. 在Windows 95 Resource Kit中提到過Wininit.ini檔案有三個可能的段,但只敘述了[rename]段的用法。
4.WINSTART.BAT啟動:
這是一個系統自啟動的批處理檔案,主要作用是處理一些需要複製、刪除的任務。譬如有些軟體會在安裝或解除安裝完之後要求重新啟動,就可以利用這個複製和刪除一些檔案來達到完成任務的目的。如:
“@if exist C:WINDOWSTEMPPROC.BAT call C:WINDOWSTEMPPROC.BAT”
這裡是執行PROC.BAT檔案的命令;
“call filename.exe > nul”
這裡是去除任何在螢幕上的輸出。
值得注意的是WinStart.BAT檔案在某種意義上有和AUTOEXEC.BAT一樣的作用。如果巧妙安排完全可以達到修改系統的目的!
5.AUTOEXEC.BAT啟動:這個就沒的說了,應該是使用者再熟悉不過的系統檔案之一了。每次重新啟動系統時在DOS下啟動。惡意的程式往往會利用這個檔案做一些輔助的措施。
不過,在AUTOEXEC.BAT檔案中會包含有惡意程式碼。如format c: /y等;由於BAT惡意程式的存在,這個機會大大地增加了。譬如最近很流行的SirCam蠕蟲也利用了Autoexec.bat檔案。
說明: 4、5這兩個檔案都是批處理檔案,其作用往往不能完全寫出來,因為批處理的用處在DOS時代的應用太廣泛,它的功能相對來說也是比較強大。想利用這兩個檔案,需要對DOS有一定的瞭解。.
三.登錄檔啟動:
登錄檔中的啟動應該是被使用最頻繁的啟動方式,但這樣的方式也有一些隱蔽性較高的方法,大致有三種。
1.常規啟動:
其中%path%為任意路徑,file.exe為要執行的程式。
[HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunServices]
"Anything"="%path%file.exe"
[HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunServicesOnce]
"Anything"="%path%file.exe"
[HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRun]
"Anything"="%path%file.exe"
[HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunOnce]
"Anything"="%path%file.exe"
[HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun]
"Whatever"="c:runfolderprogram.exe"
[HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunOnce]
"Whatever"="c:runfolderprogram.exe"
注意:
(1).如果需要執行.dll檔案,則需要特殊的命令列。
如:
Rundll32.exe C:WINDOWSFILE.DLL,Rundll32
(2).解除這裡相應的自啟動項只需刪除該鍵值即可,但注意不要刪除如SystemTray、ScanRegistry等這樣的系統鍵值。
(3).如果只想不啟動而保留鍵值,只需在該鍵值加入rem即可。如:
“rem C:Windowsa.exe”
(4).在登錄檔中的自啟動項中沒有這項:
[HKEY_CURRENT_USER SoftwareMicrosoftWindowsCurrentVersionRunServices]
(5).Run和RunServices的區別在於:Run中的程式是在每次系統啟動時被啟動,RunServices則是會在每次登入系統時被啟動。
關於:
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunOnceEx]
有特殊的語法:
例如,執行notepad.exe
HKLMSOFTWAREMicrosoftWindowsCurrentVersionRunOnceEx
"Title"="My Setup Title"
"Flag"=dword:00000002
HKLMSOFTWAREMicrosoftWindowsCurrentVersionRunOnceEx001
"RunMyApp"="||notepad.exe"
語法為:
HKLMSOFTWAREMicrosoftWindowsCurrentVersionRunOnceEx
Flags = 0x0000000
Title = "Status Dialog Box Title"
HKLMSOFTWAREMicrosoftWindowsCurrentVersionRunOnceExDepend
0001 = "xxx1"
000X = "xxxx"
HKLMSOFTWAREMicrosoftWindowsCurrentVersionRunOnceEx001
Entry1 = "MyApp1.exe"
EntryX = "MyApp2.exe"
HKLMSOFTWAREMicrosoftWindowsCurrentVersionRunOnceEx00x
...
注意:
(1).“xxx1,xxxx”是一個動態連結庫(DLL)或.OCX檔名(如My.ocx或My.dll)。
(2).“0001,000x”是部分名字。可以是數字和文字。
(3).“entry1,entryX”是指向一個要執行的程式檔案的登錄檔串值。
鍵值的說明:
Flags是一個定位在RunOnceEx鍵用來啟用/禁止的DWORD值,具體如下:
值 功能 功能定義
0x00000000 預設 所有功能被禁止
0x00000004 檢查殼狀況 開啟殼的讀寫校驗準備接受OLE命令
0x00000008 無報錯對話 錯誤對話方塊不顯示
0x00000010 建立錯誤報告檔案 建立 C:WindowsRunOnceEx.err 檔案如果有錯誤出現
0x00000020 建立執行報告檔案 建立一個有命令狀態的C:WindowsRunOnceEx.log檔案
0x00000040 無例外限制 當註冊DLL時不限制例外
0x00000080 無狀態對話 當RunOnceEx執行時狀態對話方塊不顯示
由於涉及篇幅較多,具體做法請瀏覽微軟網頁:
http://support.microsoft.com/support/kb/articles/Q232/5/09.ASP
2.特殊啟動1:
在登錄檔中除了上述的普通的啟動方式以外,還可以利用一些特殊的方式達到啟動的目的:
[HKEY_CLASSES_ROOTexefileshellopencommand] @="%1" %*
[HKEY_CLASSES_ROOTcomfileshellopencommand] @="%1" %*
[HKEY_CLASSES_ROOTbatfileshellopencommand] @="%1" %*
[HKEY_CLASSES_ROOThtafileshellopencommand] @="%1" %*
[HKEY_CLASSES_ROOTpiffileshellopencommand] @="%1" %*
[HKEY_LOCAL_MACHINESoftwareCLASSESbatfileshellopencommand] @="%1" %*
[HKEY_LOCAL_MACHINESoftwareCLASSEScomfileshellopencommand] @="%1" %*
[HKEY_LOCAL_MACHINESoftwareCLASSESexefileshellopencommand] @="%1" %*
[HKEY_LOCAL_MACHINESoftwareCLASSEShtafileshellopencommand] @= "%1" %*
[HKEY_LOCAL_MACHINESoftwareCLASSESpiffileshellopencommand] @="%1" %*
其實從登錄檔的路徑上也許就隱約可以看出,這些都是一些經常被執行的可執行檔案的鍵值。往往有些木馬是可以更改這些鍵值從而達到載入的目的:
如果我把“”%1”%*”改為“file.exe”%1”%*”則檔案file.exe就會在每次執行某一個型別的檔案(要看改的是哪一個檔案型別)的時候被執行!當然,可以被更改的不一定只是可執行檔案,譬如冰河就利用了TXT檔案的鍵值:
[HKEY_CLASSES_ROOTtxtfileshellopencommand]實現木馬的一種啟動方式。
3.特殊啟動2:
在登錄檔中:
HKEY_LOCAL_MACHINESystemCurrentControlSetServicesVxD
的位置上有這樣的地址。該地址是系統啟動VxD驅動檔案放置的地址,就像PrettyPark這個蠕蟲一樣,可以建立一個主鍵之後把VxD檔案新增到登錄檔中在這裡。
注意:不可以直接把一個EXE檔案改名為VxD檔案,需要另外進行程式設計,生成的VxD檔案。
4.其他啟動方式:
(一).C:Explorer.exe啟動方式:
這是一種特殊的啟動方式,很少有人知道。
在Win9X下,由於SYSTEM.INI只指定了Windows的外殼檔案EXPLORER.EXE的名稱,而並沒有指定絕對路徑,所以Win9X會搜尋EXPLORER.EXE檔案。
搜尋順序如下:
(1). 搜尋當前目錄。
(2). 如果沒有搜尋到EXPLORER.EXE則系統會獲取
[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerEnvironmentPath]的資訊獲得相對路徑。
(3). 如果還是沒有檔案系統則會獲取[HKEY_CURRENT_USEREnvironmentPath]的資訊獲得相對路徑。
其中:
[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerEnvironmentPath]和[HKEY_CURRENT_USEREnvironmentPath]所儲存的相對路徑的鍵值為:“%SystemRoot%System32;%SystemRoot%”和空。
所以,由於當系統啟動時,“當前目錄”肯定是%SystemDrive%(系統驅動器),這樣系統搜尋EXPLORER.EXE的順序應該是:
(1). %SystemDrive%(例如C:)
(2). %SystemRoot%System32(例如C:WINNTSYSTEM32)
(3). %SystemRoot%(例如C:WINNT)
此時,如果把一個名為EXPLORER.EXE的檔案放到系統根目錄下,這樣在每次啟動的時候系統就會自動先啟動根目錄下的EXPLORER.EXE而不啟動Windows目錄下的EXPLORER.EXE了。
在WinNT系列下,WindowsNT/Windows2000更加註意了EXPLORER.EXE的檔名放置的位置,把系統啟動時要使用的外殼檔案(EXPLORER.EXE)的名稱放到了:
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsNTCurrentVersionWinlogonShell]
這個位置。
作為預設這個位置是不存在的,預設為是Explorer.exe。
具體請參考:http://www.microsoft.com/technet/security/bulletin/fq00-052.asp
注意:
一定要確定根目錄下的EXPLORER.EXE要能啟動Windows目錄下的EXPLORER.EXE,否則會導致Windows無法啟動!
現在流行的病毒CodeRed就會在C:和D:目錄下放置兩個約8KB的EXPLORER.EXE的檔案!
在Windows 2000 SP2中微軟已經更改了這一方式。
(二).螢幕保護啟動方式:
Windows的螢幕保護程式是一個.scr檔案。這是一個PE格式的可執行檔案。如果把螢幕保護程式.scr更名為.exe的檔案,則該程式仍然可以正常啟動。類似的.exe檔案更名為.scr檔案也是一樣可以被執行!
.scr檔案預設存在於C:Windows目錄中,他的名字就是在“顯示”屬性中的“螢幕保護程式”中的名稱。在C:Windows目錄下的所有*.scr檔案都會被Windows的“螢幕保護程式”顯示,而檔案路徑本身儲存在System.ini中的SCRNSAVE.EXE=的這條中。有意思的是在SCRNSAVE.EXE=這條中,其規定的路徑也包含了目錄名稱。即如果我想安裝一個.scr檔案時,譬如安裝路徑為D:SCR1.scr,而D:SCR這個目錄中還有2.scr,則在這個目錄中的所有.scr(1.scr,2.scr)檔案都會被顯示在“螢幕保護程式”設定中。
如果螢幕保護程式設為“(無)”,則SCRNSAVE.EXE=這條不存在。但如果SCRNSAVE.EXE=這條所指的檔案或目錄是錯誤的,則在“螢幕保護程式設定”中仍然會顯示“(無)”。
螢幕保護程式的啟動時間儲存在登錄檔中的這個位置上:
HKEY_USERS.DEFAULTControl PaneldesktopScreenSaveTimeOut
時間單位為秒,不過雖然是秒,可啟動時間卻為分,即從60秒開始記錄,如果記錄時間小於60秒,則自動定為1分鐘。
螢幕保護是否設定密碼的鍵值為:
HKEY_USERS.DEFAULTControl PaneldesktopScreenSaveUsePassword
有密碼則值為1沒有密碼則值為0。
由此可見,如果有人把自己所作的.exe程式更名為.scr的程式,並使程式能夠在SYSTEM.INI中新增“SCANSAVE.EXE=/%Path%”f/ile.scr”(/%Path%/file.scr為所需要設定的檔案的路徑和檔名,如C:Program filestrojan.scr),修改登錄檔中的HKEY_USERS.DEFAULTControl PaneldesktopScreenSaveTimeOut,定時間為60,則系統只要閒置一分鐘該檔案就會被啟動!
另外一個簡單的破壞方式就是可以隨機產生螢幕保護密碼並寫入相應檔案的相應位置,定時間為1分鐘,則系統只要閒置一分鐘則會被被鎖!(由於涉及問題並非自啟動問題,所以不加以討論。)
注意:由於SCANSAVE.EXE=這裡還會定義.scr檔案的路徑,所以最好不要把要啟動的檔案放置在.scr檔案較多的一些目錄,否則容易引起懷疑。(Windows目錄除外)(三).依附啟動:
這類啟動方式已經有幾分類似病毒了。這種方法是利用病毒的傳染機制把要啟動的EXE檔案附著在另外的一個和多個EXE檔案上,從而達到啟動這個EXE檔案就可以啟動要啟動的檔案的目的。記得1999年YAI這個木馬流行的時候,它就使用了依附一個EXE檔案而達到啟動的目的,但是由於BUGS和方式問題該木馬的破壞作用卻體現在了它“病毒”的一面。
使用這種啟動方法一定要注意不能破壞EXE檔案(否則會很容易被發現),而且最好把木馬定位在固定的一個或者幾個EXE檔案上。如:IEXPLORE.EXE(IE的EXE檔案),RNAPP.EXE(撥號網路的EXE檔案)等等。
注意:這種方法的使用比較危險,技術上也需要相當功底,而且和病毒的距離很近,慎用。
(四).計劃任務啟動方式:
Windows的計劃任務是Windows的一個預置實現某些操作而使用的一個功能。但是如果利用這個功能也是能夠實現自啟動的目的的!由於很多電腦都會自動載入“計劃任務”所以隱蔽性相對不錯。
在Windows預設的情況下,計劃任務是一個個儲存在C:WindowsTasks目錄下的.job檔案。.job檔案裡包括了啟動方式、檔案路徑等一系列的資訊。編制出或者使軟體自己可以寫出.job檔案,則是關鍵。之後在相關地方寫入標記啟動即可。
由於時間關係,這個方法沒有來得及試驗,讀者可以自己試驗一下。
(五).AutoRun.inf啟動方式:
Autorun.inf這個標識也許大家都見過。是的,這個最常出現在光碟中,用於光碟自啟動。每次把光碟放入光碟機中的時候,系統會通過這個檔案來決定是否自動啟動光碟。但是有沒有想過,這個檔案也可以用來自啟動一些檔案!
Autorun.inf的內容通常是:
[AUTORUN]
OPEN=file.exe
ICON=icon.ico
OPEN中是插入光碟或者雙擊光碟碟符就會執行的可執行檔案的名稱。
ICON中是該光碟機驅動器的圖示檔案。該檔案可以是其他檔案。如:
[AUTORUN]
OPEN=file.exe
ICON=icon.exe,2
其中icon.exe是一個有圖示檔案的可執行檔案,“,2”則是該檔案中的第3個圖示。(“,0”是第一個圖示,無數字則預設為第一個圖示)。
最關鍵的是該Autorun.inf檔案是可以被用在硬碟的驅動器上的。也就是說,如果把光碟上的所有檔案及目錄原封不動的複製到某一硬碟的根目錄下,則雙擊碟符會出現自動執行檔案!
如果是木馬的話,打一個比方:一個木馬如果執行後被命名為aaa.exe放置在C:Windows目錄下。那麼該木馬可以生成一個autorun.inf
檔案於C:下,內容如下: [AUTORUN]
OPEN=Windowsaaa.exe
ICON=aaa.exe
這樣的話,碟符圖示為aaa.exe的第一個圖示檔案。則在每次雙擊C盤的時候都會執行aaa.exe檔案了。但要注意的是,aaa.exe檔案
最好能夠開啟C盤目錄。(比較容易偽裝)
注意:
(1).autorun.inf的屬性被改為隱藏後仍可以正常使用。
(2).autorun.inf中的路徑對相對路徑和絕對路徑都是可以實現的。也就是說,如果autorun.inf被放在1碟符下,也可以2碟符上的檔案!如:
如果把autorun.inf檔案放在C盤根目錄下,內容為
[AUTORUN]
OPEN=D:CCCbbb.exe
ICON=bbb.exe
則這時如果雙擊C盤則可以執行D盤CCC目錄上的bbb.exe檔案!
(3).如果沒有OPEN專案,則系統不執行任何檔案,而去執行下一個命令。
(4).如果沒有ICON專案,則該碟符的圖示為原Windows碟符圖示,但如果有ICON項卻設定錯誤,或者所設定的檔案沒有圖示,則系統會顯示為預設的空白圖示。
(5).自動啟動相關:
a.代啟動:
這種啟動方式其實只是一個方法的問題。即可以用啟動一個正常檔案來啟動另一個檔案,SubSeven就用過啟動Windos.exe從而啟動SubSeven的Sever檔案的方法。
b.Start啟動:
在“執行“中或“MS-DOS”方式中輸入start回車,則會顯示
Runs a Windows program or an MS-DOS program.
START [options] program [arg...]
START [options] document.ext
/m[inimized] Run the new program minimized (in the background).
/max[imized] Run the new program maximized (in the foreground).
/r[estored] Run the new program restored (in the foreground). [default]
/w[ait] Does not return until the other program exits.
如果要啟動的程式配合這個命令,則可以更加隱蔽,如:
start/m file.exe
但似乎有些有啟動畫面的軟體(如金山詞霸)對這條命令並沒有反映。
c.控制皮膚啟動:
這是利用控制皮膚程式可以被類似DLL執行,從而達到啟動目的。
在控制皮膚中,.cpl檔案是控制皮膚的原檔案。預設的這些檔案都會被放置在/%WINDOWS%/SYSTEM/目錄下的,如desk.cpl是桌面屬性、inetcpl.cpl是Internet選項之類。但這些.cpl檔案全都是PE格式檔案,也就是說如果使用者把一個可執行的類似DLL的.cpl檔案放入%Windows%System中,則在控制皮膚中可看到其圖示,並可執行!
由於.cpl檔案的特殊性,需要使用rundll32.exe來啟動該檔案。rundll32.exe是Windows用來呼叫動態連線庫函式時所使用的檔案,在執行中輸入: rundll32 shell32.dll,Control_RunDLL /%path%/desk.cpl,,X
其中shell32.dll為被呼叫的DLL檔案,意思為呼叫shell32.dll中的Control_RunDLL來開啟desk.cpl檔案;/%path%/為.cpl檔案的路徑,預設為C:WindowsSystem;最後的X為desk.cpl檔案的頁數:從0開始,0為第一頁(如“顯示屬性”的“背景”),1為第二頁(如“桌面屬性”的“螢幕保護程式”),依此類推。
但如果照上面的方法做,則該檔案會在控制皮膚中被顯示。有兩種方法可以不讓其顯示:
(1). 不要把自己的.cpl檔案放在C:WINDOWSSYSTEM中。因為預設的情況下Windows會載入的所有.cpl檔案。如果想讓其顯示則開啟C:WINDOWS下的Control.ini檔案,在[MMCPL]中寫入類似:
file.cpl=D:pathfile.cpl
的命令,從而達到顯示的目的。
(2). 當你看到Control.ini檔案的時候一定可以看到在[MMCPL]上面的[don‘t load]。是的,如果把你的檔案以file.cpl=no的格式寫入到這裡面,那麼檔案就不被載入了。反之恢復。
d.其他:
登錄檔中:
HKEY_USERS.DEFAULTSoftwareMicrosoftWindowsCurrentVersionExplorerAdvanced
的“HideFileExt”這個鍵值是確定Windows是不是顯示副檔名的值,如果其值為1就隱藏副檔名,為0則不隱藏。
EXE檔案中:如SirCam蠕蟲一樣,*.EXE檔案的副檔名可以改名稱為.BAT、.COM、.PIF、.SCR等,並且執行效果一樣,反過來不一定。但.EXE檔案並不能更名為.LNK檔案,這也許也是SirCam的一個BUG。
最後: Windows的自啟動方式有很多樣式。這是Windows系統的一部分。一個隱蔽而又很少有人知道的自啟動方式是遠端監控軟體成為一個優秀的軟體的必要的條件。對於普通使用者來說,瞭解這些資訊也是非常必要的。筆者試圖全面的介紹這些可以啟動的方法和想法。文中提到的一些自啟動方法有的很普通,有的則很少有人知道,有些方式甚至有可能是第一次被寫出來。其中的許多方式筆者加入了自己的想法,使一些方式雖然普通但卻很隱蔽。
其中所提的自啟動方式全部在Windows98或提到的相應的系統中預設測試通過。對Windows ME和Windows2000只有部分適用。通過對不同平臺的自啟動方式測試,也可以發現Windows系統還是朝著越來越完善的方向發展。所以在未來的某個WINDOWS版本中,筆者不能保證這些能被使用。但總會有一些可以利用的地方。如果這篇塗鴉能給各位讀者帶來一些啟發,那麼筆者將會感到非常高興!
由於時間倉促再加上筆者所學有限,文中錯誤之處一定不少,望讀者海涵。
關於Windows的自啟動方式的探討可以與我聯絡,我的E-mail是snaix@yeah.net。
本文轉載請註明作者及出處。若用於商業,請與作者聯絡。
相關文章
- ubuntu下圖形程式自啟動的幾種方法Ubuntu
- windows開機自動啟動oracleWindowsOracle
- C#程式實現軟體開機自動啟動的兩種常用方法C#
- [ubuntu]設定開機自啟動程式的方法Ubuntu
- WinForm程式開機自動啟動ORM
- Windows10 開機自動啟動 VagrantWindows
- Windows開機啟動指定程式Windows
- windows如何開機自動啟動某些應用?Windows
- Android開機自啟動程式Android
- 利用VC++程式設計實現程式自動啟動 (轉)C++程式設計
- 如何設定win10軟體開機自動啟動 win10軟體開機自動啟動的方法Win10
- 開機自動啟動應用程式 ON LinuxLinux
- jsp自動跳轉的幾種方法JS
- VC啟動一個新執行緒的三種方法執行緒
- win10如何禁止autodesk開機自啟_win10禁止autodesk開機自動啟動的方法Win10
- windows下redis設定redis開機自啟動WindowsRedis
- VMware在windows自啟動,並開啟虛擬機器Windows虛擬機
- 讓Symbian應用程式開機自動啟動
- 自動重新啟動oracle監聽程式 for windowsOracleWindows
- oracle開機自啟動Oracle
- 加快Spring Boot啟動的幾種方法 | baeldungSpring Boot
- win10開機自啟動程式關閉方法_win10怎麼關閉開機啟動項Win10
- windows10自動關機程式碼怎麼設定_windows10自動關機的設定方法Windows
- 開機自動啟動ORACLE ON LinuxOracleLinux
- android APP開機自動啟動AndroidAPP
- Windows 7系統開機啟動項的管理方法Windows
- windows defender怎麼開啟 windows defender啟動方法Windows
- 怎樣開啟windows自動更新,開啟電腦更新的步驟及方法Windows
- KVM虛機開機自啟和取消自啟動
- 編寫隨Windows啟動自動執行的程式 (轉)Windows
- freebsd 下程式隨系統開機啟動的一種方法(GNU)薦
- Linux下兩種自動啟動Tomcat的方法(轉)LinuxTomcat
- oracle配置開機自啟動Oracle
- windows10開機怎麼以安全模式啟動_win10開機以安全模式啟動的方法Windows模式Win10
- win10怎麼設定bat開機自啟動_win10系統新增bat開機自啟動的方法Win10BAT
- 在linux中怎麼讓程式開機自動啟動?Linux
- nginx 加入到開機自動啟動Nginx
- oracle資料庫開機自動啟動Oracle資料庫