.Net在寫托盤程序中碰到的一些問題的解決方法(無法關機/自啓動等)

 最近做的一個文件自動上傳的托盤程序涉及到一些問題,在網上找了一些,再把自己的一些寫上來,方便自己和別人可以參考
1.如何防止程序多次運行?
a:第一種
 [STAThread]
 static void Main()
 {
  Process [] pss = System.Diagnostics.Process.GetProcesses();  
  for(int i=0;i<pss.Length;i++)
  {
   Process ps = pss[i];
   if(ps.ProcessName == "MyNotifyApplication")
   {
    if(ps.Id != Process.GetCurrentProcess().Id)
    {     
     return;
    }
   }
  }
  Application.Run(new Form1());  
 }
b:第二種
        /// <summary>
        /// 應用程序的主入口點。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            string processName = System.Diagnostics.Process.GetCurrentProcess().ProcessName;
            int matched = 0;
            foreach (System.Diagnostics.Process process in System.Diagnostics.Process.GetProcesses())
            {
                if (processName == process.ProcessName) matched++;
            }

            if (matched >= 2)
            {
                    return;
            }
            Application.Run(new Main_Obser());
        }

2.如何在最小化程序時隱藏窗體?
 this.Resize += new System.EventHandler(this.Form1_Resize);
 private void Form1_Resize(object sender, System.EventArgs e)
 {
  if(this.WindowState == FormWindowState.Minimized)
  {
   this.Hide();
  }
 }

3.如何在點擊關閉按鈕時隱藏窗體?
 private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
 {  
  if(!ClosedByPeople && !ClosedBySystem)
  {
   this.Hide();
   e.Cancel = true;
  }  
 }

4.如何確實要關閉程序?
 private void menuExit_Click(object sender, System.EventArgs e)
 {
  ClosedByPeople = true;
  this.Close();
 }

5.系統關機或重啓時,如何關閉程序?

a:第一種
 private const int WM_QUERYENDSESSION=0x0011;
 [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]
 protected override void WndProc(ref Message m)
 {
  if(m.Msg == WM_QUERYENDSESSION)
  {
   ClosedBySystem = true;
  }
  base.WndProc (ref m);
 }
b:第二種
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if ((e.CloseReason==CloseReason.ApplicationExitCall)||(e.CloseReason==CloseReason.WindowsShutDown))
{
e.Cancel = false;
}
else
{
e.Cancel=true;
}
最小化();
}

6。托盤程序開機自動運行

a:放到註冊表中(這個我放了,但好象不太行,可能是我處理不對)
        /// <summary>
        /// 在註冊表中輸入程序自動運行路徑
        /// </summary>
        /// <param name="programPath"></param>
        public static void SetRegistryKey(string programPath)
        {
            try
            {
                RegistryKey rk = Registry.LocalMachine.CreateSubKey(AUTOUPLOAD_REGISTRY_PATH);
                rk.SetValue(DEFAULTNAME, programPath+@"/"+PROGRAM_NAME);
                rk.Close();
            }
            catch
            {
            }
        }

 b:放到系統的啓動目錄中
        /// <summary>
        /// get the startup path from registry
        /// </summary>
        /// <returns></returns>
        public static string getRegistryKeyStartUpPathAndFile()
        {
            try
            {
                string ss = string.Empty;
                RegistryKey rk = Registry.CurrentUser.CreateSubKey(STARTUP_REGISTRYKEY);
                ss = rk.GetValue(STARTUP_PATH_REGKEY).ToString();
                rk.Close();
                return ss + @"/" + STARTUP_FILE_NAME;
            }
            catch(Exception ex)
            {
                return "";
            }
        }
        /// <summary>
        /// Create a Shortcut for the autoload application
        /// </summary>
        /// <param name="iconPath">the special icon path</param>
        public static void createShortCut(string iconPath)
        {
            string ss = getRegistryKeyStartUpPathAndFile();
            WshShell shell = new WshShell();           
            //IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) +"//" + "Allen’s Application.lnk");
            //string panQuot = System.Environment.SystemDirectory.Substring(0, 1);           
            IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(ss);

            shortcut.TargetPath = System.Reflection.Assembly.GetExecutingAssembly().Location;
           
            shortcut.WorkingDirectory = System.Environment.CurrentDirectory;

            shortcut.WindowStyle = 1;

            shortcut.Description = "AutoUpload Application";

            //shortcut.IconLocation = System.Environment.SystemDirectory + "//" + "shell32.dll, 165";
            shortcut.IconLocation = iconPath;
          
            shortcut.Save();

        }
        /// <summary>
        /// remove the autoupload application shortcut from the startup path
        /// </summary>
        public static void removeShortCut()
        {
            //string panQuot = System.Environment.SystemDirectory.Substring(0, 1);
            if (System.IO.File.Exists(getRegistryKeyStartUpPathAndFile()))
            {
                System.IO.File.Delete(getRegistryKeyStartUpPathAndFile());
            }

        }

