Безопасно ли использовать NtSetInformationThread?
Я пытаюсь реализовать некоторую базовую защиту отладчика, чтобы дети не могли использовать простые приемы для обратного инжиниринга моего программного обеспечения. Хотя эти простые меры легко обойти, они, по крайней мере, не допустят неосведомленности. Следующий код взят из онлайн-учебника, и я хотел бы узнать ваше мнение относительно того, безопасно ли это использовать в рабочем коде? Я колеблюсь из-за того факта, что эта функция недокументирована 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;
}
Это безопасно для использования?
С уважением,
Филип Беннефолл
3 ответа
Если он недокументирован, то по определению его небезопасно использовать, поскольку его можно удалить / изменить в любое время без предупреждения.
Тем не менее, существуют некоторые недокументированные функции в большинстве систем, которые настолько широко известны и используются, что никто в здравом уме не осмелится их изменить, и, следовательно, будет довольно безопасно использовать.
В вашем конкретном случае, просто погуглив вокруг этого, задокументировано здесь. Это просто не обычный API, а подпрограмма поддержки драйверов. Так что оно должно быть достаточно стабильным. Я имею в виду, что он может исчезнуть в будущей версии Windows, если модель драйвера изменится, но, пока она существует, она, скорее всего, будет такой, как сейчас.
NtSetInformationXxx и NtQueryInformationXXX могут быть недокументированными, но, как указывалось ранее, они так широко используются, и существует много кода, который полагается на них, что маловероятно, что они претерпят серьезные изменения, которые сломают их таким образом. Что касается документации для них - есть то, что документирует множество "недокументированных" API. Кроме того, поскольку вы работаете с методами анти-отладки, я хотел бы обратить ваше внимание на этот документ, который дает очень хороший обзор возможных методов анти-отладки и их контрмеры со стороны хакеров.
Насколько я могу видеть, функция NtSetInformationThread теперь (косвенно) задокументирована в MSDN, поскольку она использует ZwSetInformationThread. Таким образом, это безопасно использовать. Может ли кто-то это подтвердить, или есть другие причины пометить эту функцию как "недокументированную" и, следовательно, небезопасную для использования?