跳转至

ZwSetInformationThread

關於ZwSetInformationThread

ZwSetInformationThread 等同於 NtSetInformationThread,通過爲線程設置 ThreadHideFromDebugger,可以禁止線程產生調試事件,代碼如下

#include <Windows.h>
#include <stdio.h>

typedef DWORD(WINAPI* ZW_SET_INFORMATION_THREAD) (HANDLE, DWORD, PVOID, ULONG);
#define ThreadHideFromDebugger 0x11
VOID DisableDebugEvent(VOID)
{
    HINSTANCE hModule;
    ZW_SET_INFORMATION_THREAD ZwSetInformationThread;
    hModule = GetModuleHandleA("Ntdll");
    ZwSetInformationThread = (ZW_SET_INFORMATION_THREAD)GetProcAddress(hModule, "ZwSetInformationThread");
    ZwSetInformationThread(GetCurrentThread(), ThreadHideFromDebugger, 0, 0);
}

int main()
{
    printf("Begin\n");
    DisableDebugEvent();
    printf("End\n");
    return 0;
}

關鍵代碼爲ZwSetInformationThread(GetCurrentThread(), ThreadHideFromDebugger, 0, 0);,如果處於調試狀態,執行完該行代碼,程序就會退出

如何繞過

注意到該處 ZwSetInformationThread 函數的第 2 個參數爲 ThreadHideFromDebugger,其值爲 0x11。調試執行到該函數時,若發現第 2 個參數值爲 0x11,跳過或者將 0x11 修改爲其他值即可