学习需要,需要监控程序进程的创建的退出,小弟未接触过API HOOK,所以请各位大虾帮忙解决下ad.dat文件里是存放一些进程名的,格式如下
abe.exe;bcd.bin;cend.dat;eeab.exe;..............现在需要做一程序,监控ad.dat内记录的进程名的创建和退出,都以msgbox方式弹出提醒,请各位大虾帮忙解决下啊.

解决方案 »

  1.   


    同意楼上的 不但不会走路便想学跑步之外,同时还得自己学会搜索, 下面这是与你的需求雷同的代码, .dat或 .txt 列举不可信任清单,选择性自动关闭进程, 找不到你再找我吧.
      

  2.   

    http://download.csdn.net/source/1860777
      

  3.   


    我就是问有没有什么API是HOOK进程的创建和退出的啊,网上没找到相关的资料
      

  4.   

    首先这个东西VB几乎是做不了的。因为VB不支持原生的DLL。
      

  5.   

    我用其他办法能实现,我现在只想知道用API HOOK怎么搞,我来这里请教问题,找答案的,不是听你来说教的
      

  6.   


    嗯,我不介意,因为你是来请教的。你不清楚用VB实现起来的困难,答案有很多形式。“很困难”也许是一个不怎么让你满意的答案,但是它同样是一个答案。抱歉,之前没有详细和你说这个答案我提出来的背景。我不知道你能否理解 API Hook 的原理。它其实是一个注入目标进程地址的代码。为此,必须使用 DLL 来编写。而 Visual Basic 需要依赖虚拟机,并且做初始化才能保证程序能运行。所以不适合写这样的 DLL。即便你会写原生的DLL,你还需要去用一系列的技巧去计算和重定位 API 函数地址。这样的技巧在 Windows 2000+ 以上得到简化,但是仍然非常复杂,你可以参考微软的 detour 工具包的代码,它提供了一个 API Hook 的实现,在我之前的 BLOG 提到过。我相信有人用VB Hack出了API Hook的程序,我不得不说这些程序的利害,但是目前据我所知,还没有一个程序能达到稳定工作在主流操作系统版本和各种软件环境之中。如果你不能理解这些技术背景也没有关系,我只想告诉你2点。
    (1)很难实现不是一个轻率地结论。
    (2)打一个比方吧,有个笑话是说,网上有人问我捡到了一个鼠标垫,请问还需要配哪些东西可以凑成一台电脑。
      

  7.   

    其实在VB6中管理进程很简单,不需要那么复杂的API,只要学会WMI即可。
    如以下代码所示:
    在设计代码之前必须先引用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
      

  8.   

    只是监控程序是否启动,应该用不到Hook,
    普通进程用 Enum + Terminate,差不多就行
    特殊的,有个权限问题,更低层的,就要看谁先抢到系统控制权了,而且这种事,VB没能力去抢
      

  9.   

    WMI监视进程创建和死亡
      

  10.   

    VMI的我知道可以,我就是不想用VMI的,如果服务停了就无效了的
      

  11.   

    仅凭vb6知识搞api hook几乎不可能,能行的都会加上汇编,指令编码等知识才行.
      

  12.   

    那只能不断地扫描进程列表了。而且效果也只能是“监视”,而不是“监控”了,因为你控制不了别的进程的启动与退出。想要有办法,在RING3下就要做全局的注入,拦截所有进程的createprocess相关函数。驱动里面拦截其实更方便。但都不是光VB6就能完成的。