软件调试学习笔记(一)—— 调试对象

  • 准备工作
  • 调试器与被调试程序
  • DebugActiveProcess
    • 连接调试器
      • 分析kernel32!DebugActiveProcess
      • 分析ntdll!DbgUiConnectToDbg
    • 连接被调试进程
      • 分析kernel32!DebugActiveProcess
      • 分析ntdll!DbgUiDebugActiveProcess
      • 分析nt!NtDebugActiveProcess
      • 分析nt!DbgkpSetProcessDebugObject
  • DebugObject

准备工作

三个系统文件

  1. kernel32.dll
  2. ntdll.dll
  3. ntoskrnl.exe

Windows源码(有其中一份就行)

  1. ReactOS
  2. WRK

调试器与被调试程序

描述:调试器拥有自己的用户层,被调试程序也拥有自己的用户层,因此调试器与被调试程序必定通过某种方式连接到一起,才能够进行通信。

调试器与被调试对象建立联系的方式

  1. CreateProcess(创建进程)
  2. 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

描述

  1. 调试器在调试进程时调用DebugActiveProcess与被调试程序建立连接。
  2. DebugActiveProcess首先在0环创建一个DEBUG_OBJECT结构体作为调试进程与被调试进程建立连接的桥梁。
  3. DEBUG_OBJECT结构体的句柄存放在TEB +0xF24的位置(3环只能存放句柄)
  4. DEBUG_OBJECT地址存放在被调试进程的EPROCESS.DebugPort中(0环可以存放地址)。
  5. 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;

软件调试学习笔记(一)—— 调试对象相关推荐

  1. 软件调试学习笔记(三)—— 调试事件的处理

    软件调试学习笔记(三)-- 调试事件的处理 要点回顾 调试事件的处理 实验一:实现简单调试器(创建进程) 实验二:分析异常来源 实验三:实现简单调试器(附加进程) 实验四:分析NtDebugActiv ...

  2. 软件调试学习笔记(二)—— 调试事件的采集

    软件调试学习笔记(二)-- 调试事件的采集 要点回顾 调试事件的种类 调试事件采集函数 例:分析PspUserThreadStartup 例:分析PspExitThread 总结 要点回顾 调试器与被 ...

  3. 软件调试学习笔记(七)—— 单步步入单步步过

    软件调试学习笔记(七)-- 单步步入&单步步过 单步步入 设置单步异常 处理单步异常 实验1:单步异常的设置与处理 单步步过 实现思路 实验2:实现单步步过 单步步入 描述: 单步步入的实现依 ...

  4. 软件调试学习笔记(六)—— 硬件断点

    软件调试学习笔记(六)-- 硬件断点 硬件断点 设置硬件断点 触发硬件断点 处理硬件断点 实验:硬件断点的设置与处理 硬件断点 描述: 与软件断点与内存断点不同,硬件断点不依赖被调试程序,而是依赖于C ...

  5. 软件调试学习笔记(五)—— 软件断点内存断点

    软件调试学习笔记(五)-- 软件断点&内存断点 调试的本质 软件断点 软件断点的执行流程 分析INT 3执行流程 实验:处理软件断点 内存断点 内存断点的执行流程 实验:处理内存断点 调试的本 ...

  6. 软件调试学习笔记(四)—— 异常的处理流程

    软件调试学习笔记(四)-- 异常的处理流程 要点回顾 异常的处理流程 实验1:理解调试器与异常的关系 未处理异常:最后一道防线 实验2:理解UnhandledExceptionFilter执行流程 实 ...

  7. 【软考中级】软件设计师学习笔记

    软件设计师学习笔记 计算机系统知识 程序语言设计 数据结构 操作系统 软件工程基础知识 结构化开发方法 创建型设计模式 行为型设计模式 结构型设计模式: 算法设计与分析 数据库技术基础 网络与信息安全 ...

  8. 软件设计模式学习笔记(七)

    软件设计模式学习笔记(七) 结构型模式 1. 组合模式 1.1 概述 ​ 对于这个图片肯定会非常熟悉,上图我们可以看做是一个文件系统,对于这样的结构我们称之为树形结构.在树形结构中可以通过调用某个方法 ...

  9. 软件设计模式学习笔记(三)

    软件设计模式学习笔记(三) 1. 工厂设计模式 1.1 概述 需求:设计一个咖啡店点餐系统. 设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡[AmericanCoffee]和拿铁咖啡[La ...

最新文章

  1. js 对象的clone()函数
  2. JGG:微生物组学专刊(赵方庆、白洋、张志刚、王军、郑钜圣、魏泓、沈伟、刘永鑫等)...
  3. 引领深度学习潮流,刷屏计算机视觉顶会,揭秘商汤研究梦之队
  4. dependency报红_解决IDEA中Maven依赖包导入失败报红问题(总结最有效8种解决方案)...
  5. 假如我们等不到对的人,就趁孤单让自己优秀起来。单身是最好的升值期
  6. php什么是同源策略,javascript - 绕过同源策略的方法
  7. autocad字体ccfang_cad替换字体(cad找不到字体怎么替换)
  8. RocksDB调优指南
  9. 安卓手机管理软件_电话录音管理软件有哪些?
  10. 开源系统的选择-比较全面的各类开源应用系统列表
  11. 阿里巴巴国际站新手运营攻略
  12. 利用计算机建立动画中的 画面 由,计算机图形术在三维动画中的应用.doc
  13. From double Click to Main: PAL initialization
  14. FANUC机器人:奇异点回避功能介绍与使用方法
  15. c语言中 三个点 是什么,这是什么…(三个点)在c中意味着什么
  16. 2022-2027年中国基金行业市场全景评估及发展战略规划报告
  17. 新入职百度某员工发飙:前人代码写得像一坨屎,不能忍受,颠覆了对大厂的认知,...
  18. 中兴Blade V2021 5G 刷机root教程 ZTE 8012N root 线刷包下载TWRP 刷入
  19. 敏捷考证?你应该知道的敏捷体系认证名单(最全整理)
  20. Cocos Creator 3D后期效果解决方案源码剖析--从入门到融汇贯通

热门文章

  1. AI公开课:19.05.16漆远-蚂蚁金服集团CF《金融智能的深度与温度》课堂笔记以及个人感悟—191017再次更新
  2. ML之SVM:利用Js语言设计SVM算法(SMO算法+线性核/高斯核)
  3. ML/DL之预测分析类:利用机器学习算法进行预测分析的简介、分析、代码实现之详细攻略
  4. JAVA_OA管理系统(四)番外篇:使用Spring注解注入属性
  5. 《疯狂Java讲义》4
  6. docker-compose 部署elk+解决时间不对导致kibana找不到logstash定义的index + docker-compose安装...
  7. 云时代架构--阅读笔记03
  8. Centos-挂载和卸载分区-mount
  9. sql语句的学习(2)
  10. ubuntu 安装sun-java5-jdk