【问题标题】:How to detach a debugger on me in C++如何在 C++ 中分离我的调试器
【发布时间】:2022-01-24 06:07:11
【问题描述】:

我正在开发一个需要在 dll 端自动分离其调试器的程序。

我试过的是

if (DebugActiveProcessStop(GetCurrentProcessId()))
{
...
};

但是通过GetLastError,我总是得到错误代码0x5,这意味着我没有足够的访问权限来执行此操作。

所以我想知道如何从我的 dll 中分离调试器?

我在 Github 上的项目:https://github.com/secsome/FA2sp/blob/master/FA2sp/Miscs/Exception.cpp#L201

【问题讨论】:

  • 我认为您需要先提供更多背景信息,然后才能有人帮助您。
  • @AndersK 也许我猜这里的 Github 链接可能更有帮助?这里的主要问题是我需要将我的程序与其他人制作的调试器分离,我无法编辑调试器。所以我的问题是如何在我自己的程序源代码中分离调试器。 github.com/secsome/FA2sp/blob/master/FA2sp/Miscs/…
  • 您是否使用 GetSecurityInfo 检查以确保您拥有该过程的权限?
  • 还没有,我只是觉得没有必要,因为我只是在自己编辑……反正我以后会试试的。
  • 这不是 c++ 问题(没有 c++ 中的调试器之类的东西)而是 windows/winapi 问题

标签: c++ windows debugging operating-system


【解决方案1】:

用于从进程中分离调试器需要调用

EXTERN_C
NTSYSCALLAPI
NTSTATUS
NTAPI
NtRemoveProcessDebug(
    _In_ HANDLE ProcessHandle,
    _In_ HANDLE DebugObjectHandle
    );

DebugActiveProcessStop 调用 DbgUiStopDebugging 下一步:

NTSYSAPI
NTSTATUS
NTAPI
DbgUiStopDebugging(
    _In_ HANDLE Process
    )
{
  return NtRemoveProcessDebug(Process, NtCurrentTeb()->DbgSsReserved[1]);
}

但是在线程 TEBDbgSsReserved[1] 在哪里设置为DebugObjectHandle? 内部函数DbgUiConnectToDbg

NTSYSAPI
NTSTATUS
NTAPI
DbgUiConnectToDbg()
{
    if (NtCurrentTeb()->DbgSsReserved[1])
    {
        return STATUS_SUCCESS;
    }

    OBJECT_ATTRIBUTES oa = { sizeof(oa) };

    return NtCreateDebugObject(&NtCurrentTeb()->DbgSsReserved[1], 
        DEBUG_ALL_ACCESS, &oa, DEBUG_KILL_ON_CLOSE);
}

DEBUG_PROCESS和/或DEBUG_ONLY_THIS_PROCESS时,又从DebugActiveProcessCreateProcess[AsUser]调用DbgUiConnectToDbg

所以调用DebugActiveProcessStop 仅在直接或间接(通过DebugActiveProcessCreateProcess[AsUser]DEBUG[_ONLY_THIS]_PROCESS)调用DbgUiConnectToDbg 之前的线程中有效和存在,当然调试器必须附加到指定的进程.

所有这些都表明,在您的情况下,调用 DebugActiveProcessStop 是毫无意义的,而且文档也不好。


您需要首先通过NtQueryInformationProcessProcessDebugObjectHandle 打开调试对象进行自我处理,然后在收到的句柄上调用NtRemoveProcessDebug。如果您的进程没有附加调试器 - 必须返回 STATUS_PORT_NOT_SET

NTSTATUS StopDebugSelf()
{
    HANDLE hDebug;
    NTSTATUS status = NtQueryInformationProcess(NtCurrentProcess(), 
                    ProcessDebugObjectHandle, &hDebug, sizeof(HANDLE), 0);
    if (0 <= status)
    {
        status = NtRemoveProcessDebug(NtCurrentProcess(), hDebug);
        NtClose(hDebug);
    }
    return status;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 2023-01-25
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    相关资源
    最近更新 更多