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("系統參數錯誤,不能隨系統啓動");
    }

其他:


第一種方法:

程序設置如下:

HKEY m_regkey;
char filename[50];
GetModuleFileName(NULL,filename,50);

RegOpenKey(HKEY_LOCAL_MACHINE,"Software//Microsoft//Windows//CurrentVersion//Run",&m_regkey);
    RegSetValueEx(m_regkey,"mykey",0,REG_SZ,(const unsigned char *)filename,50);
RegCloseKey(m_regkey);

如果要刪除運行的程序就按如下設計:
RegOpenKey(HKEY_LOCAL_MACHINE,"Software//Microsoft//Windows//CurrentVersion//Run",&m_regkey);
RegDeleteValue(m_regkey,"mykey");
RegCloseKey(m_regkey);

 

第二種方法:

 CFileDialog savePath(true,NULL,NULL,OFN_HIDEREADONLY,"exe Files(*.exe)|*.exe||",NULL);
   
   if(savePath.DoModal()==IDOK)
    {
      CString fullName;
      fullName=savePath.GetPathName();
      RegKey=NULL;
      RegOpenKey(HKEY_LOCAL_MACHINE,"Software//Microsoft//Windows//CurrentVersion//Run",&RegKey);
      RegSetValueEx(RegKey,"my_program",0,REG_SZ,(const unsigned char *)(LPCTSTR)fullName,fullName.GetLength());

      AfxMessageBox("寫註冊表成功");

      UpdateData(FALSE);
    }    

系統自動啓動程序之十大藏身之所    

  一、當前用戶專有的啓動文件夾
    這是許多應用軟件自動啓動的常用位置,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運行時狀態對話框不顯示

   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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章