我正在尝试实施一些非常基本的调试器保护,以防止孩子使用简单的技巧来反向工程我的软件。虽然这些简单的措施很容易绕过,但它们至少会阻止不了解情况。以下代码来自在线教程,我想询问您是否可以安全地在生产代码中使用?我犹豫不决,因为这个功能没有被Microsoft记录,因此可能会或可能不会从一个版本的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;
}
这样安全吗?
亲切的问候,
Philip Bennefall
答案 0 :(得分:3)
如果它没有记录,那么根据定义它是不安全的,因为它可以在没有警告的情况下随时删除/修改。
也就是说,在大多数系统中都存在一些广泛知晓和使用的未记录的功能,没有人会在他们的正确思想中敢于改变它,因此使用起来非常安全。
在您的特定情况下,只需使用Google搜索,就会记录here。它不是普通的API,而是驱动程序支持例程。所以它应该是相当稳定的。我的意思是,如果驱动程序模型发生变化,可能会在Windows的未来版本中消失,但只要它存在,它就可能就像现在一样。
答案 1 :(得分:3)
NtSetInformationXxx和NtQueryInformationXXX可能没有文档,但如前所述,它们被广泛使用,并且有许多代码依赖于它们,它们不太可能经历一次重大改变,这将以这种方式打破它们。至于它们的文档 - 有this记录了许多“未记录的”API。此外,由于您正在修改反调试技术,我想将您的注意力转向this论文,该文章非常好地概述了黑客可能的反调试技术及其对策
答案 2 :(得分:2)
据我所知,NtSetInformationThread函数现在(间接)记录在MSDN上,因为它使用ZwSetInformationThread。因此使用它是安全的。有人可以证实这一点,还是有其他理由将此功能标记为“未记录”并因此使用不安全?