隨著病毒、流氓軟件、廣告軟件等的日益增多,許多人都開(kāi)始使用注冊(cè)表監(jiān)視程序,這些監(jiān)視程序通常會(huì)在安裝軟件試圖修改注冊(cè)表時(shí),彈出一個(gè)警告窗口提示用戶。然而,在安全問(wèn)題上,經(jīng)常被忽略的地方則是Windows事件日志--尤其是安全日志,安全日志通常記錄了Windows操作系統(tǒng)及關(guān)鍵系統(tǒng)應(yīng)用程序的操作,如試圖非法登錄、端口掃描、及其他安全相關(guān)的事件。
文中將演示如何在應(yīng)用程序中監(jiān)視Windows事件日志,當(dāng)然了,還可以對(duì)程序進(jìn)行擴(kuò)充,如在事件日志記錄到特定的事件類型時(shí),發(fā)電子郵件通知用戶。
用 .NET EventLog進(jìn)行監(jiān)視
文中的代碼使用了 .NET 1.0/1.1托管C++語(yǔ)法,如果你在使用一個(gè)更高版本的 .NET,需要在工程屬性對(duì)話框中設(shè)置/clr:oldSyntax編譯選項(xiàng),或調(diào)整以下代碼使之符合新的托管語(yǔ)法。
用于Windows事件日志的關(guān)鍵 .NET類型是Diagnostics::EventLog類。
1、 定義一個(gè)托管類并實(shí)現(xiàn)事件日志通知處理程序
處理程序(OnNewLogEntry)會(huì)在"新事件日志項(xiàng)"事件引發(fā)時(shí)調(diào)用,同時(shí),請(qǐng)注意此處的EntryWrittenEventHandler,以下是示例代碼:
//用于監(jiān)視新事件日志項(xiàng)的示例代碼
__gc class NewLogEntryEventHandler
{
public:
NewLogEntryEventHandler() {}
public:
void OnNewLogEntry(Object* sender, EntryWrittenEventArgs* e)
{
//獲取并處理最近創(chuàng)建的項(xiàng)
EventLogEntry* entry = e->Entry;
}
};
2、實(shí)例化一個(gè)EventLog對(duì)象,并把它的EnableRaisingEvents屬性設(shè)為true
屬性EventLog::EnableRaisingEvents是一個(gè)布爾類型,其控制了在項(xiàng)目添加到EventLog對(duì)象指定的日志時(shí),是否引發(fā)事件:
EventLog* log = new EventLog("Application");
log->EnableRaisingEvents = true
3、把事件處理程序連接到"新事件日志項(xiàng)"事件
首先,實(shí)例化定義了事件處理程序的對(duì)象(在此例中為NewLogEntryEventHandler),接著,把事件方法(OnNewLogEntry)添加到EventLog::EntryWritten的事件處理程序列表中:
NewLogEntryEventHandler* handler = new NewLogEntryEventHandler();
log->EntryWritten +=
new EntryWrittenEventHandler( handler,&NewLogEntryEventHandler::OnNewLogEntry);
4、為特定事件的處理編寫代碼
回過(guò)頭來(lái)看一個(gè)OnNewLogEntry方法,可以看到傳遞給事件處理程序的EntryWrittenEventArgs對(duì)象有一個(gè)名為EventLogEntry的成員,其包含了有關(guān)記錄項(xiàng)目的詳細(xì)情況,具體為以下屬性:
·MachineName--創(chuàng)建事件日志的電腦系統(tǒng)名。
·Source--創(chuàng)建此事件的事件源或程序源。
·Message--用戶可在事件查看器中讀取這條文本值,其描述了記錄的事件。
·Event Type--此值(代表了EventLogEntryType)為一個(gè)枚舉值,其代表記錄的事件類型:信息(默認(rèn))、警告、錯(cuò)誤、審核成功、審核失敗。
·Event ID--為有關(guān)事件程序特定的號(hào)碼。
·Data--此值通常用于存儲(chǔ)二進(jìn)制信息--如內(nèi)存轉(zhuǎn)儲(chǔ)--也是與事件有關(guān)的。
不足之處
從以上可以看出,.NET使得訪問(wèn)事件日志非常簡(jiǎn)單,然而,以下也有一些有關(guān)處理事件日志時(shí)的限制條件:
·只能在本地系統(tǒng)上監(jiān)視事件。
·.NET文檔未說(shuō)明,如果在短時(shí)間內(nèi)記錄了大量的事件,是否可保證每個(gè)事件都可被引發(fā)。
·如果監(jiān)視了更新特別頻繁的事件日志,事件有可能不會(huì)立即引發(fā),在事件項(xiàng)之間很可能會(huì)有一個(gè)滯后,接著突然會(huì)有大量的事件通知進(jìn)入消息隊(duì)列。
文中將演示如何在應(yīng)用程序中監(jiān)視Windows事件日志,當(dāng)然了,還可以對(duì)程序進(jìn)行擴(kuò)充,如在事件日志記錄到特定的事件類型時(shí),發(fā)電子郵件通知用戶。
用 .NET EventLog進(jìn)行監(jiān)視
文中的代碼使用了 .NET 1.0/1.1托管C++語(yǔ)法,如果你在使用一個(gè)更高版本的 .NET,需要在工程屬性對(duì)話框中設(shè)置/clr:oldSyntax編譯選項(xiàng),或調(diào)整以下代碼使之符合新的托管語(yǔ)法。
用于Windows事件日志的關(guān)鍵 .NET類型是Diagnostics::EventLog類。
1、 定義一個(gè)托管類并實(shí)現(xiàn)事件日志通知處理程序
處理程序(OnNewLogEntry)會(huì)在"新事件日志項(xiàng)"事件引發(fā)時(shí)調(diào)用,同時(shí),請(qǐng)注意此處的EntryWrittenEventHandler,以下是示例代碼:
//用于監(jiān)視新事件日志項(xiàng)的示例代碼
__gc class NewLogEntryEventHandler
{
public:
NewLogEntryEventHandler() {}
public:
void OnNewLogEntry(Object* sender, EntryWrittenEventArgs* e)
{
//獲取并處理最近創(chuàng)建的項(xiàng)
EventLogEntry* entry = e->Entry;
}
};
2、實(shí)例化一個(gè)EventLog對(duì)象,并把它的EnableRaisingEvents屬性設(shè)為true
屬性EventLog::EnableRaisingEvents是一個(gè)布爾類型,其控制了在項(xiàng)目添加到EventLog對(duì)象指定的日志時(shí),是否引發(fā)事件:
EventLog* log = new EventLog("Application");
log->EnableRaisingEvents = true
3、把事件處理程序連接到"新事件日志項(xiàng)"事件
首先,實(shí)例化定義了事件處理程序的對(duì)象(在此例中為NewLogEntryEventHandler),接著,把事件方法(OnNewLogEntry)添加到EventLog::EntryWritten的事件處理程序列表中:
NewLogEntryEventHandler* handler = new NewLogEntryEventHandler();
log->EntryWritten +=
new EntryWrittenEventHandler( handler,&NewLogEntryEventHandler::OnNewLogEntry);
4、為特定事件的處理編寫代碼
回過(guò)頭來(lái)看一個(gè)OnNewLogEntry方法,可以看到傳遞給事件處理程序的EntryWrittenEventArgs對(duì)象有一個(gè)名為EventLogEntry的成員,其包含了有關(guān)記錄項(xiàng)目的詳細(xì)情況,具體為以下屬性:
·MachineName--創(chuàng)建事件日志的電腦系統(tǒng)名。
·Source--創(chuàng)建此事件的事件源或程序源。
·Message--用戶可在事件查看器中讀取這條文本值,其描述了記錄的事件。
·Event Type--此值(代表了EventLogEntryType)為一個(gè)枚舉值,其代表記錄的事件類型:信息(默認(rèn))、警告、錯(cuò)誤、審核成功、審核失敗。
·Event ID--為有關(guān)事件程序特定的號(hào)碼。
·Data--此值通常用于存儲(chǔ)二進(jìn)制信息--如內(nèi)存轉(zhuǎn)儲(chǔ)--也是與事件有關(guān)的。
不足之處
從以上可以看出,.NET使得訪問(wèn)事件日志非常簡(jiǎn)單,然而,以下也有一些有關(guān)處理事件日志時(shí)的限制條件:
·只能在本地系統(tǒng)上監(jiān)視事件。
·.NET文檔未說(shuō)明,如果在短時(shí)間內(nèi)記錄了大量的事件,是否可保證每個(gè)事件都可被引發(fā)。
·如果監(jiān)視了更新特別頻繁的事件日志,事件有可能不會(huì)立即引發(fā),在事件項(xiàng)之間很可能會(huì)有一個(gè)滯后,接著突然會(huì)有大量的事件通知進(jìn)入消息隊(duì)列。