Безопасно ли использовать NtSetInformationThread? - PullRequest
2 голосов
/ 16 ноября 2011

Я пытаюсь внедрить некоторую базовую защиту отладчика, чтобы дети не могли использовать простые приемы для обратного инжиниринга моего программного обеспечения.Хотя эти простые меры легко обойти, они, по крайней мере, не допустят неосведомленности.Следующий код взят из онлайнового учебного пособия, и я хотел бы узнать ваше мнение относительно того, безопасно ли это использовать в рабочем коде?Я колеблюсь из-за того факта, что эта функция недокументирована 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

Ответы [ 3 ]

3 голосов
/ 16 ноября 2011

NtSetInformationXxx и NtQueryInformationXXX могут быть недокументированными, но, как указывалось ранее, они так широко используются, и существует большой код, который полагается на них, что маловероятно, что они претерпят серьезные изменения, которые сломают их таким образом. Что касается документации для них - существует этот , который документирует множество «недокументированных» API. Кроме того, поскольку вы работаете с методами устранения ошибок, я хотел бы обратить ваше внимание на эту статью , которая дает очень хороший обзор возможных методов устранения ошибок и их контрмер со стороны хакеров

3 голосов
/ 16 ноября 2011

Если он недокументирован, то по определению его небезопасно использовать, так как его можно удалить / изменить в любое время без предупреждения.

При этом в большинстве систем есть некоторые недокументированные функции, которые такШироко известно и используется, что никто в здравом уме не осмелится изменить его, и, таким образом, его будет довольно безопасно использовать.

В вашем конкретном случае, просто погуглив вокруг, задокументировано здесь .Это не просто API, а подпрограмма поддержки драйверов .Так что оно должно быть достаточно стабильным.Я имею в виду, что может исчезнуть в будущей версии Windows, если модель драйвера изменится, но, пока она существует, она, скорее всего, будет такой, как сейчас.

2 голосов
/ 17 ноября 2011

Насколько я вижу, функция NtSetInformationThread теперь (косвенно) задокументирована на MSDN , поскольку она использует ZwSetInformationThread . Таким образом, это безопасно использовать. Может ли кто-нибудь это подтвердить, или есть другие причины пометить эту функцию как «недокументированную» и, таким образом, небезопасную для использования?

...