软件调试学习笔记(一)—— 调试对象
软件调试学习笔记(一)—— 调试对象
- 准备工作
- 调试器与被调试程序
- DebugActiveProcess
- 连接调试器
- 分析kernel32!DebugActiveProcess
- 分析ntdll!DbgUiConnectToDbg
- 连接被调试进程
- 分析kernel32!DebugActiveProcess
- 分析ntdll!DbgUiDebugActiveProcess
- 分析nt!NtDebugActiveProcess
- 分析nt!DbgkpSetProcessDebugObject
- DebugObject
准备工作
三个系统文件:
- kernel32.dll
- ntdll.dll
- ntoskrnl.exe
Windows源码(有其中一份就行):
- ReactOS
- WRK
调试器与被调试程序
描述:调试器拥有自己的用户层,被调试程序也拥有自己的用户层,因此调试器与被调试程序必定通过某种方式连接到一起,才能够进行通信。
调试器与被调试对象建立联系的方式:
- CreateProcess(创建进程)
- DebugActiveProcess(附加进程)
本节主要围绕附加进程进行学习。
DebugActiveProcess
调试器执行流程:
kernel32!DebugActiveProcess()
↓
kernel32!DbgUiConnectToDbg()
↓
ntdll!DbgUiConnectToDbg()
↓
ntdll!ZwCreateDebugObject()
↓
nt!NtCreateDebugObject()
被调试进程执行流程:
kernel32!DebugActiveProcess()
↓
kernel32!DbgUiDebugActiveProcess(被调试进程句柄)
↓
ntdll!DbgUiDebugActiveProcess(被调试进程句柄)
↓
ntdll!NtDebugActiveProcess(被调试进程句柄,调试器进程TEB+0xF24)
↓
nt!NtDebugActiveProcess(HANDLE ProcessHandle, HANDLE DebugObjectHandle)
↓
nt!DbgkpSetProcessDebugObject 把调试对象和被调试进程关联起来
连接调试器
分析kernel32!DebugActiveProcess
分析ntdll!DbgUiConnectToDbg
CreateDebugObject的目的是创建一个DebugObject对象,并存放在TEB(0xF24)。
CreateDebugObject真正的实现位于nt!NtCreateDebugObject。
连接被调试进程
分析kernel32!DebugActiveProcess
分析ntdll!DbgUiDebugActiveProcess
NtDebugActiveProcess的实现位于nt!NtDebugActiveProcess
分析nt!NtDebugActiveProcess
分析nt!DbgkpSetProcessDebugObject
DebugObject
描述:
- 调试器在调试进程时调用DebugActiveProcess与被调试程序建立连接。
- DebugActiveProcess首先在0环创建一个DEBUG_OBJECT结构体作为调试进程与被调试进程建立连接的桥梁。
- DEBUG_OBJECT结构体的句柄存放在TEB +0xF24的位置(3环只能存放句柄)
- DEBUG_OBJECT的地址存放在被调试进程的EPROCESS.DebugPort中(0环可以存放地址)。
- DEBUG_OBJECT的本质是桥。
结构体:
//From ReactOS v3.12
typedef struct _DEBUG_OBJECT
{KEVENT EventsPresent;FAST_MUTEX Mutex;LIST_ENTRY EventList;union{ULONG Flags;struct{UCHAR DebuggerInactive:1;UCHAR KillProcessOnExit:1;};};
} DEBUG_OBJECT, *PDEBUG_OBJECT;
软件调试学习笔记(一)—— 调试对象相关推荐
- 软件调试学习笔记(三)—— 调试事件的处理
软件调试学习笔记(三)-- 调试事件的处理 要点回顾 调试事件的处理 实验一:实现简单调试器(创建进程) 实验二:分析异常来源 实验三:实现简单调试器(附加进程) 实验四:分析NtDebugActiv ...
- 软件调试学习笔记(二)—— 调试事件的采集
软件调试学习笔记(二)-- 调试事件的采集 要点回顾 调试事件的种类 调试事件采集函数 例:分析PspUserThreadStartup 例:分析PspExitThread 总结 要点回顾 调试器与被 ...
- 软件调试学习笔记(七)—— 单步步入单步步过
软件调试学习笔记(七)-- 单步步入&单步步过 单步步入 设置单步异常 处理单步异常 实验1:单步异常的设置与处理 单步步过 实现思路 实验2:实现单步步过 单步步入 描述: 单步步入的实现依 ...
- 软件调试学习笔记(六)—— 硬件断点
软件调试学习笔记(六)-- 硬件断点 硬件断点 设置硬件断点 触发硬件断点 处理硬件断点 实验:硬件断点的设置与处理 硬件断点 描述: 与软件断点与内存断点不同,硬件断点不依赖被调试程序,而是依赖于C ...
- 软件调试学习笔记(五)—— 软件断点内存断点
软件调试学习笔记(五)-- 软件断点&内存断点 调试的本质 软件断点 软件断点的执行流程 分析INT 3执行流程 实验:处理软件断点 内存断点 内存断点的执行流程 实验:处理内存断点 调试的本 ...
- 软件调试学习笔记(四)—— 异常的处理流程
软件调试学习笔记(四)-- 异常的处理流程 要点回顾 异常的处理流程 实验1:理解调试器与异常的关系 未处理异常:最后一道防线 实验2:理解UnhandledExceptionFilter执行流程 实 ...
- 【软考中级】软件设计师学习笔记
软件设计师学习笔记 计算机系统知识 程序语言设计 数据结构 操作系统 软件工程基础知识 结构化开发方法 创建型设计模式 行为型设计模式 结构型设计模式: 算法设计与分析 数据库技术基础 网络与信息安全 ...
- 软件设计模式学习笔记(七)
软件设计模式学习笔记(七) 结构型模式 1. 组合模式 1.1 概述 对于这个图片肯定会非常熟悉,上图我们可以看做是一个文件系统,对于这样的结构我们称之为树形结构.在树形结构中可以通过调用某个方法 ...
- 软件设计模式学习笔记(三)
软件设计模式学习笔记(三) 1. 工厂设计模式 1.1 概述 需求:设计一个咖啡店点餐系统. 设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡[AmericanCoffee]和拿铁咖啡[La ...
最新文章
- js 对象的clone()函数
- JGG:微生物组学专刊(赵方庆、白洋、张志刚、王军、郑钜圣、魏泓、沈伟、刘永鑫等)...
- 引领深度学习潮流,刷屏计算机视觉顶会,揭秘商汤研究梦之队
- dependency报红_解决IDEA中Maven依赖包导入失败报红问题(总结最有效8种解决方案)...
- 假如我们等不到对的人,就趁孤单让自己优秀起来。单身是最好的升值期
- php什么是同源策略,javascript - 绕过同源策略的方法
- autocad字体ccfang_cad替换字体(cad找不到字体怎么替换)
- RocksDB调优指南
- 安卓手机管理软件_电话录音管理软件有哪些?
- 开源系统的选择-比较全面的各类开源应用系统列表
- 阿里巴巴国际站新手运营攻略
- 利用计算机建立动画中的 画面 由,计算机图形术在三维动画中的应用.doc
- From double Click to Main: PAL initialization
- FANUC机器人:奇异点回避功能介绍与使用方法
- c语言中 三个点 是什么,这是什么…(三个点)在c中意味着什么
- 2022-2027年中国基金行业市场全景评估及发展战略规划报告
- 新入职百度某员工发飙:前人代码写得像一坨屎,不能忍受,颠覆了对大厂的认知,...
- 中兴Blade V2021 5G 刷机root教程 ZTE 8012N root 线刷包下载TWRP 刷入
- 敏捷考证?你应该知道的敏捷体系认证名单(最全整理)
- Cocos Creator 3D后期效果解决方案源码剖析--从入门到融汇贯通
热门文章
- AI公开课:19.05.16漆远-蚂蚁金服集团CF《金融智能的深度与温度》课堂笔记以及个人感悟—191017再次更新
- ML之SVM:利用Js语言设计SVM算法(SMO算法+线性核/高斯核)
- ML/DL之预测分析类:利用机器学习算法进行预测分析的简介、分析、代码实现之详细攻略
- JAVA_OA管理系统(四)番外篇:使用Spring注解注入属性
- 《疯狂Java讲义》4
- docker-compose 部署elk+解决时间不对导致kibana找不到logstash定义的index + docker-compose安装...
- 云时代架构--阅读笔记03
- Centos-挂载和卸载分区-mount
- sql语句的学习(2)
- ubuntu 安装sun-java5-jdk