2

我正在尝试实现一些非常基本的调试器保护,以防止孩子们使用简单的技巧对我的软件进行逆向工程。虽然这些简单的措施很容易绕过,但它们至少可以将不知情的人拒之门外。以下代码来自在线教程,我想请教您对在生产代码中使用这是否安全的意见?我很犹豫,因为这个功能没有被微软记录在案,因此可能会也可能不会从一个版本的 Windows 完全改变到另一个版本。我想要的最后一件事是我的应用程序开始在 Windows 8、9 等上崩溃,因为函数签名是错误的。

代码如下:

// HideThread will attempt to use
// NtSetInformationThread to hide a thread
// from the debugger, Passing NULL for
// hThread will cause the function to hide the thread
// the function is running in. Also, the function returns
// false on failure and true on success
inline bool HideThread(HANDLE hThread)
{
typedef NTSTATUS (NTAPI *pNtSetInformationThread)
            (HANDLE, UINT, PVOID, ULONG);
NTSTATUS Status;

// Get NtSetInformationThread
pNtSetInformationThread NtSIT = (pNtSetInformationThread)
    GetProcAddress(GetModuleHandle( TEXT("ntdll.dll") ),
    "NtSetInformationThread");

// Shouldn't fail
if (NtSIT == NULL)
    return false;

// Set the thread info
if (hThread == NULL)
    Status = NtSIT(GetCurrentThread(),
            0x11, // HideThreadFromDebugger
            0, 0);
else
    Status = NtSIT(hThread, 0x11, 0, 0);

if (Status != 0x00000000)
    return false;
else
    return true;
}

这可以安全使用吗?

亲切的问候,

菲利普·班尼法尔

4

3 回答 3

4

如果它没有记录,那么根据定义,使用它是不安全的,因为它可以随时被删除/修改而不会发出警告。

也就是说,在大多数系统中,某些未记录的功能是如此广为人知和使用,以至于没有人敢于改变它,因此使用起来非常安全。

在您的特定情况下,只需在此处记录使用谷歌搜索即可。它不是一个普通的 API,而是一个驱动程序支持例程。所以它应该是相当稳定的。我的意思是,如果驱动程序模型发生变化,它可能会在未来的 Windows 版本中消失,但只要它存在,它很可能会像现在一样。

于 2011-11-15T22:31:55.353 回答
3

NtSetInformationXxx 和 NtQueryInformationXXX 可能没有记录,但如前所述,它们被广泛使用,并且有很多代码依赖于它们,它们不太可能发生重大变化,从而以这种方式破坏它们。至于他们的文档 - 有这个记录了很多“未记录”的 API。此外,由于您正在修改反调试技术,我想请您注意这篇论文,它很好地概述了可能的反调试技术及其黑客的对策

于 2011-11-15T22:51:42.950 回答
2

据我所知, NtSetInformationThread 函数现在(间接)记录在MSDN上,因为它使用了ZwSetInformationThread。因此使用它是安全的。有人可以确认这一点,还是有其他理由将此功能标记为“未记录”,因此使用不安全?

于 2011-11-17T08:40:40.520 回答