windows下的反调试探究——原理

原理

我们在前面介绍了一些反调试的手段,基本上都是通过对内核的某个标志进行修改来达到反调试的效果,但是这里有一个问题就是,如果分析人员对我们的样本的API进行了hook,那么我们的反调试手段都将作废,也就是说我们还是要深入底层去探究调试器与被调试器直接究竟是如何建立连接的,只有了解了原理,我们才能更加得心应手的进行对抗

在windows里面,每个程序的低2G是独立使用的,高2G(内核)区域是共用的。那么我们假设一个场景,我们的3环调试器要想和被调试程序之间建立通信肯定就需要涉及到进程间的通信以及数据的交换,如果这个过程放在3环完成,不停的进程通信会很繁琐,所以windows选择将这个过程放在0环进行。调试器与被调试程序之间只能通过CreateProcessDebugActiveProcess这两个API建立起连接,这里我们探究DebugActiveProcess是如何建立起两者之间的连接的

与调试器建立连接

首先看一下DebugActiveProcess

调用ntdll.dllDbgUiConnectToDbg

再调用ZwCreateDebugObject

通过调用号进入0环

进入0环创建DEBUG_OBJECT结构体

然后到ntoskrnl里面看一下NtCreateDebugObject

然后调用了ObInsertObject创建DebugObject结构返回句柄

再回到ntdll.dll,当前线程回0环创建了一个DebugObject结构,返回句柄到3环存放在了TEB的0xF24偏移处

也就是说,遍历TEB的0xF24偏移的地方,如果有值则一定是调试器

与被调试程序建立连接

还是回到kernel32.dllDebugActiveProcess,获取句柄之后调用了DbgUiDebugActiveProcess

调用ntdll.dllDbgUiDebugActiveProcess

跟到ntdll.dll里面的DbgUiDebugActiveProcess,传入两个参数,分别为调试器的句柄和被调试进程的句柄

通过调用号进0环

来到0环的NtDebugActiveProcess, 第一个参数为被调试对象的句柄,第二个参数为调试器的句柄

执行ObReferenceObjectByHandle,把被调试进程的句柄放到第五个参数里面,这里eax本来存储的是调试器的EPROCESS,执行完之后eax存储的就是被调试进程的EPROCESS

这里判断调试器打开的进程是否是自己,如果是自己则直接退出

也不能调试系统初始化的进程

然后获取调试对象的地址,之前是句柄,但是句柄在0环里面是无效的,这里就要找真正的地址

获取到调试对象的地址之后还是存到ebp+Process的地方,这里之前是被调试对象的地址,现在存储的是调试对象的地址

将调试进程和被调试的PEPROCESS传入_DbgkpSetProcessDebugObject,将调试对象和被调试进程关联起来

跟进函数,发现有判断DebugPort是否为0的操作,ebx为0,edi为被调试进程的EPROCESS,那么edi+0bc就是调试端口

然后再把调试对象的句柄放到被调试对象的DebugPort里面

调试事件

调试事件是在调试过程中导致系统通知调试器的事件,调试事件包括创建进程、创建线程、加载动态链接库 (DLL) 、卸载 DLL、发送输出字符串和生成异常。我们知道调试器和被调试程序的通信主要依赖于0环的_DEBUG_OBJECT结构,然后被调试程序在进行操作时(如:创建进程线程、加载dll)等,就会将一个调试事件写入到_DEBUG_OBJECT结构里面,调试器获得句柄即可进行调试

这里就会使用调试事件采集函数来对调试事件进行写入,调试器在被调试进程进行特定操作的必经之路中调试事件采集函数,必经之路分为5条,其中以Dbgk开头的函数为调试事件采集函数,所有调试事件采集函数最终都会调用DbgkpSendApiMessage将封装好的调试事件结构体写入到链表当中。DbgkSendApiMessage有两个参数,第一个参数为调试事件类型,第二个参数为是否挂起其它线程,有时需要,比如0xCC,有时不需要,比如模块加载。

例如创建进程、线程必经之路:

