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

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

  1. #include <stdio.h>
  2. #include <windows.h>
  3. // 返回调试状态
  4. BOOL IsDebug()
  5. {
  6. DWORD Debug = 0;
  7. __asm
  8. {
  9. mov eax, fs:[0x18] // TEB基地址
  10. mov eax, [eax + 0x30] // 找到PEB
  11. mov eax, [eax + 0x68] // 找打 NtGlobalFlag
  12. mov Debug, eax // 取出值
  13. }
  14. if (Debug == 112)
  15. {
  16. return TRUE;
  17. }
  18. return FALSE;
  19. }
  20. int main(int argc, char * argv[])
  21. {
  22. if (IsDebug)
  23. {
  24. printf("[-] 程序正在被调试 \n");
  25. }
  26. else
  27. {
  28. printf("[*] 程序正常 \n");
  29. }
  30. system("pause");
  31. return 0;
  32. }

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

  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include <winternl.h>
  4. // 声明该函数
  5. typedef NTSTATUS(NTAPI *typedef_ZwQueryInformationProcess)(
  6. IN HANDLE ProcessHandle,
  7. IN PROCESSINFOCLASS ProcessInformationClass,
  8. OUT PVOID ProcessInformation,
  9. IN ULONG ProcessInformationLength,
  10. OUT PULONG ReturnLength OPTIONAL
  11. );
  12. // 调试状态检测
  13. BOOL IsDebug()
  14. {
  15. HANDLE hProcess = NULL;
  16. DWORD ProcessId = 0;
  17. PROCESS_BASIC_INFORMATION Pbi;
  18. typedef_ZwQueryInformationProcess pZwQueryInformationProcess = NULL;
  19. ProcessId = GetCurrentProcessId();
  20. hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId);
  21. if (hProcess != NULL)
  22. {
  23. HMODULE hModule = LoadLibrary("ntdll.dll");
  24. pZwQueryInformationProcess = (typedef_ZwQueryInformationProcess)GetProcAddress(hModule, "ZwQueryInformationProcess");
  25. NTSTATUS Status = pZwQueryInformationProcess(hProcess, ProcessBasicInformation, &Pbi,sizeof(PROCESS_BASIC_INFORMATION), NULL);
  26. if (NT_SUCCESS(Status))
  27. {
  28. DWORD ByteRead = 0;
  29. WORD NtGlobalFlag = 0;
  30. ULONG PebBase = (ULONG)Pbi.PebBaseAddress;
  31. // 读取调试标志并判断
  32. if (ReadProcessMemory(hProcess, (LPCVOID)(PebBase + 0x68), &NtGlobalFlag, 2, &ByteRead) && ByteRead == 2)
  33. {
  34. if (NtGlobalFlag == 0x70)
  35. {
  36. return TRUE;
  37. }
  38. }
  39. }
  40. CloseHandle(hProcess);
  41. }
  42. return FALSE;
  43. }
  44. int main(int argc, char * argv[])
  45. {
  46. if (IsDebug() == TRUE)
  47. {
  48. printf("[-] 进程正在被调试 \n");
  49. }
  50. else
  51. {
  52. printf("[*] 程序正常 \n");
  53. }
  54. system("pause");
  55. return 0;
  56. }

