自從改行玩硬件後,就不多關注病毒和反病毒之間的鬥爭了。某天在中關村論壇聽到一
名網友說 360在WIN64 上有了進程自我保護,萬分牛逼,連微軟的Process Explorer都不
能結束呢!我聽後內心十分好奇,因而重操舊業,下載了最新版本的360 安全衛士7.7版本
(2011-5-6),安裝在64位 Windows 7虛擬機上來測試。
首先拿「任務管理器」來測試,果真再次出現了熟悉的「拒絕訪問」提示: 安全
而後嘗試用用重載NTDLL + ZwGetNextProcess得到句柄,發現NTSTATUS的返回值老是
失敗。後來發現OpenProcess能夠在低權限下(好比以查詢進程信息的權限
PROCESS_QUERY_INFORMATION)打開360 的進程,可是想用DuplicateHandle或者
NtDuplicateObject來得到同一進程的最高權限句柄時就失敗了。而後又對線程如法炮製,
依然失敗。最後用無句柄殺線程的絕招,連KiInsertQueueApc鉤子都抵擋不住的 10 萬次
PostThreadMessage,仍是失敗。初步測試,發現來者不善,決定先用IDA Pro 5.5分析一
下 360的驅動,再想辦法。
首先用 Win64AST(Win64下的系統工具,有查看內核模塊,管理進程等功能, 網絡
查看 360加載的驅動: 函數
能夠發現,360 在Win64 系統上只加載了兩個驅動:360FsFlt.sys和一個網絡相關的驅
動。其中,360FsFlt.sys從名字上來看是文件系統過濾驅動。經分析,在它的裏面有進程
自我保護相關的內容。
在作理智的分析以前,咱們能夠先進行猜想,猜想一下360會用什麼手段來實現進程自
我保護。第一種方法是Ring 3 的 Inline Hook,雖然安全穩定,可是容易繞過。上次我雖
然有篇文章講解如何反繞過Ring 3 Inline Hook,可是畢竟判斷方法還有必定的瑕疵。所
以我判定,360不會這麼作。第二種方法就是廢掉Win64的PatchGuard機制,對內核函數
進行 Inline Hook,雖然這種方法最好,可是我確定360也不會這麼作。由於360 是一個商
業軟件,這種方法穩定性差不說,並且還會給競爭對手以「破壞系統安全機制」的口實。所
以惟一的多是第三種方法,既微軟官方推薦的方法:用ObRegisterCallbacks註冊一個回
調,監控系統中全部的進線程句柄的動態,一旦發現對本身有害的句柄,立刻就把句柄關閉
並返回一個錯誤值。在用IDA 的分析中,果真證明了個人猜想。
首先把360FsFlt.sys拖入 IDA進行反彙編,而後把點擊「Imports」,找到
ObRegisterCallbacks,而後雙擊ObRegisterCallbacks,進入和IDA VIEW-A界面,而後雙
擊 SUB_1D938,就進入和反彙編代碼的界面。什麼?您想按F5查看 C代碼?呵呵。真的不
好意思,64位的 IDA 不帶把彙編代碼變成C代碼的插件,只能委屈各位看觀看晦澀的64位彙編 工具
代碼了。順便說一句,我以爲IDA對 64位 BIN文件作的反彙編不怎麼正確,可是沒什
麼確實的證據,因此仍是不要亂說爲好。
你們能夠看到,在調用ObRegisterCallbacks以前,還往 rax 寄存器裏放了兩個你們十
分熟悉的對象類型:PsProcessType和 PsThreadType,所以能夠很確定地說,360 就是用
ObRegisterCallbacks註冊了一個回調,用來監視進程類型句柄和線程類型句柄的動態!截
圖以下: 測試
完整的反彙編以下:
;int __fastcall sub_1D938(PDRIVER_OBJECT DriverObject, __int64)
sub_1D938 proc near
arg_0= qword ptr 8
mov [rsp+arg_0], rbx
push rdi
sub rsp, 20h
mov rax, cs:PsProcessType
mov rbx, rcx
lea rdx, qword_ABA20
mov cs:qword_34300, rax
mov rax, cs:PsThreadType
lea rcx, unk_342D8
mov cs:qword_34320, rax
lea rax, qword_34300
mov cs:qword_342F8, rax
call cs:ObRegisterCallbacks
mov rdx, cs:qword_ABA20
xor edi, edi
cmp eax, edi
movzx eax, cs:byte_59E12
cmovl rdx, rdi
test byte ptr cs:dword_59ED8, 4
lea ecx, [rdi+1]
cmovnz eax, ecx
mov cs:qword_ABA20, rdx
mov cs:byte_59E12, al
mov eax, cs:dword_59ED8 ui
test al, 8 jz short loc_1D9D6 xor edx, edx ; __int64 mov rcx, rbx ; DriverObject call sub_1E710 cmp eax, edi mov eax, cs:dword_59ED8 setnl cs:byte_59E13 loc_1D9D6: test al, 10h jz short loc_1D9EF mov rcx, rbx ; DriverObject call sub_2350C cmp eax, edi
setnl al 我還找了找360實現進線程自保護的過程,可是能力有限,只找到一部分實現[進程自 我以爲此函數的邏輯是這樣:傳入進程對象指針PEPROCESS (注意:我強烈以爲不是IDA |