退出线程、进程必经之路:

我们跟一下PspExitThread,首先在PspExitThread里面判断Debugport是否为0,如果为0则不处于调试状态就不会跳转,如果不为0则为调试状态则跳转到loc_52E3AC

然后这里有个判断,如果当前线程是最后一个线程则跳转到DbgkExitProcess退出进程,如果不是最后一个线程则跳转到DbgkExitThread退出当前线程

这里我们跟DbgkExitProcess,这里调用了DbgkpSendApiMessage,这个函数的作用就是将被调试程序发送过来的调试事件挂入_DEBUG_OBJECT

这里继续跟进去,如果不挂起进程则用DbgkpQueueMessage收集调试事件的有关信息

跟进DbgkpQueueMessage可以看到最终通过DebugPort得到被调试程序的_DEBUG_OBJECT的地址

这里继续往下走,通过链表操作添加调试事件信息

总结

首先调试器进程先创建一个_DEBUG_OBJECT结构放到TEB0xF24处,存储的是_DEBUG_OBJECT结构的句柄,然后在被调试程序EPROCESSDebugPort的地方存储_DEBUG_OBJECT结构的地址,然后通过调用DbgkpSendApiMessage进行调试事件的采集,把句柄放到_DEBUG_OBJECT结构,供调试器使用

那么了解了调试器和被调试器之间如何建立连接,我们就可以通过以下几种方式来进行反调试

1.不断将EPROCESSDebugPort清零,使调试器不能够和被调试程序建立连接

2.遍历每个线程TEB0xF24,如果存在值就证明有调试器

3.要想建立连接必须要在0环创建_DEBUG_OBJECT结构,使用NtCreateDebugObject,直接hook NtCreateDebugObject达到监控的效果

4.被调试进程必须通过DbgkpSendApiMessage将调试事件放入_DEBUG_OBJECT结构供调试器使用,那么这里就可以直接hook 对应的调试事件,如创建进程就hook DbgkCreateThread,也可以直接hook DbgkpSendApiMessage达到监控所有调试事件的效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/429989.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode】升级打怪之路 Day 13:优先级队列的应用

今日题目: 23. 合并 K 个升序链表 | LeetCode378. 有序矩阵中第 K 小的元素 | LeetCode373. 查找和最小的 K 对数字 | LeetCode703. 数据流中的第 K 大元素 | LeetCode347. 前 K 个高频元素 | LeetCode 目录 Problem 1:合并多个有序链表 【classic】LC 2…

2核4G服务器支持多少人在线?腾讯云全访问测试

腾讯云轻量应用服务器2核4G5M配置一年优惠价165元、252元15个月、三年756元,100%CPU性能,5M带宽下载速度640KB/秒,60GB SSD系统盘,月流量500GB,折合每天16.6GB流量,超出月流量包的流量按照0.8元每GB的价格支…

WSL2安装Ubuntu18.04到指定路径(非C盘)

1 系统设置开启WSL 1.1 在搜索框搜索“启动或关闭Windows功能”或在“控制面板”->“程序”->“启用或关闭 windows 功能” 开启 Windows 虚拟化和 Linux 子系统(WSL2)以及Hyper-V 按照提示重启计算机,开启WSL。 2 将WSL2 设置为默认版本 wsl --se…

Mysql删除重复项:力扣196. 删除重复的电子邮箱

题目链接:196. 删除重复的电子邮箱 - 力扣(LeetCode) 题目描述 sql语句 # Write your MySQL query statement below delete a from person as a inner join person as b where a.email b.email and a.id > b.id 思路:内连接…

MySQL NDB Cluster 分布式架构搭建 自定义启动、重启和关闭集群Shell脚本

此次NDB Cluster使用三台虚拟机进行搭建,一台作为管理节点;而对于另外两台服务器,每一台都充当着数据节点和SQL节点的角色。注意不是MGR主从复制架构,而是分布式MySQL架构。 创建 /var/lib/mysql-cluster/config.ini Cluster全局…

uipath调用python代码获取网站验证码

