49.网游逆向分析与插件开发-游戏反调试功能的实现-软件调试器设计的基本原理

图0: 下方是一个简化过的代码

做一个软件调试器最基本的是,首先要调试一个进程那么就要有一个进程

拿x96dbg来讲调试一个进程有两种方式,第一种通过附加(如图1),通过附加可以对已经创建的进程进行调试,第二种通过打开(如图2)创建一个进程对它进行调试,图0里的代码也有体现,创建一个进程CreateProcess函数,另外一种DebugActiveProcess函数,需要提供任务管理器里的进程id。如图3

打开或附近进程成功的话:

就有一个类似Windows消息循环,如图4,就是首先给它传递一个结构体(DEBUG_EVENT),然后通过WaitForDebugEvent(等待调试时间的函数)只要有调试事件我们就能收到,然后通过消息里的dbgevent.dwDebugEventCode就能够处理了,它会有模块的加载,下个断点给我们回馈等,DEBUG_EVENT里的内容很丰富,也就是调试器与被调试进程通过 图4 的代码给衔接起来了,它们是通过Windows消息机制来传递的。

以上就是一个调试器最核心的地方,知道这些东西之后,再分析CreateProcess是怎样达成一个调试的状态的。

CreateProcess里有一个dwCreationFlags 进程创建标志位,它的取值很多,需要去看微软提供的文档,跟调试器有关了有两个,DEBUG_PROCESS、DEVUG_ONLY_THIS_PROCESS

DEBUG_PROCESS说明:

得到调试进程的权限并且可以调试它的子进程

DEVUG_ONLY_THIS_PROCESS:

只能调试当前进程

然后 CreateProcess 创建被调试进程的底层函数:

DbgUiConnectToDbg:

调试器进程与调试器子系统建立链接,意思是调试它是通过一套复杂的系统来完成的,涉及到消息的传递、管理等,早期操作系统是通过smss.exe 或 crss.exe去完成的,它怎样建立链接的,它是先创建一个DEBUG_OBJECT类型的内核对象(在Windows2000或Windows2000以前的时候不是),然后把内核对象保存到线程环境里TEB结构里有一个DbgSsReserved[1](Windows2000会保存到0和1两个位置),这个对象是保存在调试进程里的,不是被调试进程里,这时被调试进程还没被创建

NtCreateProcess() 或 NtCreateProcessEx()

创建进程,首先内核里有一个进程管理器,需要把 DbgSsReserved[1] 传递给内核进程管理器,然后调用内核里的PsCreateProcess函数把 DbgSsReserved 这个字段传递给EPROCESS结构里的DebugPort字段,然后创建进程的函数(PsCreateProcess)调用MmCreatePeb创建进程PEB(3环进程结构或者说是用户层的进程结构这里有peb结构怎样去找,以及通过peb结构找模块链的例子)数据,MmCreatePeb函数会根据DebugProt的值,它的值不被调试的时候一定是0,被调试的时候一定是有内容的,如果为0,PEB结构下的BeingDebugged字段的值等于0,DebugProt的值有内容BeingDebugged字段的值就为1

EPROCESS结构说明:https://note.youdao.com/s/Qp1hET5X

 特征:

进程一但被调试,它的两大特征是DebugPort字段在内核下一定是有内容的,在应用态下PEB里的BeingDebugged是由内容的,它的依赖就是着一系列路径上用到的函数

接下俩再说对现有进程做调试的:

首先第一步还是跟调试子系统建立链接,接下来因为给它传的是一个进程id,进程id要转换成内核对象句柄,所以这时就会调用OpenProcess,然后OpenProcess再调用底层的NtOpenProcess来得到句柄,得到句柄以后然后设置它进程的调试状态,这时就利用DbgUiDebugActiveProcess函数来得到它的PPROCESS结构,再根据DbgkpSetProcessDebugObject函数将DebugProt建立链接,然后再通过DbgkpMarkProcessPeb来设置调试进程的BeingDebuggged

特征:

两种方法归根到底,都是设置DebugProt、BeingDebuggged这俩字段

结论:

一个进程被调试,内核状态下EPROCESS结构的DebugProt一定不为0

用户态模式下PEB结构的BeingDebuged一定不为0

图1:

图2:

图3:

图4: 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

条款7:为多态基类声明虚析构函数

