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: 

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

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

相关文章

深度剖析JDK 11全新特性:编程艺术的巅峰之作

欢迎来到我的博客,代码的世界里,每一行都是一个故事 深度剖析JDK 11全新特性:编程艺术的巅峰之作 前言字符串处理方法新增http client 的增强功能ZGC(低延迟垃圾回收器)的改进对Stream、Optional、集合API进行增强Stre…

Ps:矩形工具

使用矩形工具 Rectangle Tool可以绘制矩形形状(矢量形状,或者是基于像素的形状)和路径(形状轮廓)。 快捷键:U Ps 2021 年 3 月版开始删除了“圆角矩形工具”。现在可通过矩形工具的“圆角半径”选项以及画布…

【WPF.NET开发】WPF中的数据绑定

本文内容 什么是数据绑定数据绑定基本概念数据绑定的示例创建绑定数据转换绑定到集合数据模板化数据验证调试机制 Windows Presentation Foundation (WPF) 中的数据绑定为应用呈现数据并与数据交互提供了一种简单而一致的方法。 元素能够以 .NET 对象和 XML 的形式绑定到不同…

postgresql|数据库|LVM快照热备冷恢复数据库的思考

一, LVM快照备份的意义 数据库备份一直是数据库运维工作中的重点,一个完备的备份不仅仅是仅有后悔药的功能,还可能有迁移数据库的作用。 那么,数据库备份系统我们需要的,也就是看重的是四个点,甚至更多的…

金蝶云星空打开应用报错‘D:\WorkSpace\XXXX\XXXX_k3Cloud‘ is already locked.

文章目录 金蝶云星空打开应用报错D:\WorkSpace\XXXX\XXXX_k3Cloud is already locked.报错界面报错内容原因分析解决方案工作空间下清除项目Clean up应用下-清除SVN锁定 重新打开应用就可以了 金蝶云星空打开应用报错’D:\WorkSpace\XXXX\XXXX_k3Cloud’ is already locked. 报…

IMX6Q平台下双通道LVDS屏幕linux驱动设备树调试笔记

一、 LVDS简单理解 LVDS粗略了解 LVDS Low-Voltage Differential Signaling 低电压差分信号,属于平衡传输信号。这种技术的核心是采用极低的电压摆幅高速差动传输数据,从而有以下特点:低功耗—低误码率—低串扰—低抖动—低辐射 良好的信号…

【linux】用grep或者pgrep查找进程ID

一、用grep ps aux|grep 字符串|awk {print $2} 像上面这样运行,还会同时显示grep的进程ID。 需要再添加grep的反向查找命令,即查找不含有 "grep" 字段的行:grep -v grep。 ps aux | grep 字符串 | grep -v grep | awk {print …

2015年第四届数学建模国际赛小美赛A题飞机上的细长座椅解题全过程文档及程序

2015年第四届数学建模国际赛小美赛 A题 飞机上的细长座椅 原题再现: 航空公司座位是指在旅途中乘客可以乘坐的座位。一些航空公司现在推出了新的经济舱“超薄”座位。这些座椅除了重量较轻外,理论上还允许航空公司在不显著影响乘客舒适度的情况下增加运…

【Linux笔记】文件和目录操作

🍎个人博客:个人主页 🏆个人专栏:Linux学习 ⛳️ 功不唐捐,玉汝于成 目录 前言 命令 ls (List): pwd (Print Working Directory): cp (Copy): mv (Move): rm (Remove): 结语 我的其他博客 前言 学习Linux命令…

JavaOOP篇----第十三篇

系列文章目录 文章目录 系列文章目录前言一、普通类与抽象类有什么区别?二、什么是接口?为什么需要接口?三、接口有什么特点?四、抽象类和接口的区别?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章…

在Windows11下安装完Ubuntu20.04双系统后屏幕亮度无法调节的问题

网络中常用的解决方式 第一种 sudo add-apt-repository ppa:apandada1/brightness-controller sudo apt-get update sudo apt-get install brightness-controller-simple ubuntu20.04屏幕亮度无法调节(亮度条调节无效)的简单靠谱解决方案及踩坑历程 …

核心订单链路兜底方案之限流熔断降级实战

需求场景 对于很多电商系统而言,在诸如双十一这样的大流量的迅猛冲击下,都曾经或多或少发生过宕机的情况。当一个系统面临持续的大流量时,它其实很难单靠自身调整来恢复状态,你必须等待流量自然下降或者人为地把流量切走才行&…

Linux文件操作命令@touch、cat、more、cp、mv、rm

目录 命令touch语法形式作用 命令cat语法形式作用 命令more语法形式作用 命令cp语法形式作用复制文件复制文件夹 命令mv语法形式作用移动文件移动文件夹情况三 命令rm语法形式作用删除文件删除文件夹-f 选项通配符 * 总结 命令touch 语法形式 touch Linux路径 》touch命令无…

使用Guava轻松创建和管理不可变集合

第1章:引言 大家好,我是小黑。今天,我们来聊聊一个在Java编程里超有用的话题:使用Guava创建和管理不可变集合。首先,咱们得明白,什么是不可变集合。简单来说,不可变集合就是一旦创建就不能被修…

STL体系结构概述

文章目录 STL是什么?STL的六大组件STL的实现版本额外补充一、容器范围区间二、容器结构与分类序列式容器关联容器有序关联容器不定序关联容器 参考 本文将是STL系列的第一篇文章,主要参考《STL源码剖析》,辅以网络博文,不定时更新…

DevC++ easyx实现图片拖动,一种悬浮窗实现原理与完整代码

翻出来之前写的代码, EasyxDevC开发地图编辑和游戏编辑代码工程文件附注释_哔哩哔哩_bilibili 每次把代码备份下来,等着有一天能够复用代码,产生新的价值。 结果最近这几天才来回顾记录emm “这是怎么搓出来的?”从10行代码到…

代码审查工具FishEye详细使用教程

1. Git代码仓库设置 1、登录并进入到FishEye主页面,点击Repositories进入仓库管理页面,如下图: 2、填写仓库信息,如下图: 3、填写Git地址 http://gitAccount:gitPwd118.24.231.166:8080/git/git/iot-lvdao/iot-dhcc.…

【小黑嵌入式系统第十二课】μC/OS-III程序设计基础(二)——系统函数使用场合、时间管理、临界区管理、使用规则、互斥信号量

上一课: 【小黑嵌入式系统第十一课】μC/OS-III程序设计基础(一)——任务设计、任务管理(创建&基本状态&内部任务)、任务调度、系统函数 文章目录 一、系统函数使用场合1.1 时间管理1.1.1 控制任务的执行周期1…

自动生成数控加工的轨迹刀具轨迹阿基米德螺旋线(3D)

文章目录 1. 阿基米德螺旋线2. 生成步骤目标: 基于点云自动生成阿基米德螺旋线轨迹点 针对的是半球形模型效果 1. 阿基米德螺旋线 阿基米德螺旋线(Archimedean spiral)是一种数学曲线,由古希腊数学家阿基米德(Archimedes)在公元前225年左右首次研究和描述。这条曲线的方…

如何实现酷狗音乐pc页面点击播放时,打开多个歌曲播放时,始终在一个播放页面,(标签页的通讯)

大致有两种思路, 一种是通过wind.open()方法传第二个参数, A页面: //点击跳转播放页函数function toPlayPage(){window.open(path/xxxx/xxxx?name音乐名,music)//第二个参数写一个定值,代表跳转页面都为music标签页&#xff0…