首页 > 其他分享 >8.3 NtGlobalFlag

8.3 NtGlobalFlag

时间:2023-09-26 12:33:55浏览次数:52  
标签:NtGlobalFlag 8.3 return eax include 调试 hProcess

NtGlobalFlag 是一个Windows内核全局标记,在Windows调试方案中经常用到。这个标记定义了一组系统的调试参数,包括启用或禁用调试技术的开关、造成崩溃的错误代码和处理方式等等。通过改变这个标记,可以在运行时设置和禁用不同的调试技术和错误处理方式,比如调试器只能访问当前进程、只允许用户模式调试、启用特定的错误处理方式等等。但由于NtGlobalFlag标记是内核全局标记,其改变会影响整个系统的行为,需要谨慎处理。

利用该标记反调试,首先定位dt -rv ntdll!_TEB找到TEB结构并通过TEB找到PEB结构,然后找到+0x068 NtGlobalFlag,这个位置的NtGlobalFlag类似于BeingDebugged,如果是调试状态NtGlobalFlag的值会是0x70,所以可以判断这个标志是否为0x70来判断程序是否被调试了,首先我们来使用汇编代码解决。

#include <stdio.h>
#include <windows.h>

// 返回调试状态
BOOL IsDebug()
{
    DWORD Debug = 0;
    __asm
    {
        mov eax, fs:[0x18]       // TEB基地址
        mov eax, [eax + 0x30]    // 找到PEB
        mov eax, [eax + 0x68]    // 找打 NtGlobalFlag
        mov Debug, eax           // 取出值
    }

    if (Debug == 112)
    {
        return TRUE;
    }

    return FALSE;
}

int main(int argc, char * argv[])
{

    if (IsDebug)
    {
        printf("[-] 程序正在被调试 \n");
    }
    else
    {
        printf("[*] 程序正常 \n");
    }

    system("pause");
    return 0;
}

当然除了使用纯汇编实现反调试外,我们也可以使用NativeAPI中的ZwQueryInformationProcess()这个函数来读取到程序中的PET数据,然后判断PebBase+0x68是否等于70,由于这个函数并没有公开,所以在使用时应该自行声明一下结构类型。

#include <stdio.h>
#include <windows.h>
#include <winternl.h>

// 声明该函数
typedef NTSTATUS(NTAPI *typedef_ZwQueryInformationProcess)(
    IN HANDLE ProcessHandle,
    IN PROCESSINFOCLASS ProcessInformationClass,
    OUT PVOID ProcessInformation,
    IN ULONG ProcessInformationLength,
    OUT PULONG ReturnLength OPTIONAL
    );

// 调试状态检测
BOOL IsDebug()
{
    HANDLE hProcess = NULL;
    DWORD ProcessId = 0;
    PROCESS_BASIC_INFORMATION Pbi;
    typedef_ZwQueryInformationProcess pZwQueryInformationProcess = NULL;
    ProcessId = GetCurrentProcessId();
    hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId);

    if (hProcess != NULL)
    {
        HMODULE hModule = LoadLibrary("ntdll.dll");
        pZwQueryInformationProcess = (typedef_ZwQueryInformationProcess)GetProcAddress(hModule, "ZwQueryInformationProcess");

        NTSTATUS Status = pZwQueryInformationProcess(hProcess, ProcessBasicInformation, &Pbi,sizeof(PROCESS_BASIC_INFORMATION), NULL);
        if (NT_SUCCESS(Status))
        {
            DWORD ByteRead = 0;
            WORD NtGlobalFlag = 0;
            ULONG PebBase = (ULONG)Pbi.PebBaseAddress;

            // 读取调试标志并判断
            if (ReadProcessMemory(hProcess, (LPCVOID)(PebBase + 0x68), &NtGlobalFlag, 2, &ByteRead) && ByteRead == 2)
            {
                if (NtGlobalFlag == 0x70)
                {
                    return TRUE;
                }
            }
        }
        CloseHandle(hProcess);
    }

    return FALSE;
}

int main(int argc, char * argv[])
{
    if (IsDebug() == TRUE)
    {
        printf("[-] 进程正在被调试 \n");
    }
    else
    {
        printf("[*] 程序正常 \n");
    }

    system("pause");
    return 0;
}

本文作者: 王瑞
本文链接: https://www.lyshark.com/post/e45d84be.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

标签:NtGlobalFlag,8.3,return,eax,include,调试,hProcess
From: https://www.cnblogs.com/LyShark/p/17729829.html

