NtGlobalFlag

简单的 NtGlobalFlag 反调试程序:

#include "stdafx.h"
#include 

#define NAKED __declspec(naked)

NAKED BOOL Detect32()
{
    __asm
    {
        push ebp;
        mov ebp, esp;
        pushad;

        mov eax, fs:[30h];
        mov al, [eax + 68h];
        and al, 70h;
        cmp al, 70h;
        je being_debugged;
        popad;
        mov eax, 0;
        jmp being_debugged + 6

        being_debugged:
        popad;
        mov eax, 1;
        leave;
        retn;

    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    if (Detect32())
    {
        printf("Debug detected!\r\n");
        getchar();
        return 0;
    }

    printf("Hello, World!\r\n");
    getchar();


    return 0;
}

在 32 位系统下,NtGlobalFlag 存在于 PEB 的 0x68 的位置。该值默认为 0,当调试器附加后,会设置以下标志。

NtGlobalFlag_第1张图片

我们通过OD调试器打开程序,也可以看到 PEB 的 0x68的位置,值为 0x70。如果把该值修改为 0,那么程序也就也可以正常调试了

NtGlobalFlag_第2张图片

你可能感兴趣的:(杂记)