『壹』 遇到流氓軟體應該怎麼解決
預防 防範流氓軟體第一步,就是要有安全的上網意識,不要輕易登陸不了解的網站,因為這樣很有可能會中網頁腳本病毒,從而使系統中上流氓軟體。不要隨便下載不熟悉的軟體,如果用戶不了解這些軟體,當這些軟體中捆綁一些流氓軟體時,用戶也無法察覺。安裝軟體時應仔細閱讀軟體附帶的用戶協議及使用說明,有些軟體在安裝的過程中會以不引起用戶注意的方式提示用戶要安裝流氓軟體,這時如果用戶不認真看提示的話,就會安裝上流氓軟體,由於這是用戶自己選擇的,因此,用戶不會受到保護。 在安裝操作系統後,應該先上網給系統打補丁,補住一些已知漏洞,這樣能夠避免利用已知漏洞的流氓軟體的駐留。如果用戶使用IE瀏覽器上網,則應該將瀏覽器的安全級別調到中高級別,或者在自定義里,將ACTIVEX控制項、腳本程序都禁止執行,這樣能夠防止一些隱藏在網頁中的流氓軟體的入侵。判斷 第二步,判斷自己是否已經中了流氓軟體。這要根據流氓軟體的中招症狀來看。一般地,瀏覽器首頁被無故修改、總是彈出廣告窗口、CPU的資源被大量佔用、系統變得很慢、瀏覽器經常崩潰、或出現找不到某個DLL文件的提示框,這些是流氓軟體最常見的現象,如果發現計算機中出現這些現象,則很有可能是中了流氓軟體,就要採取相應的措施,而如果出現CPU的資源被大量佔用,系統變得很慢這樣的情況,則很有可能是中了多種流氓軟體的原因,更應該盡快進行相應處理。 確診自己中了流氓軟體 氓軟體無論多麼復雜,它們的傳播流程幾乎是一樣的,都是會通過軟體捆綁或網頁下載先進入到計算機的一個臨時目錄里,一般是是系統的根目錄或者系統默認的臨時目錄,然後將自己激活,這時流氓軟體進入內存中正常運行。當流氓軟體正常運行時,為了下一次能夠自動運行,它們往往會修改注冊表的自啟動項,從而達到自動啟動的目的。然後流氓軟體會將自己拷貝到系統目錄隱藏起來,然後將臨時的安裝文件刪除,最後jian聽系統埠,進行各種各樣的流氓行為。 如果用戶喜歡下載安裝一些小的工具軟體,或者去一些小的網站上瀏覽網頁,雖然計算機沒有出現上述現象,但是也有可能中流氓軟體,這時也應該關注一下計算機,看是否真正中招,這時就可以按照流氓軟體的這個傳播鏈去一一排查。首先利用一些第三方的內存查看工具,看看內存中是否有一些可疑的進程或線程,這需要用戶對系統中的進程或一些常用軟體的進程有所了解,這樣才有可能看出問題。其次,用戶在查看進程的過程中應該看看這些進程的路徑,如果有一些進程的路徑不是正常的安裝目錄,而是系統的臨時目錄,那八成是流氓軟體。 另外,用戶還要看看注冊表裡(開始菜單的運行框里鍵入REGEDIT)的自啟動項(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run)里是否有一些用戶不認識的程序鍵值,這些很可能就是流氓軟體建立的。行動 確診自己中了流氓軟體,清除就相對比較簡單了。對於已知的流氓軟體,建議用戶用專門的清除工具進行清除。 在這里不建議用 戶自己手工清除流氓軟體,因為流氓軟體越來越復雜,已經不再是那種簡單的刪除多個文件就能解決的了,很多流氓軟體在進入系統之前,就對系統進行了修改和關聯,當用戶擅自刪除流氓軟體文件時,系統無法回復到最初的那個狀態,而導致流氓軟體雖然清除了,但系統也總是出現各種錯誤。而專業的清除工具往往已經考慮到這一點,能夠幫助用戶完全恢復系統。 如果在一些特殊場合用戶需要手動清除流氓軟體時,則按照流氓軟體的傳播鏈條,按照先刪除內存的進程,再刪除注冊表中的鍵值,最後再刪除流氓軟體體,將系統配置修改為默認屬性 這樣一個過程進行處理。
『貳』 Trojan/Rootkit.o 是什麼病毒,有什麼危害
鍵盤記錄器Rootkit」
此病毒是一個Rootkit病毒,由C語言編寫的過濾驅動程序,提供鍵盤按鍵記錄功能。
該Rootkit病毒近期多次被Trojan.PSW.Win32.GameOnline型的病毒釋放使用,在該病毒體內可以看到「C:\new-gamehack\GameHack\Driver\bin\i386\mssock.pdb」的字樣,從編譯路徑可以看出該Rootkit顯然是作者特意為盜取游戲密碼病毒所寫。
1、該病毒驅動程序入口函數執行如下操作:
(1) 檢查系統是否存在USB鍵盤設備:病毒首先通過調用ObReferenceObjectByName函數得到\Driver\hisb的驅動對象,然後遍歷該驅動對象創建的功能設備的設備鏈。對設備鏈上的每個設備對象,遍歷其所在的設備棧,對設備棧上的每個設備對象,通過 DEVICE_OBJECT->DriverObject->DriverName獲取每個設備的驅動名稱,比較是否是Driver\kbdhid,如果找到表示有USB鍵盤設備,得到USB鍵盤設備對象的指針。
(2)對鍵盤設備掛接過濾驅動:建立名稱為「\Device\mssock」、符號鏈接名為「\??\mssock」、類型為「FILE_DEVICE_UNKNOWN」的設備,然後通過調用函數IoAttachDeviceToDeviceStack將該設備掛接到鍵盤設備所在的設備棧。
對於USB鍵盤設備,掛接的目標設備為通過前面搜索得到的USB設備對象。對於沒有USB鍵盤設備的情況,通過調用IoGetDeviceObjectPointer獲取名稱為「\Device\KeyboardClass0」的PS/2 鍵盤設備作為目標設備。
(3)填寫功能函數地址:填充卸載常式及各個IRP處理常式回調。
2、病毒的IRP_MJ_READ處理常式:設置完成常式後直接調用IofCallDriver向下一設備傳遞IRP
3、病毒驅動設立的對鍵盤讀的irp包的完成常式:在該完成常式中,病毒驅動實現了獲取並記錄鍵盤按鍵的功能。病毒將讀到的按鍵記錄到緩沖區(通過DEVICE_OBJECT.DeviceExtension傳遞地址)。同時病毒作者在這里和IRP_MJ_DEVICE_CONTROL常式中通過寫0x60埠發送命令控制鍵盤NumLock燈的開閉,可能是作者為了調試時能夠方便的知道其過濾驅動的工作情況。
4、病毒驅動的IRP_MJ_DEVICE_CONTROL處理常式:在這個處理常式中,病毒對值為「0x 80102180」和「80102184」的IOCTL進行了處理。對於IOCTL = 0x 80102180 , 進行初始化處理,如清空記錄緩沖區、計數器等。對於IOCTL = 0x 80102180 ,病毒將把在緩沖區中記錄的按鍵掃描碼返回給調用者。使用這個rootkit的程序可以調用DeviceIoContro函數進行控制和讀取按鍵記錄。
5、卸載常式:
調用IoDetachDevice摘除過濾設備
調用IoDeleteSymbolicLink刪除符號鏈接
檢查是否有IRP未完成且IRP有效則調用IoCancelIrp嘗試取消這個IRP,如果取消IRP失敗則等待直到有下一次IRP然後取消。
調用IoDeleteDevice刪除設備。
由於該驅動在卸載常式中安全地刪除了過濾設備並嘗試取消未完成的IRP,所以該Rootkit可以被安全地卸載。不過一般的病毒作者很少會給用戶留下安全的卸載常式,所以懷疑該Rootkit是作者從網上抄來的代碼,作者有可能甚至不了解該驅動真正的工作原理。
「幻影後門」
這是一個具有感染功能、提供多種連接方式、可配置的後門病毒。
病毒作者在病毒體(客戶端控製程序)內留下了明確的簽名:
作者:dream2fly 作者網址: www.dream2fly.net 作者郵箱:[email protected]
作者的網址(論壇)中提供了多個自己編寫的軟體,包括本後門病毒。
作者的論壇中稱本病毒為UAM (Universal Access Manager),中文名稱「幻影遠程式控制制」,提供收費注冊使用。
病毒分為5個部分:服務端安裝程序(ctfime.exe)、服務端核心程序(SysIdt00.dll)、服務端啟動程序(被感染的explorer.exe)、客戶端控製程序(UAManager.exe)、隱藏埠的Rootkit (uamanger.sys)。
服務端安裝程序由C/C++語言編寫,UPX加殼保護。其它部分由C/C++或匯編語言編寫。
1、 服務端安裝程序
服務端安裝程序執行如下操作:
(1) 服務端安裝程序運行後從程序資源中釋放如下文件:
"%windir%\system32\SysIdt00.dll"、"%windir%\system32\DRIVERS\uamanger.sys"
(2) 然後將自己復制為"%windir%\system32\ctfime.exe"並啟動,同時刪除原文件。
(3) 將SysIdt00.dll、ctfime.exe、uamanger.sys的文件時間修改為同系統的cmd.exe相同,並將屬性設置為「系統+隱藏」。
(4) 修改系統的文件保護,然後感染系統的explorer.exe。
(5) 以隱藏窗口方式啟動被感染的explorer.exe。
2、 服務端啟動程序(被感染的explorer.exe)
服務端安裝程序在感染explorer.exe時,在其最後增加一個大小為0x1000的節寫入病毒代碼,並將入口點改為指向新的節的開始。被感染的病毒代碼執行時通過調用LoadLibraryA裝載SysIdt00.dll,然後返回原入口點。病毒感染explorer.exe的目的是為了在系統啟動時都能運行SysIdt00.dll,達到自啟動的目的。
3、服務端核心程序(SysIdt00.dll)
SysIdt00.dll中是遠端監控的核心代碼。
SysIdt00.dll通過被感染的explorer.exe被裝載後執行如下功能:
(1) 通過調用SeDebugPrivilege等函數提升許可權。
(2) 遍歷進程對找到的第一個」svchost」進程,將自己將注入其內存,然後通過CreateRemoteThread啟動其導出函數」Entry」。
SysIdt00.dll被注入svchost進程後執行如下功能:
(1) 通過嘗試打開名為"UAM_4803"的互斥量來檢查驅動是否載入,如載入則不做其它操作。
(2) 如果驅動沒有載入,根據設置(可在生成服務端時設置是否載入驅動)載入驅動"%windir%\system32\DRIVERS\uamanger.sys"。
(3) 啟動工作線程,實現遠程監控功能。
(4) 在實現連接時,通過寫文件"\\.\UAM"將連接的埠傳給驅動,實現隱藏埠。
(5) 根據設置的連接方式和密碼連接客戶端(控制端)
生成服務端時可以設置三種連接方式:
直接連接方式(設置監聽,由控制端來連接服務端)
反彈連接方式1 (設置ip地址和埠,服務端去連接控制端)
反彈連接方式2 (設置網頁地址,服務端從這個地址下載ip.txt,按照其內容去連接控制端)
(6) 遠程式控制制可以接受如下命令執行操作:
遠程shell (cmd.exe命令操作)
進程管理
文件管理
遠程桌面
視頻監控
日誌管理(查看、刪除系統日誌)
從任意網址下載、執行文件
遠程更新、卸載服務端
4、客戶端控製程序(UAManager.exe)
客戶端控製程序提供遠程連接控制功能,並且可以生成服務端程序。
在生成服務端程序時,可以進行如下設置:
連接方式和地址、連接密碼、是否載入驅動、服務端運行時間。
5、隱藏埠的Rootkit (uamanger.sys)
病毒名稱為Rootkit.Win32.PortHide.a,該驅動載入後首先創建一個名為\Device\hypy的設備和一個名為\??\hypy的符號鏈接用來和3環程序交互。這個設備名與3環程序所使用的符號鏈接(\\.\UAM)不同,所以顯然我們所截獲的樣本是無法正常工作的。
之後該驅動注冊IRP處理回調,在IRP_MJ_WRITE處理常式中,該驅動接受3環傳入的需要隱藏的埠號,並保存在一個全局變數中。不過該Rootkit作者顯然對驅動編寫很不熟悉,所有的IRP處理常式均沒有通過IofCompleteRequest完成,而是直接返回到I/O管理器。所以該驅動是無法正常地完成所希望實現的功能的。
該驅動通過替換KeServiceDescriptorTable中的函數地址來掛鉤ZwDeviceIoControlFile,該Rootkit通過掛鉤該API來隱藏指定埠。
「代理Rootkit變種XD」
此程序為rootkit類型程序
1.在驅動初始化時,對設備名和設備符號鏈接字元串進行解碼,並創建設備和相應的符號鏈接來與用戶態程序通信;
2.去除CR0寄存器中的WP位,以防止寫只讀頁出現頁異常,然後將內存中的加密字元串解碼並寫回,此解密字元串將用來與IOCTL傳遞的參數比較,從而判斷是否響應該用戶程序的IOCTRL;
3.獲取進程的EPROCESS地址,在此結構體中搜索"system"字元串偏移,然後根據此偏移計算進程名在EPROCESS中的偏移,以備比較進程時使用;
4.注冊IRP處理常式
支持:創建文件、設置注冊表鍵值、關閉線程和卸載驅動
5.創建系統線程,每隔指定的時間後,嘗試寫入驅動程序對應的注冊表項
6.注冊進程創建通知常式,每當創建新進程時,該驅動做如下操作:
1)獲取創建進程的EPROCESS,根據計算的偏移獲取當前進程名稱
2)判斷當前創建進程是否為userinit.exe或者是explorer.exe,
如果是則創建系統線程,寫入注冊表項
\registry\machine\software\microsoft\windows\currentversion\runonce
鍵值:
%systemroot%\system32\Rundll32.exe %systemroot%\system32\%s.dll,DllUnregisterServer
3)映射ntoskrnl.exe到內存中,獲取ntoskrnl.exe的服務表中指定服務函數的地址並保存,利用獲取的服務函數地址枚舉注冊表,試圖繞過其他軟體的攔截;
4)記錄 Winlogon.exe 的啟動,但沒有做其它操作,可能在以後的版本中會進行相關處理
「哈希信息竊取器」
這是一個C/C++編寫的黑客工具。
該工具主要用來獲取當前主機用戶的LM/NTLM散列,使用者可以通過該散列對主機用戶密碼進行暴力破解.
支持用法:pwmp2 <pid of lsass.exe>
主程序行為:
1.若沒有指定lsass.exe/pid參數,則執行如下操作:
[1].載入ntdll.dll,獲取導出函數
NtQuerySystemInformation
RtlCompareUnicodeString
[2].調用NtQuerySystemInformation,InformationClass=5,獲取進程信息列表
[3].遍歷列表查找LSASS.EXE,獲取該進程ID
2.打開自身進程,添加SeDebugPrivilege許可權,以允許當前進程對LSASS.EXE等進程進行內存操作和線程操作
3.打開查找到的進程LSASS.EXE,獲取該進程句柄
4.創建一事件,用於與通信線程同步
5.創建通信線程,執行如下操作:
[1]. 根據當前進程ID創建命名管道\\.\pipe\pwmp2-%ID%
[2]. 設置事件為有狀態,通知主線程管道創建成功
[3]. 連接到管道並從中讀取數據直到關閉
6.在創建的事件上等待,與之前創建的管道通信線程同步
7.向LSASS.EXE進程空間中寫入創建的管道名和輔助動態庫SamDump.dll導出函數名(DumpSam)作為參數,創建遠程線程.
在遠程線程中,根據傳遞的API地址,載入DLL,獲取DLL導出函數(DumpSam)並調用
8.等待遠程線程返回,釋放資源。
動態庫SamDump.dll導出函數DumpSam(char *)執行如下操作:
1.根據傳入參數打開通信管道
2.載入samsrv.dll,獲取如下函數地址
SamIConnect
SamrOpenDomain
SamrOpenUser
SamrQueryInformationUser
SamrEnumerateUsersInDomain
SamIFree_SAMPR_USER_INFO_BUFFER
SamIFree_SAMPR_ENUMERATION_BUFFER
SamrCloseHandle
3.依次調用如下函數
LsaOpenPolicy打開NT工作站
LsaQueryInformationPolicy獲取工作站域SID
SamIConnect連接到SAM資料庫
SamrOpenDomain根據域SID打開域
SamrEnumerateUsersInDomain枚舉域內用戶
SamrOpenUser打開域內指定用戶,獲取句柄
SamrQueryInformationUser枚舉域用戶信息
SamIFree_SAMPR_USER_INFO_BUFFER
SamrCloseHandle
『叄』 怎樣才能關閉電腦的過濾器驅動程序啊
以下為復製成分 WDM(Windows Driver Mode)是微軟公司為Windows的驅動程序設計的一種通用的驅動程序模型。相比以前的KDM和VXD來說,他的性能更高、系統之間移植更加方便。所以,隨著系統的升級,WDM已經成為Windows 2000系統下驅動程序開發的主流。作為WDM模型之中一類特殊的驅動程序,過濾器驅動程序(Filter driver)可以在不更改現有驅動程序的情況下,方便地修改、增加現有驅動程序的功能。特別是對於Windows 2000已經提供了通用驅動程序的硬體設備,通過編寫過濾器驅動程序,可以以較小的代價擴展硬體現有的功能。因此具有很強的實際應用價值。 1 Windows 2000 I/O請求處理結構如圖1所示,Windows 2000是分態的操作系統。用戶應用程序運行在用戶態,操作系統代碼(如系統服務和設備驅動程序)在核心態下運行。用戶態程序只能調用Win32子系統提供的API來同設備交互,當請求傳遞到I/O管理器時,他進行必要的參數匹配和操作安全性檢查,然後由這個請求構造出合適的IRP(IO Request Package,I/O請求包),並把此IRP傳遞到適當的驅動程序去,並給應用程序一個消息,通知這次I/O操作還沒完成。驅動程序一般通過硬體抽象層來和硬體交互,從而完成I/O請求工作。驅動程序完成I/O操作後,他將調用一個特殊的內核服務常式來完成IRP。這時,I/O管理器把數據和結果返回給Win32和用戶應用程序。2 WDM驅動程序模型體系結構Windows驅動程序模型重新定義驅動程序分層使用了如圖2的層次結構。圖中左邊是一個設備對象堆棧。設備對象是系統為幫助軟體管理硬體而創建的數據結構。一個物理硬體可以有多個這樣的數據結構。處於堆棧最底層的設備對象稱為物理設備對象PDO(Physical Device Object),代表了設備和匯流排之間的連接。在設備對象堆棧的中間的對象稱為功能設備對象FDO(Functional Device Object),代表了設備的功能。在FDO的上面和下面還會有一些過濾器設備對象FIDO(Filter Device Object)。位於FDO上面的過濾器設備對象稱為上層過濾器,位於FDO下面(但仍在PDO之上)的過濾器設備對象稱為下層過濾器。匯流排驅動程序負責枚舉他的匯流排,這意味著發現匯流排上的全部設備和檢測設備何時被添加或刪除並為每個設備創建一個PDO。功能驅動程序知道如何控制設備的主要功能,他分層在匯流排驅動程序的上面。功能驅動程序創建一個功能設備對象,放在設備棧中。對匯流排上的所有設備,匯流排過濾驅動程序被加在匯流排驅動程序之上;設備過濾驅動程序僅對特定的設備添加。上層的過濾驅動程序在功能驅動程序之上,而下層過濾驅動程序在功能驅動程序之下。這種層次結構可以使I/O請求過程更加明了。I/O管理器發送的IRP,先被送到設備堆棧的上層過濾器驅動程序(FIDO),他可以根據要求決定IRP的處理方式,是沿著設備棧繼續向下傳,或者是做一些額外的處理。依次,每一層驅動程序都可以決定如何處理IRP。高層的驅動程序可以把請求劃分成更簡單的請求並傳遞給下層驅動程序。中間層次的驅動程序進一步處理請求,將一個IRP中的請求劃分為若干個小的請求並傳給下層驅動程序。最後,最低層的驅動程序與硬體打交道。因此一些IRP在到達匯流排程序之前,在設備棧傳遞過程中可能就被過濾掉了。 3 過濾器驅動程序過濾驅動程序是一種中間驅動程序,他位於其他的驅動程序層次之間。過濾驅動程序可以監視、攔截和修改IRP流,在不影響其他驅動程序的前提下提供一些附加的功能。他的功能可分為:(1)利用過濾器驅動程序修改現有功能驅動程序的行為而不必重新編寫功能驅動程序。(2)上層過濾器驅動程序在功能驅動程序之前看到IRP,可以很方便地為用戶提供額外的特徵。還可以修正功能驅動程序或硬體存在的毛病或缺陷。(3)下層過濾器驅動程序在功能驅動程序要向匯流排驅動程序發送IRP時看到IRP。可以監視、攔截、修改功能驅動程序要執行的匯流排操作流,截獲數據,進行必要的數據處理,再將處理過的數據傳遞下去,實現一定的數據處理功能。 (4)下層過濾器驅動程序可以實現驅動程序的匯流排無關性,使功能驅動程序完全獨立於匯流排結構而不直接與設備對話。針對不同的匯流排編寫不同的下層過濾器,每個下層過濾器對應一個匯流排類型。當功能驅動程序需要與硬體對話時,他只需向相應的下層過濾器驅動程序發送IRP即可。4 過濾器驅動程序設計過濾器驅動程序設計與功能驅動程序相似。這里限於篇幅主要討論一下過濾器驅動程序設計中與功能驅動程序相區別的幾個關鍵的技術要點。4.1 DriverEntry常式DriverEntry常式是驅動程序的人口點。當I/O管理器裝入驅動程序時,他調用DriverEntry常式用來初始化驅動程序范圍的數據結構和資源,包括輸出該驅動程序的其他人口點,初始化該驅動程序使用的特定對象,並設置驅動程序系統資源。與功能驅動程序相區別的是:他必須為每種類型的IRP都安裝派遣函數,而不僅僅只是其希望處理的IRP。4.2 AddDevice常式AddDevice函數的基本職責是創建一個設備對象並把他連接到以物理設備對象PDO為底的設備堆棧中,並負責設備對象初始化。與功能驅動程序相區別的是:過濾驅動程序創建的設備對象可能是2種,一種是不命名的過濾設備對象,過濾器工作時把這個無名的設備對象連接到以物理設備對象PDO為底的設備堆棧中。一種是為了和用戶程序通信而創建的命名的設備對象並不連接到以物理設備對象PDO為底的設備堆棧中。命名可以採用2種方法:第一種方法是採用可顯示的"硬編碼"符號鏈接名,用戶態程序必須把設備名硬編碼到源代碼中;另外一種方法是使用設備介面,每個設備介面是由一個全局惟一標志符GUID標志。設備注冊為一個特定的設備介面就創建了一個符號鏈接。相關步驟如下:(1)調用IoCreateDevke創建過濾設備對象,並建立一個私有的設備擴展對象。(2)寄存一個或多個設備介面,以便應用程序能知道設備的存在。另外,還可以給出設備名並創建符號連接。(3)初始化設備擴展和設備對象的F1ag成員。(4)調用IOAttachDevkeToDeviceStack函數把新設備對象放到堆棧上。具體實現程序如下:NTSTATUS AddDevice (PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT pdo){PDEVICE_OBJECT fido=NULL;//創建沒有設備名的過濾設備對象NTSTATUS status=IoCreateDevice (DriverObjeot,sizeof (DEVICE-EXTENSION),NULL,FILE_DEVICE_UNKNOWN,0,FALSE,&fido);if(!NT_SUCCESS(status)) return status;//初始化設備擴展和設備對象的Flag成員PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fido->DeviceExtension;pdx->DeviceObject=fido;pdx->Pdo=pdo;pdx->eDeviceType =FILTER-p.htm" target="_blank" title="FILTER貨源和PDF資料">FILTER;//把沒有設備名的設備對象放到堆棧上PDEVICE- OBJECT fdo =IoAttachDeviceToDeviceStack (fido,pdo);pdx->TopDevObj=fdo;fido->Flags ︱=pdo->F1ags&(DO_DIRECT-IO ︱DO-BUFFERED-IO ︱ DO_POWER_PAGABLE ︱DO_POWER_INRUSH);………//建立一個命名的設備對象創建符號鏈接CreateSymbOlicLink (DriverObject,pdo);return STATUS_SUCCESS;}4.3 派遣常式派遣常式處理來自應用程序的打開、關閉、讀、寫等I/O請求命令。與功能驅動程序的區別是:過濾器驅動程序不能影響其他驅動程序接受IRP。對於未知的IRP或不處理的IRP過濾驅動程序的原則是必須沿設備棧傳遞下去。因此他必須為每種類型的IRP都安裝派遣函數,而不僅僅只是其希望處理的IRP。對於希望處理的IRP必須指定特殊的派遣函數,直接用CompleteIRP來完成接收到的這類IRP,不往下層傳送。這里由DispatchDeviceControl處理來自應用程序的所有希望處理的I/O操作命令。通常採用給予所有自定義的I/O請求代碼的SWITCH-p.htm" target="_blank" title="SWITCH貨源和PDF資料">SWITCH語句,而對於每個命令使用相應的處理函數。下面列出了主要的代碼框架:NTSTATUS DispatchDeviceControl (PDEVICE_OBJECT fido,PIRP Irp){NTSTATUS status;PDEVICE_EXTENSION pdx=(PDEVICE_EXTENSION)fido->DeviceExtension;PlO_STACK_LOCATION IrpStack =IoGetCurrentlrpStackLocation(1rp);//取I/O控制命令代碼ULONG IoControlCode = IrpStack >Parameters.DeviceloContr01.IoControlCode;switch(IoControlCode){case IOCTL-XXX:…… //處理I/O控制命令代碼case IOCTL-XXX:……default:……break;}//完成接收到的IRPIoCompleteRequest(Irp,IO_NO_INCREMENT);……return status;}對於不需要處理的IRP則交由DispatchAny常式處理,將IRP沿著設備棧直接傳遞下去:NTSTATUS DispatchAny(PDEVICE_OBJECT fido,PIRP Irp){PDEVICE_ EXTENSION pdx=(PDEVICE-EXTENSION)fido->DeviceExtension//使堆棧指針少前進一步。IoSkipCurrentlrpStackLocation(hp);Status=IoCallDriver(pdx->LowerDeviceObject,Irp);……return status;4.4 Unload常式功能在Unload常式中,驅動程序必須釋放所有創建的對象和所有分配給驅動程序的資源。5 結 語筆者就採用在Windows提供的USB音效卡驅動程序下方插入自己編寫的下層過濾器驅動程序實現了對USB音效卡輸出的數據流的截獲並進行語音信號處理,取得了不錯的效果,現已投入實際應用。可見過濾器驅動程序作為一類特殊的驅動程序,它可以以較小的代價實現對驅動數據流的截獲,修改、增加現有驅動常需的功能,具有很強的實用性。
類別:驅動 | 添加到搜藏 | 瀏覽(254) | 評論 (0) 上一篇:VMware虛擬機中如何安裝VMWare-T... 下一篇:今天離婚,你得抱我出門 相關文章: �6�1Windows文件系統的過濾器驅動程... 最近讀者: 登錄後,您就出現在這里。 蝶舞360°jacky85chan 網友評論:
『肆』 windown文件過濾驅動開發中 有沒有一種IRP_MJ_XXX是修改只讀或者隱藏屬性產生的IRP
是不是一個IOCTL,不清楚
『伍』 在線等!filemon中怎麼才能禁止打開刪除等IRP
我勸你還是到驅動開發網上去問吧
這里估計都是沒有人能解決這個問題
http://bbs.driverdevelop.com/
『陸』 windows10文件驅動過濾
1、獲得文件全路徑以及判斷時機
除在所有 IRP_MJ_XXX 之前自己從頭創建 IRP 發送到下層設備查詢全路徑外,不要嘗試在 IRP_MJ_CREATE 以外的地方獲得全路徑,因為只有在 IRP_MJ_CREATE
中才會使用 ObCreateObject() 來建立一個有效的 FILE_OBJECT。而在 IRP_READ IRP_WRITE 中它們是直接操作 FCB (File Control Block)的。
2、從頭建立 IRP 發送關注點
無論你建立什麼樣的 IRP,是 IRP_MJ_CREATE 也好還是 IRP_MJ_DIRECTORY_CONTROL也罷,最要提醒的就是一些標志。不同的標志會代來不同的結果,有些結果是直接返回失敗。這里指的標志不光是 IRP->Flags,還要考慮 IO_STACK_LOCATION->Flags還有其它等等。尤其是你要達到一些特殊目的,這時候更需要注意,如 IRP_MN_QUERY_DIRECTORY,不同的標志結果有很大的不同。
3、從頭建立 IRP 獲取全路徑注意點
自己從頭建立一個 IRP_MJ_QUERY_INFORMATION 的 IRP 獲取全路徑時需要注意,不僅在 IRP_MJ_CREATE 要做區別處理,在 IRP_MJ_CLOSE 也要做同樣的處理,否則如果目標是 NTFS 文件系統的話可能產生 deadlock。如果是 NTFS 那麼在 IRP_MJ_CLEANUP 的時候也需要對 FO_STREAM_FILE 類型的文件做同樣處理。
4、獲得本地/遠程訪問用戶名(域名/SID)
方法只有在 IRP_MJ_CREATE 中才可用,那是因為 IO_SECURITY_CONTEXT 只有在 IO_STACK_LOCATION->Parameters.Create.SecurityContext 才會有效。這樣你才有可能從 IO_SECURITY_CONTEXT->SecurityContext->AccessState->SubjectSecurityContext.XXXToken 中獲得訪問 TOKEN,從而進一步得到用戶名或 SID。記得 IFS 中有一個庫,它的 LIB 導出一個函數可以讓你在獲得以上信息後得到用戶名與域名。但如果你想兼容 NT4 的話,只能自己分析來得出本地和遠程的 SID。
5、文件與目錄的判斷
正確的方法在楚狂人的文檔里已經說過了,再補充一句。如果你的文件過濾驅動要兼容所有文件系統,那麼不要十分相信從 FileObject->FsContext 里取得的數據。正確的方法還是在你傳遞下去 IRP_MJ_CREATE 後從最下層文件系統延設備棧返回到你這里後再獲得。
6、加/解密中判斷點
只判斷 IRP_PAGING_IO,IRP_SYNCHRONOUS_PAGING_IO,IRP_NOCACHE 是沒錯的。如果有問題,相信是自己的問題。關於有人提到在 FILE_OBJECT->Flags中的 FO_NO_INTERMEDIATE_BUFFERING 是否需要判斷,對此問題的回答是只要你判斷了 IRP_NOCACHE 就不用再判斷 FILE_OBJECT 中的,因為它最終會設置 IRP->Flags 為 IRP_NOCACHE。關於你看到的諸如 IRP_DEFER_IO_COMPLETION 等 IRP 不要去管它,因為它只是一個過程。最終讀寫還是如上所介紹。至於以上這些 IRP 哪個是由 CC MGR 發送的,哪些是由 I/O MGR 發送和在什麼時候發送的,這個已經有很多討論了,相信可以找到。
7、舉例說明關於 IRP 傳遞與完成注意事項
只看 Walter Oney 的那本 《Programming the Microsoft Windows driver model》里介紹的流程,自己沒有實際的體會還是不夠的,那裡只介紹了基礎概念,讓自己有了知識。知道如何用,在什麼情況下用,用哪種方法,能夠用的穩定這叫有了技術。我們從另一個角度出發,把問題分為兩段來看,這樣利於總結。一個 IRP 在過濾驅動中,把它分為需要安裝 CompleteRoutine 的與無需安裝 CompleteRoutine 的。那麼在不需要安裝 CompleteRoutine 的有以下幾類情況。
(1) 拿到這個 IRP 後什麼都不做,直接調用 IoCompleteRequest() 來返回。
(2) 拿到這個 IRP 後什麼都不做,直接傳遞到底層設備,使用IoSkipCurrentIrpStackLocation() 後調用 IoCallDriver() 傳遞。
(3) 使用 IoBuildSynchronousFsdRequest() 或 IoBuildDeviceIoControlRequest()來建立 IRP 的。
以上幾種根據需要直接使用即可,除了一些參數與標志需要注意外,沒有什麼系統機制相關的東西需要注意了。那麼再來看需要安裝 CompleteRoutine 的情況。我們把這種情況再細分為兩種,一是在 CompleteRoutine 中返回標志為STATUS_MORE_PROCESSING_REQUIRED 的情況。二是返回處這個外的標志,需要使用函數IoMarkIrpPending() 的情況。在 CompleteRoutine 中絕大多數就這么兩種情況,你需要使用其中的一種情況。那麼為什麼需要安裝 CompleteRoutine 呢?那是因為我們對其 IRP 從上層驅動,經過我們驅動,在經過底層設備棧返回到我們這一層驅動時需要得到其中內容作為參考依據的,還有對其中內容需要進行修改的。再有一種情況是沒有經過上層驅動,而 IRP 的產生是在我們驅動直接下發到底層驅動,而經過設備棧後返回到我們這一層,且我們不在希望它繼續向上返回的,因為這個 IRP 本身就不是從上層來的。綜上所述,先來看下 IoMarkIrpPending() 的情況。
(1) 在 CompleteRoutine 中判斷 Irp->PendingReturned 並使用 IoMarkIrpPending()然後返回。這種方法在沒有使用 KeSetEvent() 的情況下,且不是自建 IRP 發送到底層驅動返回時使用。也就是說有可能我所做的工作都是在 CompleteRoutine 中進行的。比如加/解密時,我在這里對下層驅動返回數據的判斷並修改。修改後因為沒有使用 STATUS_MORE_PROCESSING_REQUIRED 標志,它會延設備堆一直向上返回並到用戶得到數據為止。這里一定要注意,在這種情況下 CompleteRoutine返回後,不要在碰這個 IRP。也就是說如果這個時候你使用了 IoCompleteRequest()的話會出現一個 MULTIPLE_IRP_COMPLIETE_REQUEST 的 BSOD 錯誤。
(2) 在 CompleteRoutine 中直接返回 STATUS_MORE_PROCESSING_REQUIRED 標志。這種情況在使用了 KeSetEvent() 的函數下出現。這里又有兩個小小的分之。
1) 出現於上層發送到我這里,當我這里使用 IoCallDriver() 後,底層返回數據經過我這一層時,我想讓它暫時停止繼續向上傳遞,讓這個 IRP 稍微歇息一會,等我對這個 IRP 返回的數據操作完成後(一般是沒有在 CompleteRoutine中對返回數據進行操作情況下,也就是說等到完成常式返回後再進行操作),由我來調用 IoCompleteRequest() 讓它延著設備棧繼續返回。這里要注意,我們是想讓它返回的,所以調用了 IoCompleteRequest()。這個可不同於下面所講的自己從頭分配 IRP 時在 CompleteRoutine 中已經調用 IoFreeIrp() 釋放了當前IRP 的情況。比如我在做一個改變文件大小,向文件頭寫入加密標志的驅動時,在上層發來了 IRP_MJ_QUERY_INFORMATION 查詢文件,我想在這個時候獲得文件信息進行判斷,然後根據我的判斷結果再移動文件指針。注意:上面是兩步,第一步是先獲得文件大小,那麼在這個時候我就需要用到上述辦法,先讓這個 IRP傳遞下去,得到我想要的東西後在進行對比。等待適當時機完成這個 IRP,讓數據繼續傳遞,直到用戶收到為止。第二步我會結合下面小節來講。
2) 出現於自己從頭建立 IRP,當使用 IoAllocate() 或 IoBuildAsynchronousFsdRequest()創建 IRP 調用 IoCallDriver() 後,底層返回數據到我這一層時,我不想讓這個 IRP 繼續向上延設備棧傳遞。因為這個 IRP 就是在我這層次建立的,上層本就不知道有這么一個 IRP。那麼到這里我就要在 CompleteRoutine 中使用 IoFreeIrp()來釋放掉這個 IRP,並不讓它繼續傳遞。這里一定要注意,在 CompleteRoutine函數返回後,這個 IRP 已經釋放了,如果這個時候在有任何關於這個 IRP 的操作那麼後果是災難性的,必定導致 BSOD 錯誤。前面 1) 小節給出的例子只完成了第一步這里繼續講第二步,第一步我重用這個 IRP 得到了文件大小,那麼這個時候雖然知道大小,但我還是無法知道這個文件是否被我加過密。這時,我就需要在這里自己從頭建立一個 IRP_MJ_READ 的 IRP 來讀取文件來判斷是否我加密過了的文件,如果是,則要減少相應的大小,然後繼續返回。注意:這里的返回是指讓第一步的IRP 返回。而不是我們自己創建的。我們創建的都已經在CompleteRoutine 中銷毀了。
8、關於完成 IRP 的動作簡介
當一個底層驅動調用了 IoCompleteRequest() 函數時,基本上所有設備棧相關 IRP 處理工作都是在它那裡完成的。包括 IRP->Flags 的一些標志的判斷,對 APC 的處理,拋出MULTIPLE_IRP_COMPLETE_REQUESTS 錯誤等。當它延設備棧一直調用驅動所安裝的 CompleteRoutine時,如果發現 STATUS_MORE_PROCESSING_REQUIRED 這個標志,則會停止向上繼續回滾。這也是為什麼在 CompleteRoutine 中使用這個標志即可暫停 IRP 的原因。
9、關於 ObQueryNameString 的使用
這個函數的使用,在有些環境下會有問題。它的上層函數是 ZwQueryObject()。在某些情況下會導致系統掛起,或者直接 BSOD。它是從 對象管理器中的 ObpRootDirectoryObject開始遍歷,通過 OBJECT_HEADER_TO_NAME_INFO 獲得對象名稱。今天問了下 PolyMeta好象是在處理 PIPE 時會掛啟,這個問題出現在 2000 系統。在 XP 上好象補丁了。
10、關於重入問題
其實這個問題在很久前的 IFS FAQ 里已經介紹的很清楚,包括處理方法以及每種方法可能帶來的問題。IFS FAQ 里的 Q34 一共介紹了四種方法,包括自己從頭建立 IRP發送,使用 ShadowDevice,使用特徵字元串,根據線程 ID,在 XP 下使用() 函數。並且把以上幾種在不同環境下使用要處理的問題也做了簡單的介紹。且在 Q33 里介紹了在 CIFS 碰到的 FILE_COMPLETE_IF_OPLOCKED 問題的解決方法。
『柒』 過濾驅動中打開文件時如何避免重入
在處理IRP_MJ_CREATE請求時,過濾驅動可能會使用不同的屬性/許可權等打開這個文件。這種情況經常發生在第二次調用ZwCreatefile時。這會導致生成一個對FSD 過濾驅動的回調(就是重入了).因而,正常的過濾驅動就要有能力檢測這種重入的問題。
There are several ways of dealing with reentrancy ring an IRP_MJ_CREATE operation, and the appropriate solution for your particular driver will depend upon the circumstances. In addition, there are a number of techniques that might work for a single file system filter driver, but that fail when used in a multi-filter environment.
在處理IRP_MJ_CREATE操作過程中,有幾種方法可以處理重入,處理你的驅動(中的重入)的適當方法取決於你的環境。另外,有許多種技術可以在單個文件系統過濾驅動上工作,但在多層過濾的環境下可能會失效。
For Windows XP and newer versions of Windows, the best mechanism for opening a file within the filter is to use . A filter driver can call this function and specify a given device object. The IRP_MJ_CREATE that is built will be passed to the specified device object. This technique avo
ids reentrancy issues and is the best mechanism available for a filter to open a file.
對Windows xp或者更新版的Windows來說,在過濾驅動中打開一個文件的最好方法是使用.文件過濾驅動可以調用這個函數並且指定一個給定的設備對象。
For versions of Windows prior to Windows XP, this mechanism is not available. The best mechanism in this environment is to implement your own functional equivalent of . This can be done by creating a second device object for each device you are filtering.
對Windows xp以前的Windows操作系統,這種方法無效。在這種環境下最好的方法是實現你自己的與等價的功能。這可以通過給你要過濾的設備創建第二個設備對象來實現。
For example, suppose you decide to filter some given file system device object, FSDVolumeDeviceObject. You then create a device object MyFilterDeviceObject and attach it using IoAttachDeviceToDeviceStack (of course, in Windows XP you would use instead). In addition, you create a second device object MyFilterShadowDeviceObject. This device object must be assigned a name ("DeviceMyFilterDevice27", for example). The name can be anything, but it must obviously be unique. In your device extension for your two device objects, you need to track this name, and you need to maintain pointers to the respective device objects (that is, the device extension for MyFilterShadowDeviceObject should point to MyFilterDeviceObject and the device object extension for MyFilterDeviceObject should point to yFilterShadowDeviceObject). Don't forget to set the StackSize field of the device object correctly!)
例如,假設你要過濾某個特定的文件系統設備對象,FSDVolumeDeviceObject(文件系統卷設備對象).這時你要創建一個設備對象MyFilterDeviceObject 並且使用IoAttachDeviceToDeviceStack 函數(在windows xp下使用 )來掛接它。另外,你還要創建第二個設備對象yFilterShadowDeviceObject.這個設備對象必須被指定一個名字(例如"DeviceMyFilterDevice27",注: 這里指的第二個設備對象,即Shadow device object )。名字可以是任意的,但必須唯一的。在這兩個設備的設備擴展結構中,你需要跟蹤這個名字
(注,其實就是做標志,你要知道你當前是處在哪個設備中,是第一個設備對象還是Shadow object )你需要維護一些指向相應的設備對象的指針(也就是說,MyFilterShadowDeviceObject的設備擴展要指向MyFilterDeviceObject,MyFilterDeviceObject的設備擴展對象要指向MyFilterShadowDeviceObject.不要忘了正確設置設備對象的StackSize成員變數。
Now, an IRP_MJ_CREATE request arrives in your filter, specifying MyFilterDeviceObject. To open the file without experiencing reentrancy problems, you call IoCreateFile (or ZwCreateFile). Since you must pass the name of the file being opened, you construct that by using both the name you gave MyFilterShadowDeviceObject and the name that is in the FileObject of the I/O stack Location (IoGetCurrentIr
pStackLocation(Irp)->FileObject).
現在,當IRP_MJ_CREATE 請求到達你的過濾驅動時,指定了 MyFilterDeviceObject.你調用IoCreateFile(或ZwCreateFile) 打開文件就沒有重入的問題了.以後,你必須傳遞這個打開的文件的名字,這個名字是用你設置在MyFilterShadowDeviceObject中的名字和從I/O 堆棧區域中得到的文件對象中的名字一起構造的。
Since you are passing a name in that points to your second device object, the I/O Manager will build the IRP_MJ_CREATE and pass the resulting I/O request packet to your driver, but specifying MyFilterShadowDeviceObject.
當你傳遞一個指向你的第二個設備對象的名字,I/O管理器會構建IRP_MJ_CREATE 並且傳遞I/O請求的結果到你的驅動,但指定了MyFilterShadowDeviceObject.
In your IRP_MJ_CREATE dispatch handler you must detect that this is a "shadow" device object, rather than a typical filter device object. In this case, you should send the IRP_MJ_CREATE operation down to the device being filtered by MyFilterDeviceObject. Indeed, since you should not need to do any further processing, you can use IoSkipCurrentIrpStackLocation (rather than ).
在你的IRP_MJ_CREATE 分發常式處理函數中,你必須檢測它是一個"Sahdow"設備對象而不是是一個典型的過濾設備對象。在這種情況下,你必須將IRP_MJ_CREATE操作下傳到已經被 MyFilterDeviceObject過濾了的設備中。確實,此後你不需要作進一步的處理,你可以用IoSkipCurrentIrpStackLocation函數(不是).
『捌』 文件過濾驅動開發中,在IRP_MJ_WRITE 中獲取將要寫入文件的內容,請問這些內容是以什麼方式展示的呢如何
讀IRP的緩沖區啊。。。
『玖』 遇到流氓軟體怎麼辦
流氓軟體的技術五花八門,任何一項功能都有可能成為流氓技術,就象武器,用好了可以伸張正義,用歪了卻成為罪惡的幫凶。
首先我從win32下的一些流氓著數分析開始:
1。我想做為一個流氓軟體,首先要做到的是實時運行,譬如在注冊表的run下,在boot下增加它的啟動。這應該是比較老的方法,以前 3721好象就是在run下,但是現在一般的人都知道了。
2。作為流氓軟體,已經改變了以前一些木馬的特性了,他沒必要使自己一定要實時啟動了,而是需要自己的時候再啟動,譬如說打開一個瀏覽器窗口,這是一般流氓軟體的方法,因為他需要連上網才能有利益可圖,所以瀏覽器肯定是流氓軟體必定監控的進程。
3。使用BHO插件,這種技術早先特別流行,這是微軟提供的介面,本意是讓IE瀏覽器可以擴充功能。每當一個ie瀏覽器啟動的時候,都會調用BHO下必要的插件,流氓軟體就是利用這一點。監控了瀏覽器所有事件與信息。
4。還有最笨的辦法就是利用進程快照監控進程,判斷有它自己所監控的進程啟動,就使用atl得到瀏覽器指針,從而監控瀏覽器所有事件與信息。
5,還有一種方法就是使用spi,這是我在網上看到的。spi是分層協議,當winsock2啟動的時候都會調用它的dll,可以監控所有應用層數據包。從而監控用戶信息,而且能實時啟動。
6。hook方法,hook技術可以所應用太廣泛了,特別是監控方面。所以流氓軟體也不會錯過。首先應用的是api函數hook,譬如windows核心編程里的apihook類,或者微軟的detous都可以完成,兩者方法其實相同就是修改IDT函數入口地址。api hook鉤住createprocess 就可以監控進程,比進程快照性能更強,可以鉤住spi下的函數可以完成spi下的所有功能。還有消息hook,滑鼠消息,鍵盤消息,日子消息等等鉤子,方法實在太多,都可以利用。
上面列舉了一些流氓軟體的使用方法,但是流氓軟體的一個特性是他無法卸載。所以它又要使用下面的方法了
因為上面的很多方法都可以刪除注冊表卸載他們,那怎麼辦呢,那就會時時監控,它會在它的進程,或者線程里監控注冊表項,設置一個循環監控,發現沒了就繼續安裝,增加。我想這應該是很多流氓軟體的技術。
那現在又出現了一個新問題,那就是流氓軟體的進程線程要是結束掉怎麼辦呢???看西面
7。一種方法就是上面的api hook技術,鉤住openprocess ,用自己的函數判斷只要打開的是自己進程就返回正確,使用這種方法,用戶或者一般的軟體就無法結束它的進程了。
8。還有一種是上面象bho,spi根本沒有進程。一般的用戶也無法刪除他
9。還有一種方法是遠程線程,這個技術用的也很普遍,首先是象api hook一樣向目標進程里申請一段內存空間,然後使用自己映射過去,然後使用CreateRemoteThread創建遠程線程。一般很多流氓軟體或者以前的一些木馬程序,都是把線程注入到系統進程譬如explorer,service等等,使用用戶或者一般的殺毒軟體很難處理或者結束。。
10。注冊成服務後,也可以簡單的隱藏進程。還有更可笑的是把自己的進程名跟一些系統進程名譬如lsass相同後,也就無法結束了。
從我上面列舉的方法已經差不多可以形成好幾款流氓軟體了。但是你別高興太早,因為這些技術只是應用層的,現在出現了一堆驅動層的反流氓軟體工具,譬如超級兔子,完美卸載,木馬剋星,雅虎助手,還有現在火熱的360安全衛士。
這些反流氓軟體的方法刪除以上流氓軟體軟體就比較簡單。優先於流氓軟體啟動,截獲所有訪問流氓軟體文件的irp,然後刪除注冊表項,刪除文件。輕松的完成了反流氓任務。
為了針對這些反流氓軟體,流氓軟體出現了內核層的了。
1。首先是使用文件過濾驅動,保護自己的文件,流氓軟體過濾了create里對於自己文件的所有fileopen外的所有irp和SetInformation下所有的irp,從而有效的保護了自己的文件。
2。內核級hook技術,可hook住所有公開的或者未公開的內核函數,譬如zwcreatefile,zwSetInformation,也可以有效的保護文件。
3。驅動層下的流氓軟體還使用內核級hook技術,替換Regdeletekey,RegDeleteValueKey,RegSetValueKey從而有效的保護了注冊表
4。利用內核級hook技術還有隱藏進程,或者監控進程,重起進程。
對於上面的流氓軟體的方法一些驅動層下的反流氓軟體工具又有點束手無策了。因為同是驅動程序相互攔截irp等於大家都無法操作,反流氓軟體工具的刪除irp會被攔截,或者刪除函數會被替換。刪除注冊表函數會被替換。雖然驅動的載入有先後,但是無法保證能完全的刪除流氓軟體,從而出現了一些更頂級的反流氓軟體,他直接發刪除文件irp到文件系統.,刪除注冊表也直接發送到文件系統。這類流氓軟體又能有效的完成了反流氓任務,但是根據我了解,這樣的軟體不多。現在火熱的360安全衛士都還只是使用了笨辦法,優先於驅動流氓軟體啟動,創建一個驅動流氓軟體同設備名的設備,,使流氓驅動創建不成功。具我了解他優先於流氓驅動啟動是把自己創建於PNP_TDI這個組下面,就是簡單的ndis就能優先於360啟動。如果前面的組,那360就束手無策了。所以對付這類流氓驅動只能用直接發irp到文件系統。
流氓軟體又怎麼來防止直接發irp到文件系統的反流氓軟體呢?rootkit,我看很多對於rootkit有誤解,很多都認為hook也是rootkit.呵呵,rootkit說白了就是嵌入操作系統文件。你不是發irp到文件系統嗎?,可是我把文件系統給改了,不過rootkit根據我的觀察unix或者linex下比較多,在windows下還是比較少的,因為需要使用匯編了,哎太晚了,不寫了,我想如果流氓軟體做到這個技術程度,它也沒必要做流氓了,直接做操作系統得了。