簡單研究了一下3721的機制,寫在這里,作為心得筆記吧。大部分收獲都來自
Softice + 反匯編,不一定適用于某些版本。
1. CnsMin.dll的駐留方式
3721的核心文件:CnsMin.dll
通常存在于<Windows Directory>\Downloaded Program Files下。
通過注冊表Run鍵值加載:Rundll32 <dir>\CnsMin.dll, Rundll32
CnsMin.dll提供了一個函數Rundll32供Rundll32.exe調用
但這個函數只是調用一個真正的駐留函數Rundll32Main()。
Rundll32Main()偽代碼:
void Rundll32Main()
{
hMutex = CreateMutex("CNSMINMUTEX");
if(ERROR_ALREADY_EXISTS)
{
CloseHandle(hMutex);
exit;
}
if(IsWindowsNT()) {
SetProcessSecurityInfo();
}
else {
RegisterProcessAsService();
}
CheckVersion();
// CnsMinKP.sys/vxd 內核驅動程序,保護3721關鍵文件和注冊表項不被刪除
ContactWithCnsMinKPDriver();
// 關鍵的hook,負責將CnsMin.dll注入其他進程空間
InstallCBTHook();
// 關鍵的hook,負責將CnsMin.dll注入其他進程空間
InstallCallWndProcHook();
// CnsMinIO.dll 負責IE地址欄下方的提示
InitCnsMinIO();
// 一些注冊表信息
InitRegistry();
// 保護CnsMin.dll的鉤子不被卸載或搶先
InstallGuardTimer();
CreateMsgWindow();
// Message loop
while (true)
{
GetMessage(&msg);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
CnsMin主要是通過WH_CBT和WH_CALLWNDPROC兩個全局鉤子注入IE進程空間的。注入
IE后,又安裝了WH_KEYBOARD,WH_DEBUG等鉤子。其中對3721實現其“實名轉換”
有用的是WH_KEYBOARD。這是一個本地鉤子。
CnsMin為了保證自己的優先級最高,用了一個定時器函數反復安裝鉤子,無疑會造成
系統性能的下降。
我曾經嘗試過自己安裝一個WH_DEBUG鉤子阻止3721鉤子的調用,確實起到了效果,
立即可以使3721失效。但這種方法3721仍然駐留IE進程內,屬于指標不治本的方法。
強制結束Rundll32進程,可以暫時卸載3721的駐留代碼。但CnsMin.dll通過COM注冊已經
嵌入IE組件中,重新啟動IE后,該進程又會重新啟動。
2. 3721的防刪除手段
文件系統驅動:CnsMinKP*.sys 針對NT/2000/XP有不同版本(98下面是CnsMinKP.vxd)
通常存在于<System directory>\drivers\目錄。
驅動程序,由Windows啟動時加載。
該驅動程序過濾了對文件和注冊表的刪除操作。試圖刪除3721的關鍵文件和注冊表項時,
直接返回一個TRUE,使Windows認為刪除已經成功,但文件和注冊表實際上還是在那里。
該驅動程序還有一個黑名單(保存在某個外部文件中),阻止Windows讀取其他3721的競爭對手的插件文件。
目前還沒有找到停止該驅動的方法。
刪除方法:在Windows啟動前(例如,98下面退出到DOS)刪除CnsMinKP*.sys文件。
注意:3721具有自恢復能力。某些關鍵文件被刪除后,其它模塊會試圖從3721網站重新
下載。所以徹底刪除前需要斷開網絡連接。
3. 針對目前版本的刪除步驟:
a) 運行3721自己提供的刪除程序。可以刪掉大部分的文件。
b) 從DOS啟動,刪除殘存文件,如CnsMin.dll,CnsMinKP*.*等
可能的目錄:Downloaded Program Files目錄,Program Files\3721目錄,drivers目錄
c) 啟動Windows,進入桌面時Windows會報告一些模塊找不到的錯誤,不用理會,刪除
注冊表中3721的值。
可能的位置:HKEY_CURRENT_USER: Software\3721
HKEY_LOCAL_MACHINE: Windows\CurrentVersion\Run
SYSTEM\CurrentControlSet
另外還零散的藏了一些,用關鍵字查找。