【问题标题】:API Hooking, unexpected handle found on TerminateProcess functionAPI Hooking,在 TerminateProcess 函数上发现意外句柄
【发布时间】:2015-06-13 19:17:33
【问题描述】:

问题

我已经挂钩 TerminateProcess 调用以识别正在终止的进程,但我从 TerminateProcess 获得了一个与我尝试拦截的真实进程句柄不匹配的意外句柄。

我正在使用 Deviare 库,但我认为只要知道 TerminateProcess 函数的工作原理以及执行正确的句柄比较需要做什么,这个问题就可以解决。

问题:

如果我知道要识别其终止的进程的句柄,我如何从TerminateProcess 函数的hProcess 参数中识别该句柄?

代码:

注意我尝试比较句柄的部分:

If Process.GetProcessesByName("notepad").FirstOrDefault.Handle = hProcessValue Then ...

它永远不会是相同的句柄(我也尝试使用 MainWindowHandle进程 ID ID

所以,hProcess 参数的值对我来说是非常未知的。

Imports Nektra.Deviare2

Public NotInheritable Class Form1

Public WithEvents SpyMgr As NktSpyMgr
Public Hook As NktHook

ReadOnly libName As String = "kernel32.dll"
ReadOnly funcName As String = "TerminateProcess"
ReadOnly hookFlags As eNktHookFlags = eNktHookFlags.flgOnlyPreCall

' Processes to attach the hook.
ReadOnly processesToAttach As IEnumerable(Of Process) =
    Process.GetProcessesByName("taskmgr")

Private Sub Test() Handles MyBase.Load

    If Me.processesToAttach.Count = 0 Then
        MsgBox("Any process found.")

    Else
        Me.SpyMgr = New NktSpyMgr()
        Me.SpyMgr.Initialize()

        Me.Hook = SpyMgr.CreateHook(String.Format("{0}!{1}", libName, funcName), hookFlags)
        Me.Hook.Hook(sync:=True)

        For Each proc As Process In processesToAttach
            Debug.WriteLine("Attaching to: " & proc.ProcessName)
            Me.Hook.Attach(procOrId:=proc.Id, sync:=True)
        Next proc

    End If

End Sub

<MTAThread>
Private Sub OnTerminateProcess_Called(ByVal hook As NktHook,
                                      ByVal proc As NktProcess,
                                      ByVal callInfo As NktHookCallInfo) Handles SpyMgr.OnFunctionCalled

    ' Function params.
    Dim hProcessParam As NktParam = DirectCast(callInfo.Params(0), NktParam)
    Dim uExitCodeParam As NktParam = DirectCast(callInfo.Params(1), NktParam)

    ' Param values.
    Dim hProcessValue As IntPtr = New IntPtr(CInt(hProcessParam.Value))
    Dim uExitCodeValue As UInteger = CUInt(uExitCodeParam.Value)

    ' Debuf info.
    Trace.WriteLine(String.Format("hProcess : '{0}'", hProcessValue))
    Trace.WriteLine(String.Format("uExitCode: '{0}'", uExitCodeValue))

    ' Handle Comparison
    If Process.GetProcessesByName("notepad").FirstOrDefault.Handle = hProcessValue Then

        ' Skip precall to avoid process termination.
        If callInfo.IsPreCall Then
            callInfo.Result.Value = 1
            callInfo.SkipCall()
        End If

    End If

End Sub

End Class

研究:

我一直在阅读 TerminateProcess 的 MSDN 文档。

注意上面写着的部分:

句柄必须具有 PROCESS_TERMINATE 访问权限

我不确定我是否错过了比较句柄的东西。

我也一直在这里阅读,但我没有明白:

Hooking TerminateProcess & Getting Info From The Handle It Supplies

如果有必要进行良好的句柄比较,我还设计了这个枚举:

    Public Enum ProcessAccessFlags As UInteger
       All = &H1F0FFF
       Terminate = &H1
       CreateThread = &H2
       VirtualMemoryOperation = &H8
       VirtualMemoryRead = &H10
       VirtualMemoryWrite = &H20
       DuplicateHandle = &H40
       CreateProcess = &H80
       SetQuota = &H100
       SetInformation = &H200
       QueryInformation = &H400
       QueryLimitedInformation = &H1000
       Synchronize = &H100000
   End Enum

【问题讨论】:

  • 为什么不尝试从句柄中获取进程id,然后检查呢?不知道比较进程句柄,因为您无法共享它们。
  • @SomeNickName 感谢您的评论,但我尝试使用 GetWindowThreadProcessId 函数从 hProcess 参数的句柄中检索 PID,我总是得到一个 Zero(空)PID。我真的认为hProcess 中包含的句柄需要一种我们缺少的特殊处理。
  • P/Invoking GetProcessId 时会发生上述相同的情况,它总是返回 Zero
  • 那么句柄是无效的,我很抱歉 idk 关于钩子并且从未使用过那个库,希望有人会帮助你;)
  • 如果 GetProcessId 返回 0,GetLastError 会返回什么?也许句柄没有 PROCESS_QUERY_INFORMATION 或 PROCESS_QUERY_LIMITED_INFORMATION 访问权限?在这种情况下,您可以尝试DuplicateHandle

标签: .net vb.net hook api-hook deviare


【解决方案1】:

您的代码假设每个进程只有一个句柄。这个不对。每个进程有一个进程 ID。但是每次有人请求进程的句柄时,例如使用OpenProcess(..., ..., procid),他都会获得一个新的进程句柄(这也取决于所需的访问权限)。

所以你不能比较句柄,你应该检查模块名称或进程ID。

【讨论】:

  • 谢谢,我明白了,但请参阅我在问题下方写的评论,句柄似乎没有指向任何 PID(我得到一个零)。
  • @ElektroStudios 那是因为它不是 您的 句柄,而是另一个进程的句柄。句柄是个人的,不能只是共享。这就像如果我说“向左 1 米”,那么它所指的东西与您说“向左 1 米”不同。你需要知道我在哪里以及我面对的方向。同样的事情对句柄适用;如果我的进程有句柄 5,那么它只在我的进程中有意义。
猜你喜欢
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-28
相关资源
最近更新 更多