CTF-RE 从0到N: windows反调试-获取Process Environment Block(PEB)信息来检测调试
在Windows操作系统中,Process Environment Block (PEB,进程环境块) 是一个包含特定进程信息的数据结构。它可以被用于反调试中
如何获取PEB指针?
在Windows操作系统中,获取PEB指针的常见方法主要有以下几种。:
1. 使用 NtCurrentPeb
获取 PEB
NtCurrentPeb
是Windows内核提供的一个函数,它返回当前进程的PEB指针。这个方法通常用于内核模式或通过非公开的API调用。在用户模式中,你可以使用 NtCurrentPeb
来获取PEB指针。
PEB* GetPEB()
{return NtCurrentPeb(); // 获取当前进程的PEB指针
}
注:NtCurrentPeb
是Windows的NT内核函数,通常不公开给用户模式程序直接调用,但可以通过动态加载 ntdll.dll
并使用 GetProcAddress
来调用。
2. 使用 NtQueryInformationProcess
获取 PEB
通过 NtQueryInformationProcess
函数,可以查询关于进程的信息,其中包括PEB的指针。这是通过NT内部函数来实现的。
#include <Windows.h>
#include <winternl.h>typedef struct _PROCESS_BASIC_INFORMATION {ULONG Reserved;ULONG PebBaseAddress; // PEB的地址ULONG AffinityMask;ULONG BasePriority;ULONG UniqueProcessId;ULONG InheritedFromUniqueProcessId;
} PROCESS_BASIC_INFORMATION;typedef NTSTATUS(WINAPI* NtQueryInformationProcess_t)(HANDLE ProcessHandle,PROCESS_INFORMATION_CLASS ProcessInformationClass,PVOID ProcessInformation,ULONG ProcessInformationLength,PULONG ReturnLength
);PEB* GetPEB(HANDLE hProcess)
{NtQueryInformationProcess_t NtQueryInformationProcess =(NtQueryInformationProcess_t)GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtQueryInformationProcess");PROCESS_BASIC_INFORMATION pbi;ULONG len = 0;NTSTATUS status = NtQueryInformationProcess(hProcess, ProcessBasicInformation, &pbi, sizeof(pbi), &len);if (NT_SUCCESS(status)){return (PEB*)pbi.PebBaseAddress;}return NULL;
}
注:此方法需要依赖动态加载 ntdll.dll
,并调用 NtQueryInformationProcess
函数。这个函数是Windows的NT内核接口,返回关于进程的详细信息。
3. 直接通过 NtQueryInformationProcess
查询 PEB 地址
也可以通过调用 NtQueryInformationProcess
来获取进程的PEB地址。你可以查询有关进程的基本信息,其中就包含PEB的地址。
#include <windows.h>
#include <winternl.h>typedef enum _PROCESSINFOCLASS {ProcessBasicInformation = 0
} PROCESSINFOCLASS;typedef struct _PROCESS_BASIC_INFORMATION {ULONG Reserved;ULONG PebBaseAddress; // PEB地址ULONG AffinityMask;ULONG BasePriority;ULONG UniqueProcessId;ULONG InheritedFromUniqueProcessId;
} PROCESS_BASIC_INFORMATION;typedef NTSTATUS(WINAPI* NtQueryInformationProcess_t)(HANDLE ProcessHandle,PROCESSINFOCLASS ProcessInformationClass,PVOID ProcessInformation,ULONG ProcessInformationLength,PULONG ReturnLength
);PEB* GetPEB(HANDLE processHandle)
{PROCESS_BASIC_INFORMATION pbi;ULONG len = 0;NtQueryInformationProcess_t NtQueryInformationProcess = (NtQueryInformationProcess_t)GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtQueryInformationProcess");NTSTATUS status = NtQueryInformationProcess(processHandle, ProcessBasicInformation, &pbi, sizeof(pbi), &len);if (NT_SUCCESS(status)){return (PEB*)pbi.PebBaseAddress;}return NULL;
}
检测PEB的哪些位置来检测调试?
-
检查BeingDebugged标志:
- PEB结构中的
BeingDebugged
字段直接指示进程是否正在被调试。该字段是一个布尔值,当进程在调试器下运行时,它的值为1,否则为0。
BOOL IsDebuggerPresent() {PEB* peb = (PEB*)__readfsdword(0x30); // 获取PEB地址return peb->BeingDebugged; // 返回BeingDebugged字段的值 }
- PEB结构中的
-
检查NtGlobalFlag标志:
- PEB中的
NtGlobalFlag
字段包含一些系统标志,其中某些标志在进程被调试器附加时会被设置。例如,FLG_HEAP_ENABLE_TAIL_CHECK
,FLG_HEAP_ENABLE_FREE_CHECK
和FLG_HEAP_VALIDATE_PARAMETERS
会在调试器附加时被设置。
BOOL CheckNtGlobalFlag() {PEB* peb = (PEB*)__readfsdword(0x30); // 获取PEB地址DWORD NtGlobalFlag = peb->NtGlobalFlag;return (NtGlobalFlag & 0x70) != 0; // 检查特定的调试标志 }
- PEB中的
-
检查Heap Flags和ForceFlags:
- 调试器通常会修改PEB中的Heap Flags和ForceFlags,以启用更严格的堆检查。在PEB中的
ProcessHeap
字段指向进程的默认堆,这些标志位于该堆结构中。
BOOL CheckHeapFlags() {PEB* peb = (PEB*)__readfsdword(0x30); // 获取PEB地址PVOID heap = peb->ProcessHeap; // 获取默认堆地址DWORD heapFlags = *(DWORD*)((BYTE*)heap + 0x40);DWORD forceFlags = *(DWORD*)((BYTE*)heap + 0x44);return (heapFlags & 2) || (forceFlags != 0); }
- 调试器通常会修改PEB中的Heap Flags和ForceFlags,以启用更严格的堆检查。在PEB中的
-
通过PEB中的StartupInfo检查调试器:
- PEB中的
StartupInfo
结构包含有关进程启动的详细信息。可以通过检查StartupInfo
中的特定字段来判断是否有调试器存在。
BOOL CheckStartupInfo() {PEB* peb = (PEB*)__readfsdword(0x30); // 获取PEB地址STARTUPINFO* startupInfo = &peb->ProcessParameters->StartupInfo;return startupInfo->dwFlags & STARTF_FORCEONFEEDBACK; // 检查特定标志 }
- PEB中的
示例crackMe
以下是反调试代码的反编译示例
if ( *((_DWORD *)NtCurrentPeb()->ProcessHeap + 3) != 2 )a2[v6] = 34;
if ( (NtCurrentPeb()->NtGlobalFlag & 0x70) != 0 )v12 = v10 + v11;
if ( (unsigned __int8)*(_DWORD *)&NtCurrentPeb()->BeingDebugged )
{v10 = -83;v11 = 43;
}
相关文章:
CTF-RE 从0到N: windows反调试-获取Process Environment Block(PEB)信息来检测调试
在Windows操作系统中,Process Environment Block (PEB,进程环境块) 是一个包含特定进程信息的数据结构。它可以被用于反调试中 如何获取PEB指针? 在Windows操作系统中,获取PEB指针的常见方法主要有以下几种。: 1. 使…...
STM32开发基础阶段复习
1.使用寄存器方式点亮LED灯的三个步骤是什么? 首先使能RCC_APB2ENR(外设时钟使能寄存器)对应的GPIO端口时钟,即给LED这个外设使能时钟。 配置对应GPIO端口,配置为通用推挽输出,输出速度可以选择最大。 将GPIO端口输…...
搜维尔科技:SenseGlove触觉反馈手套开箱+场景测试
搜维尔科技:SenseGlove触觉反馈手套开箱场景测试 SenseGlove触觉反馈手套开箱场景测试...

在k8s上部署Crunchy Postgres for Kubernetes
目录 一、前言二、安装Crunchy Postgres for Kubernetes三、部署一个简单的postgres集群四、增加pgbouncer五、数据备份六、备份恢复七、postgres配置参数七、数据导入 一、前言 Crunchy Postgres可以帮助我们在k8s上快速部署一个高可用、具有自动备份和恢复功能的postgres集群…...
大模型(LLMs)进阶篇
大模型(LLMs)进阶篇 一、什么是生成式大模型? 生成式大模型(一般简称大模型LLMs)是指能用于创作新内容,例如文本、图片、音频以及视频的一类深度学习模型。相比普通深度学习模型,主要有两点不…...

近几年新笔记本重装系统方法及一些注意事项
新笔记本怎么重装系统? 近几年的新笔记本默认开启了raid on模式或vmd选项,安装过程中会遇到问题,新笔记本电脑重装自带的系统建议采用u盘方式安装,默认新笔记本有bitlocker加密机制,如果采用一键重装系统或硬盘方式安装…...

小程序19-微信小程序的样式和组件介绍
在小程序中不能使用 HTML 标签,也就没有 DOM 和 BOM,CSS 也仅支持部分选择器 小程序提供了 WXML 进行页面结构的编写,WXSS 进行页面的样式编写 WXML 提供了 view、text、image、navigator等标签构建页面结构,小程序中标签称为组件…...

Chrome 浏览器开启打印模式
打开开发者工具ctrl shift p输入print 找到 Emulate CSS print media type...

Git回到某个分支的某次提交
1.切换到需要操作的分支(<branch-name>是分支名称)。 命令如下: git checkout <branch-name> 2.获取代码的提交记录 。命令如下: git log 按q退出当前命令对话。 获取到某次提交或者合并的hash值(下文…...

[前端面试]javascript
js数据类型 简单数据类型 null undefined string number boolean bigint 任意精度的大整数 symbol 创建唯一且不变的值,常用来表示对象属性的唯一标识 复杂数据类型 object,数组,函数,正则,日期等 区别 存储区别 简单数据类型因为其大小固定…...

对象的初步认识
#对象可组织数据(如统计数据的表格) 下以表格为例 1.设计一个表格:(None为初始值设定,表示无) class a; ##1None ##2None 2.创建一个表格 变量a 3.对对象的属性进行赋值 变量.##1"##" 变量.##2"##" 4.查询对象中…...

layui 输入框带清空图标、分词搜索、关键词高亮
https://andi.cn/page/621858.html...
Vue 3 + TypeScript: 类型安全的前端开发实践
引言 在现代前端开发中,TypeScript 已经成为提升代码质量和开发效率的重要工具。将 Vue 3 与 TypeScript 结合使用,能够为我们的项目带来更好的类型安全性和开发体验。 1. 项目配置 1.1 创建项目 使用 Vue CLI 创建支持 TypeScript 的 Vue 3 项目&am…...

Python爬虫知识体系-----requests-----持续更新
数据科学、数据分析、人工智能必备知识汇总-----Python爬虫-----持续更新:https://blog.csdn.net/grd_java/article/details/140574349 文章目录 一、安装和基本使用1. 安装2. 基本使用3. response常用属性 二、get请求三、post请求四、代理 一、安装和基本使用 1.…...
Swift的可选绑定(Optional binding)
在Swift中,有一种变量称为可选变量(Optional),具体说明见Swift初步入门。这种变量的值可以存在也可以为空(nil)。在Swift中,可以通过将if语句和赋值语句结合,有条件地展开࿰…...

硬石电机学习2024116
F4 概况 共模抑制线圈作用是滤波 LD3.3是将5v转为芯片用的3.3V CH340用于板子和电脑通讯 光耦隔离保护主控 16M的外部flash 1M的芯片内部的flash 10kHZ高速的光耦隔离,1M的低俗光耦隔离 F4 stm32概况 stm8和51都是一次可以运算处理8位的 32表示一次处理32位…...
行业类别-金融科技-子类别区块链技术-细分类别智能合约-应用场景供应链金融课题
1.大纲分析 针对题目“行业类别-金融科技-子类别区块链技术-细分类别智能合约-应用场景供应链金融课题”的大纲分析,以下是一个详细的结构: 一、引言 简述金融科技的发展背景与重要性引出区块链技术在金融科技中的应用强调智能合约作为区块链技术的重要细分类别提出供应链金…...
ElementPlus el-upload上传组件on-change只触发一次
ElementPlus el-upload上传组件on-change只触发一次 主要运用了:on-exceed方法 废话不多说,直接上代码 <el-uploadclass"avatar-uploader"action"":on-change"getFilesj":limit"1":auto-upload"false"accep…...

论文阅读:Uni-ISP Unifying the Learning of ISPs from Multiple Cameras
这是 ECCV 2024 的一篇文章,文章作者想建立一个统一的 ISP 模型,以实现在不同手机之间的自由切换。文章作者是香港中文大学的 xue tianfan 和 Gu jinwei 老师。 Abstract 现代端到端图像信号处理器(ISPs)能够学习从 RAW/XYZ 数据…...

AntD表单自定义组件
前言 表单可以说是前端最常见的一种组件,特别是在进行搜索的时候使用的最频繁,自定义表单组件,丰富了搜索框的类型,使数据展现的更灵活 内容讲解 1、官方介绍 AntD-Formhttps://ant.design/components/form-cn#form-demo-cust…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...

MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...