1. 程式人生 > >VC程式修改登錄檔開機啟動

VC程式修改登錄檔開機啟動

很多監控軟體要求軟體能夠在系統重新啟動後不用使用者去點選圖示啟動專案,而是直接能夠啟動執行,方法是寫登錄檔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有一定的瞭解。