==========================================================================

這裏附上對啓動的操作方法:

Windows的自啓動方式
正文:

最後一次修改日期:August 12, 2002
目錄:
WINDOWS的自啓動方式1
正文:1
目錄:1
前言:2
警告:2
Windows的自啓動方式:2
1.自啓動目錄:2
1.第一自啓動目錄:2
2.第二自啓動目錄:3
2.系統配置文件啓動:4
1.WIN.INI啓動:4
2.SYSTEM.INI啓動:4
3.WININIT.INI啓動:5
4.WINSTART.BAT啓動:6
5.AUTOEXEC.BAT啓動:6
3.註冊表啓動:6 bbs.bitsCN.com
1.常規啓動:6
2.特殊啓動1:8
3.特殊啓動2:8
4.其他啓動方式:8
1.C:/Explorer.exe啓動方式:9
2.屏幕保護啓動方式:9
3.依附啓動:10
4.計劃任務啓動方式:10
5.AutoRun.inf啓動方式:10
5.自動啓動相關:11
1.代啓動:11
2.Start啓動:12
3.控制面板啓動:12
4.其他:12
最後:13
主要參考資料:14
http://www.tlsecurity.net/auto.html14
http://support.microsoft.com/support/kb/articles/Q232/5/09.ASP17
Syntax for the RunOnceEx Registry Key17
SUMMARY17
MORE INformATION17
RunOnceEx Sample to Run Notepad18
Sample Syntax18
Notes18
Definition of values and Subkeys18
Wininit.ini與病毒(名稱爲筆者所加)20
http://www.microsoft.com/technet/security/bulletin/fq00-052.asp23