用uipath自带的ocr读验证码不是很准确,选择调用python读验证码,需要导入ddddocr(3.8以下版本支持ddddocr) 用uipath程序将验证码图片保存到本地(也可以直接用python处理图片,保存到本地比较简单&#xff0…

xss.haozi.me:0X0D

alert(1) -> 记住要回车一下-->是js的一个注释符但是只能用在最前面前面有一个空格都不行

C++:String的模拟实现

模拟实现的节奏比较快,大家可以先去看看博主的关于string的使用,然后再来看这里的模拟实现过程 C:String类的使用-CSDN博客 String模拟实现大致框架迭代器以及迭代器的获取(public定义,要有可读可写的也要有可读不可写…

基于springboot+vue的医院药品管理系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

【Android】源码解析 Activity 的构成

本文是基于 Android 14 的源码解析。 当我们写 Activity 时会调用 setContentView() 方法来加载布局。现在来看看 setContentView() 方法是怎么实现的,源码如下所示: 路径:/frameworks/base/core/java/android/app/Activity.javapublic void…

Linux中服务端开发

1 创建socket,返回一个文件描述符lfd---socket(); 2 将lfd和IP,PROT进行绑定---bind(); 3 将lfd由主动变成被动监听---listen(); 4 接收一个新的连接,得到一个的文件描述符cfd--accept() --该文件描述符用于与客户端通信 5 while(1) { 接受数据&a…

【扩散模型系列3】DiT开源项目

文章目录 DiT原始项目Fast-DiT readmeSamplingTraining训练之前的准备训练DiTPyTorch 训练结果改进训练效果 Evaluation (FID, Inception Score, etc.) 总结 DiT原始项目 该项目仅针对DiT训练,并未包含VAE 的训练 项目地址 论文主页 Fast-DiT readme 该项目仅针…

性能优化篇(七) UI优化注意事项以及使用Sprite Atlas打包精灵图集

UI优化注意事项 1.尽量避免使用IMGUI(OnGUI)来做游戏时的UI,因为IMGUI的开销比较大。 2.如果一个UGUI的控件不需要进行射线检测,则可以取消勾选Raycast Target 3.尽量避免使用完全透明的图片和UI控件。因为即使完全透明,我们看不见它&#xf…

论文笔记:Code Llama: Open Foundation Models for Code

导语 Code Llama是开源模型Llama 2在代码领域的一个专有模型,作者通过在代码数据集上进行进一步训练得到了了适用于该领域的专有模型,并在测试基准中超过了同等参数规模的其他公开模型。 链接:https://arxiv.org/abs/2308.12950机构&#x…

[cg] Games 202 - NPR 非真实感渲染

NPR特性(基于真实感渲染) 真实感--》翻译成非真实感的过程 NPR风格 需要转换为渲染中的操作 1.描边 B-->普通边界(不是下面几种的) C-->折痕 M-->材质边界 S-->需要在物体外面一圈上,并且是多个面共享…

win11部署自己的privateGpt(2024-0304)

什么是privateGpt? privategpt开源项目地址 https://github.com/imartinez/privateGPT/tree/main 官方文档 https://docs.privategpt.dev/overview/welcome/welcome PrivateGPT是一个可投入生产的人工智能项目,利用大型语言模型(LLMs)的…

流行 NFT 的必备指南

​作者:stellafootprint.network 编译:mingfootprint.network 来源:Footprint Analytics Blog 随着爱好者们对 NFT 的兴趣不断高涨,Footprint Analytics 发布了一系列文章,重点介绍各种热门 NFT 系列。这些文章深入…

GBU808-ASEMI整流桥GBU808参数、封装、尺寸

编辑:ll GBU808-ASEMI整流桥GBU808参数、封装、尺寸 型号:GBU808 品牌:ASEMI 封装:GBU-4 最大重复峰值反向电压:800V 最大正向平均整流电流(Vdss):8A 功率(Pd):中小功率 芯片个数&#…

【网站项目】075学生信息管理系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

xss.haozi.me:0x0B

<svg><script>(1)</script>