文章目录 虚析构函数声明虚析构函数的情况继承的情况总结 虚析构函数 纪录时间的方法很多,合理的做法是创建一个基类,并为不同的计时方法创建派生类: class TimeKeeper { public:TimeKeeper();~TimeKeeper();... }; class AtomicClock : public TimeKee…

RobotMaster学习——工序导入,参数设置,轨迹生成

目录 引出1.导入工序2.修改刀具其他刀具参数 3.进行工序分配4.设置TCP5.设置工作站6.工序整体导入配置7.进行计算 总结 引出 RobotMaster的操作流程,从导入工序到生产轨迹。 1.导入工序 2.修改刀具 要选择第七把刀具 其他刀具参数 第一把刀具 第二把刀具 第三把刀…

增量式旋转编码器在STM32平台上的应用

背景 旋钮是仪器仪表上一种常见的输入设备,它的内部是一个旋转编码器,知乎上的这篇科普文章对其工作原理做了深入浅出的介绍。 我们公司的功率分析仪的前面板也用到了该类设备,最近前面板的MCU从MSP430切换成了STM32,因此我要将…

linux运维的面试题一

1.linux启动过程 1加电 2加载主板bios设置 3加载多重操作系统启动管理器grub 4加载内核系统到内存当中 5加载配置文件 6加载内核模块 7完成相应的初始化工作和启动相应的服务 8启动系统进程 9出现登录界面 10开机启动完成 2.安装过操作系统吗?怎么安装? 1.小批量设…

Vue+ElementUI+nodejs学生宿舍报修管理系统68ozj

本站是一个B/S模式系统,采用vue框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得学生宿舍信息管理系统管理工作系统化、规范化。本系统的使用使管理人员从繁重的工作中…

nodejs+vue+ElementUi美发店理发店管理系统q9xc1

本站是一个B/S模式系统,采用vue框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得美发门店管理系统管理工作系统化、规范化。本系统的使用使管理人员从繁重的工作中解脱…

淘宝商品评论API:电商行业的战略资源与制胜之道

在电商行业,数据是金。而其中,用户评论数据更是无价之宝。它不仅仅反映了商品的质量和卖家的服务态度,更是消费者在决策时的关键参考。正因如此,获得淘宝商品评论API的重要性不言而喻。 一、数据背后的无尽宝藏 淘宝,…

MyBatis的动态SQL!!!

一.if和where的使用。 1.首先在UserMapper接口中声明一个方法&#xff1a; package com.by.mapper;import com.by.pojo.User;import java.util.List;/*** <p>Project: mybatis - UserMapper</p>* <p>Powered by scl On 2023-12-22 15:52:05</p>* <…

纯搬运 solidworks 2021卸载方法,怎么完全彻底卸载删除清理干净solidworks 2021各种残留注册表和文件?

纯搬运 solidworks 2021卸载方法&#xff0c;怎么完全彻底卸载删除清理干净solidworks 2021各种残留注册表和文件&#xff1f; 网址&#xff1a; solidworks 2021卸载方法&#xff0c;怎么完全彻底卸载删除清理干净solidworks 2021各种残留注册表和文件&#xff1f; solidworks…

推荐给前端开发的 5 款 Chrome 扩展

工欲善其事&#xff0c;必先利其器。Chrome 可能是前端开发中使用最多的浏览器。在日常开发中&#xff0c;下列几款 Chrome 扩展也许能让你的开发工作事半功倍 &#x1f680; Vue.js devtools ⚙️ vue 官方专为 vue 应用开发的调试工具。 通过使用它&#xff0c;你可以快速查看…

Iceberg:ZOrder的实现及执行流程分析

ZOrder简介 使用Z-Order索引&#xff0c;可以按任意维度对数据进行排序&#xff0c;以获得更加高效且均衡地范围查询。它即可以作为一级索引&#xff0c;直接影响底层数据组织形式&#xff0c;甚至可以取代二索引&#xff08;更加节省内存&#xff0c;吞吐量也理更高&#xff…

SUSE Linux服务器使用zypper安装nginx

SUSE Linux 的云服务器用户&#xff0c;不能yum,安装软件&#xff0c;可通过 zypper 快速安装软件。 使用 root 账号登录 openSUSE 操作系统的云服务器。 执行 zypper service-list 或 zypper sl 命令 列出软件源 安装软件包 执行 zypper search 或 zypper se 命令&#…