前言:
有時候人們往往會爲了一個程序的啓動而頭痛,因爲一些用戶往往不知道那些文件是如何啓動的。所以經常會有些沒用的東西掛在系統上佔用資源。有時候也會有人因爲不知道如何啓動某個文件而頭痛。更有些特洛依木馬的作者因爲不清楚系統的自啓動方式而使自己的木馬輕鬆被別人發現…… bbs.bitsCN.com
Windows的自啓動方式其實有許多方式。除了一些常見的啓動方式之外,還有一些非常隱蔽的可用來啓動文件的方式。本文總結如下,雖然不是全部,但我想應該會對大家有所幫助。文章全部以系統默認的狀態爲準,以供研究。
其中(English)代表英文操作系統,(Chinese)代表中文操作系統。本文沒加說明說的全爲中文Windows98操作系統。
警告:
文中提及的一些操作可能會涉及到系統的穩定性。例如如果不正確地使用註冊表編輯器可以導致可能重新安裝系統這樣嚴重的問題。微軟也不能保證因不正常使用註冊表編輯器而造成的結果可以被解決。筆者不對使用後果負責,請根據自己的情況使用。
Windows的自啓動方式:
1.自啓動目錄:
1.第一自啓動目錄:
默認路徑位於:
C:/windows/start menu/programs/startup(English)
C:/windows/start menu/programs/啓動(Chinese)
這是最基本、最常用的Windows啓動方式,主要用於啓動一些應用軟件的自啓動項目,如Office的快捷菜單。一般用戶希望啓動時所要啓動的文件也可以通過這裏啓動,只需把所需文件或其快捷方式放入文件夾中即可。 bitsCN_com
對應的註冊表位置:
[HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Explorer/Shell Folders]
Startup="%Directory%"
[HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Explorer/User Shell Folders]
Startup="%Directory%"
其中“%Directory%”爲啓動文件夾位置。
英文默認爲:
C:/windows/start menu/programs/startup
中文默認爲:
C:/windows/start menu/programs/啓動
在開始菜單的“啓動”文件夾是可更改的,如果用戶更改了啓動文件夾,則以上註冊表的鍵值均會改變爲相應的名稱。
值得注意的是:開始菜單的“啓動”文件夾中的內容雖然在默認的狀態下可以被用戶看得一清二楚。但通過改動還是可以達到相當隱蔽地啓動的目的的:
首先,“啓動”文件夾中的快捷方式或其他文件的屬性可以改變爲“隱藏”。這樣可以達到系統不啓動被隱藏的文件,等到需要啓動的時候又可以通過更改回文件屬性而恢復啓動的作用。
其次,其實“啓動”文件夾只是一個普通的文件夾,但是由於系統監視了這個文件夾,所以變得有些特殊,但文件夾有的功能該文件夾也是有的。譬如“啓動”文件夾的名稱是可以更改的,並且“啓動”文件夾也可以設置屬性。如果把屬性設置爲“隱藏”,則在系統中的【開始】&#61672;;【程序】菜單中是看不到“啓動”文件夾的(即使在“文件夾選項”中已經設定了“顯示所有文件”)。而系統還會啓動這個被隱藏的文件夾中的非隱藏文件。 bitsCN.nET中國網管博客
敏感的人們也許已經發現問題。舉一個例子:
如果我想啓動A木馬的server端服務器,我可以把原來的“啓動”菜單的名稱更改爲“StartUp”(這裏是隨便改的,註冊表相應的鍵值也會自動更改。)之後再創建一個名爲“啓動”的文件夾,把“StartUp”菜單中的文件全部複製(這裏用複製,可以騙過用戶的檢查)到“啓動”菜單中,然後把A木馬的server程序放入“StartUp”文件夾中,最後把“StartUp”文件夾隱藏。大功告成!
從外表看來,用戶的【開始】&#61672;;【啓動】目錄還在,而且要啓動的文件也在。但系統此時啓動的文件不是名爲“啓動”的文件夾中的文件,而是名爲“StartUp”的文件夾中的文件。如果木馬做的好的話,完全可以在每次啓動的時候把“StartUp”中的文件複製到“啓動”目錄中來達到實時更新啓動目錄的目的。由於“StartUp”文件夾被隱藏,從【開始】&#61672;;【程序】中是無法看到真正的啓動菜單“StartUp”的,所以達到了隱蔽啓動的目的!
這個啓動方式雖然比較隱蔽,但通過msconfig依舊可以在“啓動”頁中看出來。
2.第二自啓動目錄:
是的,其實,Windows還有另外一個自啓動目錄,而且很明顯但卻經常被人們忽略的一個。 BBS.bitsCN.com網管論壇
該路徑位於:
C:/WINDOWS/All Users/Start Menu/Programs/StartUp(English)
C:/WINDOWS/All Users/Start Menu/Programs/啓動(Chinese)
這個目錄的使用方法和第一自啓動目錄是完全一樣的。只要找到該目錄,將所需要啓動的文件拖放進去就可以達到啓動的目的。
[HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/explorer/User Shell Folders]
"Common Startup"="%Directory%"
[HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/explorer/Shell Folders]
"Common Startup"="%Directory%"
值得注意的是:該目錄在開始菜單的“啓動”目錄中是完全不能被看見的。而伴隨着每次啓動,該目錄下的非隱藏文件也會隨之啓動!
另外,在Msconfig中可以看到在這個目錄下要啓動的文件。