相关文章

  • 8.3 NtGlobalFlag
    NtGlobalFlag是一个Windows内核全局标记,在Windows调试方案中经常用到。这个标记定义了一组系统的调试参数,包括启用或禁用调试技术的开关、造成崩溃的错误代码和处理方式等等。通过改变这个标记,可以在运行时设置和禁用不同的调试技术和错误处理方式,比如调试器只能访问当前进程、只......
  • docker 部署mysql8.3.0
    以下内容全部来源于https://blog.csdn.net/Weirdo_zhu/article/details/126358872?spm=1001.2014.3001.5501一、拉取镜像dockerpullmysql:8.0.30二、创建挂载路径 //根目录选择自身实际最大磁盘路径一般为/home或者定义/datamkdir-p/data/mysql/datamkdir-p/data/m......
  • 文心一言 VS 讯飞星火 VS chatgpt (92)-- 算法导论8.3 5题
    五、用go语言,在本节给出的第一个卡片排序算法中,为排序d位十进制数,在最坏情况下需要多少轮排序?在最坏情况下,操作员需要记录多少堆卡片?文心一言:你提到的第一个卡片排序算法可能是指的基数排序(RadixSort)。基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数......
  • 文心一言 VS 讯飞星火 VS chatgpt (92)-- 算法导论8.3 5题
    五、用go语言,在本节给出的第一个卡片排序算法中,为排序d位十进制数,在最坏情况下需要多少轮排序?在最坏情况下,操作员需要记录多少堆卡片?文心一言:你提到的第一个卡片排序算法可能是指的基数排序(RadixSort)。基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的......
  • 文心一言 VS 讯飞星火 VS chatgpt (91)-- 算法导论8.3 4题
    四、用go语言,说明如何在O(n)时间内,对0到$n^3-1$区间内的n个整数进行排序。文心一言:在O(n)时间内对0到n^3-1区间内的n个整数进行排序,可以使用基数排序(RadixSort)算法。基数排序是一种非比较型整数排序算法,其时间复杂度为O(d*(n+k)),其中d是数字的最大位数,k是基......
  • 9.9续8.31java添加图片
    JLabel管理区域:图片,文字API帮助文档:方法的用法宽高(单位:像素),边框 将图片文件夹粘贴到idea当前模块(最大)下 Imagelcon图片对象:ImageIcon对象名=newImageIcon(图片地址);JLabel对象名=newJLabel(图片对象名);  //管理容器的创建add(管理对象名);  //位置确定后再调用......
  • 文心一言 VS 讯飞星火 VS chatgpt (89)-- 算法导论8.3 2题
    二、用go语言,下面的排序算法中哪些是稳定的:插入排序、归并排序、堆排序和快速排序?给出一个能使任何排序算法都稳定的方法。你所给出的方法带来的额外时间和空间开销是多少?文心一言:在Go语言中,以下排序算法是稳定的:插入排序归并排序而以下的排序算法是不稳定的:堆排序快速排......
  • 文心一言 VS 讯飞星火 VS chatgpt (89)-- 算法导论8.3 2题
    二、用go语言,下面的排序算法中哪些是稳定的:插入排序、归并排序、堆排序和快速排序?给出一个能使任何排序算法都稳定的方法。你所给出的方法带来的额外时间和空间开销是多少?文心一言:在Go语言中,以下排序算法是稳定的:插入排序归并排序而以下的排序算法是不稳定的:堆排序快速排序要使任......
  • 文心一言 VS 讯飞星火 VS chatgpt (88)-- 算法导论8.3 1题
    一、用go语言,参照图8-3的方法,说明RADIX-SORT在下列英文单词上的操作过程:COW,DOG,SEA,RUG,ROW,MOB,BOX,TAB,BAR,EAR,TAR,DIG,BIG,TEA,NOW,FOX。文心一言:RADIX-SORT是一种基于字符的排序算法,它将字符串中的每个字符按照其ASCII值进行排序,然后再按照其出现频率进行排序。以下是RADIX-S......
  • 文心一言 VS 讯飞星火 VS chatgpt (88)-- 算法导论8.3 1题
    一、用go语言,参照图8-3的方法,说明RADIX-SORT在下列英文单词上的操作过程:COW,DOG,SEA,RUG,ROW,MOB,BOX,TAB,BAR,EAR,TAR,DIG,BIG,TEA,NOW,FOX。文心一言:RADIX-SORT是一种基于字符的排序算法,它将字符串中的每个字符按照其ASCII值进行排序,然后再按照其出现频率进行排序。以下是RADIX-SORT......