8.3 NtGlobalFlag的更多相关文章

  1. Windows7下驱动开发与调试体系构建——5.实战反调试标记位(NtGlobalFlag)

    目录/参考资料:https://www.cnblogs.com/railgunRG/p/14412321.html <加密与解密>P670中,介绍了检查程序是否被调试的第二种方法:查看进程 ...

  2. 关于《加密与解密》的读后感----对dump脱壳的一点思考

    偶然翻了一下手机日历,原来今天是夏至啊,时间过的真快.ISCC的比赛已经持续了2个多月了,我也跟着比赛的那些题目学了2个月.......虽然过程很辛苦,但感觉还是很幸运的,能在大三的时候遇到ISCC, ...

  3. Windows x86/ x64 Ring3层注入Dll总结

    欢迎转载,转载请注明出处:http://www.cnblogs.com/uAreKongqi/p/6012353.html 0x00.前言 提到Dll的注入,立马能够想到的方法就有很多,比如利用远程线 ...

  4. KPROCESS IDT PEB Ldr 《寒江独钓》内核学习笔记(3)

    继续上一篇(2)未完成的研究,我们接下来学习 KPROCESS这个数据结构. 1. 相关阅读材料 <深入理解计算机系统(原书第2版)> 二. KPROCESS KPROCESS,也叫内核进 ...

  5. Threadpool dump

    Microsoft (R) Windows Debugger Version 10.0.10586.567 AMD64Copyright (c) Microsoft Corporation. All ...

  6. Windows SEH学习 x86

    windows 提供的异常处理机制实际上只是一个简单的框架.我们通常所用的异常处理(比如 C++ 的 throw.try.catch)都是编译器在系统提供的异常处理机制上进行加工了的增强版本.这里先抛 ...

  7. 旧书重温:0day2【3】 详细解读PEB法 查找kener32地址

    题外话:上一篇文章中的 PEB法查找kerner32地址的方法 对TEB.PEB .PE结构 知识要求很高,确实在写汇编代码时候小编 感觉自己能力,信手啪啪一顿乱撸,结果一运行,非法访问了,没办法翻阅 ...

  8. 旧书重温:0day2【2】 实验:三种获取kernel32.dll基址的方法

    0x01 找kernel32基地址的方法一般有三种: 暴力搜索法.异常处理链表搜索法.PEB法. 0x02 基本原理 暴力搜索法是最早的动态查找kernel32基地址的方法.它的原理是几乎所有的win ...

  9. delphi R3下 跨进程获取DLL信息 NtQueryInformationProcess

    unit APIUnit; { GetProcessModuleHandle API Unit Ring3调用NtQueryInformationProcess实现跨进程获取DLL句柄 } inter ...

  10. 对dump脱壳的一点思考

    对dump脱壳的一点思考 偶然翻了一下手机日历,原来今天是夏至啊,时间过的真快.ISCC的比赛已经持续了2个多月了,我也跟着比赛的那些题目学了2个月.......虽然过程很辛苦,但感觉还是很幸运的,能 ...

随机推荐

  1. MetaGPT day01: MetaGPT作者代码走读、软件公司初始示例

    LLM发展历史 - 2013年word2vec提出,但效果不好 - 2017年Transformer结构提出,降低网络复杂度 - 2018年BERT预训练语言模型效果显著提升 - 2019年GPT-3 ...

  2. Linux Page Cache调优在Kafka中的应用

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/MaeXn-kmgLUah78brglFkg作者:Yang Yijun 本文主要描述Linux ...

  3. 看这个视频,4万人学会云上部署 Stable Diffusion

    目前大火的 AIGC 领域中, 除了 ChatGPT,Stable Diffusion 在文生图领域大放异彩,深刻影响着绘画.视频制作等相关领域.<动手吧,开发者>本期活动邀请 B 站知识 ...

  4. webgl创建一个点

  5. Java 内存管理最佳实践

    本文翻译自国外论坛 medium,原文地址:https://medium.com/@fullstacktips/best-practices-for-memory-management-in-java ...

  6. 强大的PDF格式转换器--迅捷PDF转换器

    1.功能十分强大,具体如图所示,实现了多种文件格式的转换,PDF合并和PDF密码解除也帮了我很大的忙(注意这里的密码解除是强行解除,不需要你知道密码) 2.资源分享 https://www.aliyu ...

  7. [springmvc] - 配置文件 springmvc-config.xml 和 web.xml

    springmvc-config.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmln ...

  8. electron打包,使用electron-packager

    构建项目可以使用electron-forge构建,但是这个东西打包比较坑,mac运行报错,win下会有缓存机制,也就是热更新无效 所以选择使用electron-packager打包 sudo npm ...

  9. 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.11.25)

    来给大家伙送福利了! 一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘, ...

  10. [转帖]ORA-01450 maximum key length (3215) exceeded

    一. 问题背景 给一个业务表online建索引时遇到了ORA-01450 maximum key length (3215) exceeded报错,看字面意思是字段太长了,检查表字段类型发现基本都是n ...