2.系統配置文件啓動:
由於系統的配置文件對於大多數的用戶來說都是相當陌生的;這就造成了這些啓動方法相對來說都是相當隱蔽的,所以這裏提到的一些方法常常會被用於做一些破壞性的操作,請讀者注意。
www.bitsCN.com

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回車,之後按照文字說明即可。
注意:
DL.bitsCN.com網管軟件下載

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文件……之後再被刪除。 bbs.bitsCN.com
文件格式:
[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啓動:
bitsCN.nET中國網管博客


這是一個系統自啓動的批處理文件,主要作用是處理一些需要複製、刪除的任務。譬如有些軟件會在安裝或卸載完之後要求重新啓動,就可以利用這個複製和刪除一些文件來達到完成任務的目的。如:
“@if exist C:/WINDOWS/TEMP/PROC.BAT call C:/WINDOWS/TEMP/PROC.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有一定的瞭解。.
3.註冊表啓動:
註冊表中的啓動應該是被使用最頻繁的啓動方式,但這樣的方式也有一些隱蔽性較高的方法,大致有三種。 中國網管論壇
1.常規啓動:
其中/%path%/爲任意路徑,file.exe爲要運行的程序。
[HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/RunServices]
"Anything"="/%path%/file.exe"
[HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/RunServicesOnce]
"Anything"="/%path%/file.exe"
[HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Run]
"Anything"="/%path%/file.exe"
[HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/RunOnce]
"Anything"="/%path%/file.exe"

[HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Run]
 "Whatever"="c:/runfolder/program.exe"
[HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/RunOnce]
bitsCN.nET中國網管博客

 "Whatever"="c:/runfolder/program.exe"
注意:
1.如果需要運行.dll文件,則需要特殊的命令行。
如:
Rundll32.exe C:/WINDOWS/FILE.DLL,Rundll32
2.解除這裏相應的自啓動項只需刪除該鍵值即可,但注意不要刪除如SystemTray、ScanRegistry等這樣的系統鍵值。
3.如果只想不啓動而保留鍵值,只需在該鍵值加入rem即可。如:
“remC:/Windows/a.exe”
4.在註冊表中的自啓動項中沒有這項:
[HKEY_CURRENT_USER /Software/Microsoft/Windows/CurrentVersion/RunServices]
5.Run和RunServices的區別在於:Run中的程序是在每次系統啓動時被啓動,RunServices則是會在每次登錄系統時被啓動。
關於:
[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/RunOnceEx]
有特殊的語法:
例如,運行notepad.exe
HKLM/SOFTWARE/Microsoft/Windows/CurrentVersion/RunOnceEx 中國網管論壇
"Title"="My Setup Title"
"Flag"=dword:00000002

HKLM/SOFTWARE/Microsoft/Windows/CurrentVersion/RunOnceEx/0001
"RunMyApp"="||notepad.exe"
語法爲:
HKLM/SOFTWARE/Microsoft/Windows/CurrentVersion/RunOnceEx
Flags = 0x0000000
Title = "Status Dialog Box Title"

HKLM/SOFTWARE/Microsoft/Windows/CurrentVersion/RunOnceEx/Depend
0001 = "xxx1"
000X = "xxxx"

HKLM/SOFTWARE/Microsoft/Windows/CurrentVersion/RunOnceEx/0001
Entry1 = "MyApp1.exe"
EntryX = "MyApp2.exe"

HKLM/SOFTWARE/Microsoft/Windows/CurrentVersion/RunOnceEx/000x
...
注意:
1.“xxx1,xxxx”是一個動態鏈接庫(DLL)或.OCX文件名(如My.ocx或My.dll)。 www_bitscn_com
2.“0001,000x”是部分名字。可以是數字和文字。
3.“entry1,entryX”是指向一個要運行的程序文件的註冊表串值。
鍵值的說明:
Flags是一個定位在RunOnceEx鍵用來激活/禁止的DWORD值,具體如下:
值功能功能定義
0x00000000默認所有功能被禁止
0x00000004檢查殼狀況打開殼的讀寫校驗準備接受OLE命令
0x00000008無報錯對話錯誤對話框不顯示
0x00000010創建錯誤報告文件創建 C:/Windows/RunOnceEx.err 文件如果有錯誤出現
0x00000020創建執行報告文件創建一個有命令狀態的C:/Windows/RunOnceEx.log文件
0x00000040無例外限制當註冊DLL時不限制例外
0x00000080無狀態對話當RunOnceEx運行時狀態對話框不顯示

由於涉及篇幅較多,具體做法請瀏覽微軟網頁:
http://support.microsoft.com/support/kb/articles/Q232/5/09.ASP

2.特殊啓動1:
在註冊表中除了上述的普通的啓動方式以外,還可以利用一些特殊的方式達到啓動的目的:
[HKEY_CLASSES_ROOT/exefile/shell/open/command] @="%1" %* www_bitscn_com
[HKEY_CLASSES_ROOT/comfile/shell/open/command] @="%1" %*
[HKEY_CLASSES_ROOT/batfile/shell/open/command] @="%1" %*
[HKEY_CLASSES_ROOT/htafile/shell/open/command] @="%1" %*
[HKEY_CLASSES_ROOT/piffile/shell/open/command] @="%1" %*
[HKEY_LOCAL_MACHINE/Software/CLASSES/batfile/shell/open/command] @="%1" %*
[HKEY_LOCAL_MACHINE/Software/CLASSES/comfile/shell/open/command] @="%1" %*
[HKEY_LOCAL_MACHINE/Software/CLASSES/exefile/shell/open/command] @="%1" %*
[HKEY_LOCAL_MACHINE/Software/CLASSES/htafile/shell/open/command] @= "%1" %*
[HKEY_LOCAL_MACHINE/Software/CLASSES/piffile/shell/open/command] @="%1" %*

其實從註冊表的路徑上也許就隱約可以看出,這些都是一些經常被執行的可執行文件的鍵值。往往有些木馬是可以更改這些鍵值從而達到加載的目的:
如果我把“”%1”%*”改爲“file.exe”%1”%*”則文件file.exe就會在每次執行某一個類型的文件(要看改的是哪一個文件類型)的時候被執行!
當然,可以被更改的不一定只是可執行文件,譬如冰河就利用了TXT文件的鍵值: bitsCN.nET中國網管博客
[HKEY_CLASSES_ROOT/txtfile/shell/open/command]實現木馬的一種啓動方式。
3.特殊啓動2:
在註冊表中:
HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/VxD/
的位置上有這樣的地址。該地址是系統啓動VxD驅動文件放置的地址,就像PrettyPark這個蠕蟲一樣,可以建立一個主鍵之後把VxD文件添加到註冊表中在這裏。
注意:不可以直接把一個EXE文件改名爲VxD文件,需要另外進行編程,生成的VxD文件。
4.其他啓動方式:
1.C:/Explorer.exe啓動方式:
這是一種特殊的啓動方式,很少有人知道。
在Win9X下,由於SYSTEM.INI只指定了Windows的外殼文件EXPLORER.EXE的名稱,而並沒有指定絕對路徑,所以Win9X會搜索EXPLORER.EXE文件。
搜索順序如下:
1.搜索當前目錄。
2.如果沒有搜索到EXPLORER.EXE則系統會獲取
[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager/Environment/Path]的信息獲得相對路徑。
3.如果還是沒有文件系統則會獲取[HKEY_CURRENT_USER/Environment/Path]的信息獲得相對路徑。
其中:
[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager/Environment/Path]和[HKEY_CURRENT_USER/Environment/Path]所保存的相對路徑的鍵值爲:“%SystemRoot%/System32;%SystemRoot%”和空。
bitsCN.nET中國網管博客


所以,由於當系統啓動時,“當前目錄”肯定是/%SystemDrive%/(系統驅動器),這樣系統搜索EXPLORER.EXE的順序應該是:
1./%SystemDrive%/(例如C:/)
2./%SystemRoot%/System32(例如C:/WINNT/SYSTEM32)
3./%SystemRoot%/(例如C:/WINNT)
此時,如果把一個名爲EXPLORER.EXE的文件放到系統根目錄下,這樣在每次啓動的時候系統就會自動先啓動根目錄下的EXPLORER.EXE而不啓動Windows目錄下的EXPLORER.EXE了。
在WinNT系列下,WindowsNT/Windows2000更加註意了EXPLORER.EXE的文件名放置的位置,把系統啓動時要使用的外殼文件(EXPLORER.EXE)的名稱放到了:
[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/WindowsNT/CurrentVersion/Winlogon/Shell]
這個位置。
作爲默認這個位置是不存在的,默認爲是Explorer.exe。
具體請參考:http://www.microsoft.com/technet/security/bulletin/fq00-052.asp
注意:
一定要確定根目錄下的EXPLORER.EXE要能啓動Windows目錄下的EXPLORER.EXE,否則會導致Windows無法啓動!
DL.bitsCN.com網管軟件下載

現在流行的病毒CodeRed就會在C:/和D:/目錄下放置兩個約8KB的EXPLORER.EXE的文件!
在Windows 2000 SP2中微軟已經更改了這一方式。
2.屏幕保護啓動方式:
Windows的屏幕保護程序是一個.scr文件。這是一個PE格式的可執行文件。如果把屏幕保護程序.scr更名爲.exe的文件,則該程序仍然可以正常啓動。類似的.exe文件更名爲.scr文件也是一樣可以被運行!
.scr文件默認存在於C:/Windows目錄中,他的名字就是在“顯示”屬性中的“屏幕保護程序”中的名稱。在C:/Windows目錄下的所有*.scr文件都會被Windows的“屏幕保護程序”顯示,而文件路徑本身保存在System.ini中的SCRNSAVE.EXE=的這條中。有意思的是在SCRNSAVE.EXE=這條中,其規定的路徑也包含了目錄名稱。即如果我想安裝一個.scr文件時,譬如安裝路徑爲D:/SCR/1.scr,而D:/SCR/這個目錄中還有2.scr,則在這個目錄中的所有.scr(1.scr,2.scr)文件都會被顯示在“屏幕保護程序”設置中。如果屏幕保護程序設爲“(無)”,則SCRNSAVE.EXE=這條不存在。但如果SCRNSAVE.EXE=這條所指的文件或目錄是錯誤的,則在“屏幕保護程序設置”中仍然會顯示“(無)”。 中國網管論壇
屏幕保護程序的啓動時間保存在註冊表中的這個位置上:
HKEY_USERS/.DEFAULT/Control Panel/desktop/ScreenSaveTimeOut
時間單位爲秒,不過雖然是秒,可啓動時間卻爲分,即從60秒開始記錄,如果記錄時間小於60秒,則自動定爲1分鐘。
屏幕保護是否設置密碼的鍵值爲:
HKEY_USERS/.DEFAULT/Control Panel/desktop/ScreenSaveUsePassword
有密碼則值爲1沒有密碼則值爲0。
由此可見,如果有人把自己所作的.exe程序更名爲.scr的程序,並使程序能夠在SYSTEM.INI中添加“SCANSAVE.EXE=/%Path%”f/ile.scr”(/%Path%/file.scr爲所需要設置的文件的路徑和文件名,如C:/Program files/trojan.scr),修改註冊表中的HKEY_USERS/.DEFAULT/Control Panel/desktop/ScreenSaveTimeOut,定時間爲60,則系統只要閒置一分鐘該文件就會被啓動!
另外一個簡單的破壞方式就是可以隨機產生屏幕保護密碼並寫入相應文件的相應位置,定時間爲1分鐘,則系統只要閒置一分鐘則會被被鎖!(由於涉及問題並非自啓動問題,所以不加以討論。)
注意:由於SCANSAVE.EXE=這裏還會定義.scr文件的路徑,所以最好不要把要啓動的文件放置在.scr文件較多的一些目錄,否則容易引起懷疑。(Windows目錄除外)
bitsCN.Com


3.依附啓動:
這類啓動方式已經有幾分類似病毒了。這種方法是利用病毒的傳染機制把要啓動的EXE文件附着在另外的一個和多個EXE文件上,從而達到啓動這個EXE文件就可以啓動要啓動的文件的目的。記得1999年YAI這個木馬流行的時候,它就使用了依附一個EXE文件而達到啓動的目的,但是由於BUGS和方式問題該木馬的破壞作用卻體現在了它“病毒”的一面。
使用這種啓動方法一定要注意不能破壞EXE文件(否則會很容易被發現),而且最好把木馬定位在固定的一個或者幾個EXE文件上。如:IEXPLORE.EXE(IE的EXE文件),RNAPP.EXE(撥號網絡的EXE文件)等等。
注意:這種方法的使用比較危險,技術上也需要相當功底,而且和病毒的距離很近,慎用。
4.計劃任務啓動方式:
Windows的計劃任務是Windows的一個預置實現某些操作而使用的一個功能。但是如果利用這個功能也是能夠實現自啓動的目的的!由於很多電腦都會自動加載“計劃任務”所以隱蔽性相對不錯。
在Windows默認的情況下,計劃任務是一個個保存在C:/Windows/Tasks/目錄下的.job文件。.job文件裏包括了啓動方式、文件路徑等一系列的信息。編制出或者使軟件自己可以寫出.job文件,則是關鍵。之後在相關地方寫入標記啓動即可。
bitsCN_com

由於時間關係,這個方法沒有來得及試驗,讀者可以自己試驗一下。
5.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 bitsCN_com
文件於C:/下,內容如下:
[AUTORUN]
OPEN=Windows/aaa.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:/CCC/bbb.exe
ICON=bbb.exe
則這時如果雙擊C盤則可以執行D盤CCC目錄上的bbb.exe文件!
3.如果沒有OPEN項目,則系統不執行任何文件,而去執行下一個命令。
4.如果沒有ICON項目,則該盤符的圖標爲原Windows盤符圖標,但如果有ICON項卻設置錯誤,或者所設置的文件沒有圖標,則系統會顯示爲默認的空白圖標。
5.自動啓動相關:
1.代啓動:
這種啓動方式其實只是一個方法的問題。即可以用啓動一個正常文件來啓動另一個文件,SubSeven就用過啓動Windos.exe從而啓動SubSeven的Sever文件的方法。
DL.bitsCN.com網管軟件下載

2.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
但似乎有些有啓動畫面的軟件(如金山詞霸)對這條命令並沒有反映。
3.控制面板啓動:
這是利用控制面板程序可以被類似DLL執行,從而達到啓動目的。
在控制面板中,.cpl文件是控制面板的原文件。默認的這些文件都會被放置在/%WINDOWS%/SYSTEM/目錄下的,如desk.cpl是桌面屬性、inetcpl.cpl是Internet選項之類。但這些.cpl文件全都是PE格式文件,也就是說如果用戶把一個可執行的類似DLL的.cpl文件放入%/Windows%/System/中,則在控制面板中可看到其圖標,並可執行!
DL.bitsCN.com網管軟件下載

由於.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:/Windows/System;最後的X爲desk.cpl文件的頁數:從0開始,0爲第一頁(如“顯示屬性”的“背景”),1爲第二頁(如“桌面屬性”的“屏幕保護程序”),依此類推。
但如果照上面的方法做,則該文件會在控制面板中被顯示。有兩種方法可以不讓其顯示:
1.不要把自己的.cpl文件放在C:/WINDOWS/SYSTEM中。因爲默認的情況下Windows會加載的所有.cpl文件。如果想讓其顯示則打開C:/WINDOWS/下的Control.ini文件,在[MMCPL]中寫入類似:
file.cpl=D:/path/file.cpl
的命令,從而達到顯示的目的。
2.當你看到Control.ini文件的時候一定可以看到在[MMCPL]上面的[don't load]。是的,如果把你的文件以file.cpl=no的格式寫入到這裏面,那麼文件就不被加載了。反之恢復。 bitsCN_com
4.其他:
註冊表中:
HKEY_USERS/.DEFAULT/Software/Microsoft/Windows/CurrentVersion/Explorer/Advanced
的“HideFileExt”這個鍵值是確定Windows是不是顯示擴展名的值,如果其值爲1就隱藏擴展名,爲0則不隱藏。
EXE文件中:
如SirCam蠕蟲一樣,*.EXE文件的擴展名可以改名稱爲.BAT、.COM、.PIF、.SCR等,並且運行效果一樣,反過來不一定。但.EXE文件並不能更名爲.LNK文件,這也許也是SirCam的一個BUG。
最後:
Windows的自啓動方式有很多樣式。這是Windows系統的一部分。一個隱蔽而又很少有人知道的自啓動方式是遠程監控軟件成爲一個優秀的軟件的必要的條件。對於普通用戶來說,瞭解這些信息也是非常必要的。筆者試圖全面的介紹這些可以啓動的方法和想法。文中提到的一些自啓動方法有的很普通,有的則很少有人知道,有些方式甚至有可能是第一次被寫出來。其中的許多方式筆者加入了自己的想法,使一些方式雖然普通但卻很隱蔽。
其中所提的自啓動方式全部在Windows98或提到的相應的系統中默認測試通過。對Windows ME和Windows2000只有部分適用。通過對不同平臺的自啓動方式測試,也可以發現Windows系統還是朝着越來越完善的方向發展。所以在未來的某個WINDOWS版本中,筆者不能保證這些能被使用。但總會有一些可以利用的地方。如果這篇塗鴉能給各位讀者帶來一些啓發,那麼筆者將會感到非常高興!

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