学习需要,需要监控程序进程的创建的退出,小弟未接触过API HOOK,所以请各位大虾帮忙解决下ad.dat文件里是存放一些进程名的,格式如下
abe.exe;bcd.bin;cend.dat;eeab.exe;..............现在需要做一程序,监控ad.dat内记录的进程名的创建和退出,都以msgbox方式弹出提醒,请各位大虾帮忙解决下啊.
abe.exe;bcd.bin;cend.dat;eeab.exe;..............现在需要做一程序,监控ad.dat内记录的进程名的创建和退出,都以msgbox方式弹出提醒,请各位大虾帮忙解决下啊.
同意楼上的 不但不会走路便想学跑步之外,同时还得自己学会搜索, 下面这是与你的需求雷同的代码, .dat或 .txt 列举不可信任清单,选择性自动关闭进程, 找不到你再找我吧.
我就是问有没有什么API是HOOK进程的创建和退出的啊,网上没找到相关的资料
嗯,我不介意,因为你是来请教的。你不清楚用VB实现起来的困难,答案有很多形式。“很困难”也许是一个不怎么让你满意的答案,但是它同样是一个答案。抱歉,之前没有详细和你说这个答案我提出来的背景。我不知道你能否理解 API Hook 的原理。它其实是一个注入目标进程地址的代码。为此,必须使用 DLL 来编写。而 Visual Basic 需要依赖虚拟机,并且做初始化才能保证程序能运行。所以不适合写这样的 DLL。即便你会写原生的DLL,你还需要去用一系列的技巧去计算和重定位 API 函数地址。这样的技巧在 Windows 2000+ 以上得到简化,但是仍然非常复杂,你可以参考微软的 detour 工具包的代码,它提供了一个 API Hook 的实现,在我之前的 BLOG 提到过。我相信有人用VB Hack出了API Hook的程序,我不得不说这些程序的利害,但是目前据我所知,还没有一个程序能达到稳定工作在主流操作系统版本和各种软件环境之中。如果你不能理解这些技术背景也没有关系,我只想告诉你2点。
(1)很难实现不是一个轻率地结论。
(2)打一个比方吧,有个笑话是说,网上有人问我捡到了一个鼠标垫,请问还需要配哪些东西可以凑成一台电脑。
如以下代码所示:
在设计代码之前必须先引用WMI对象。
Option ExplicitDim objSWbemLocator As New SWbemLocator
Dim objSWbemServices As SWbemServices
Dim objSWbemObjectSet As SWbemObjectSet
Dim objSWbemObject As SWbemObjectPrivate Sub Form_Load()
Me.Caption = "进程管理器"
Command1.Caption = "刷新"
Command2.Caption = "结束进程"
ListView1.ColumnHeaders.Clear
ListView1.ColumnHeaders.Add , "a", "进程ID", 600
ListView1.ColumnHeaders.Add , "b", "进程名", 2000
ListView1.ColumnHeaders.Add , "c", "路径", 6000
ListView1.View = lvwReport
Command1_Click '刷新进程列表
End SubPrivate Sub Command1_Click()
Dim i As Long
ListView1.ListItems.Clear '清空ListView
Set objSWbemServices = objSWbemLocator.ConnectServer() '连接到本机的WMI,返回一个对 SWbemServices 对象的引用
Set objSWbemObjectSet = objSWbemServices.InstancesOf("Win32_Process") '返回Win32_Process类名标识的所有实例
i = 0
For Each objSWbemObject In objSWbemObjectSet '枚举每一个Win32_Process的实例
ListView1.ListItems.Add , "a" & i, objSWbemObject.Handle '将进程ID添加到ListView1第一列
ListView1.ListItems("a" & i).SubItems(1) = objSWbemObject.Name '将进程名添加到ListView1第二列
If Not IsNull(objSWbemObject.ExecutablePath) Then _
ListView1.ListItems("a" & i).SubItems(2) = objSWbemObject.ExecutablePath '将进程路径添加到ListView1第三列
i = i + 1
Next
Set objSWbemObjectSet = Nothing
End Sub
Private Sub Command2_Click()
Dim TMBack As Long
If ListView1.SelectedItem.Text <> "" Then
If MsgBox("确实要结束进程[" & ListView1.SelectedItem.SubItems(1) & "]吗?", vbYesNo) = vbYes Then
Set objSWbemObjectSet = objSWbemServices.ExecQuery("SELECT * FROM Win32_Process WHERE Handle = '" & ListView1.SelectedItem.Text & "'") '查询Win32_Process类中Handle属性等于指定值的所有实例
For Each objSWbemObject In objSWbemObjectSet
TMBack = objSWbemObject.Terminate '终止指定进程
Next
If TMBack = 0 Then
MsgBox ListView1.SelectedItem.SubItems(1) & "已经被终止!"
Else
MsgBox ListView1.SelectedItem.SubItems(1) & "不能被终止!"
End If
Command1_Click '刷新进程列表
End If
End If
End Sub
普通进程用 Enum + Terminate,差不多就行
特殊的,有个权限问题,更低层的,就要看谁先抢到系统控制权了,而且这种事,VB没能力去抢