利用Win32 Debug API打造自己的Debugger

编写一个简易调试器 菜鸡的日常,复习一下调试器,简单CV点代码,调试器调试程序有两种方式,一种是创建进程,另一种便是附加: while (TRUE) { printf("1.创建新的调试进程\n"); printf("2.附加待调试的进程\n"); int input = 0; scanf_s("%d", &input); if (input == 1) { printf("请输入调试进程的路径:\n"); char Path[MAX_PATH] = { 0 }; scanf 阅读详情
 原理篇: http://blog.youkuaiyun.com/hackwaly/archive/2007/03/26/1542075.aspx 很多朋友都梦想有自己的Debugger程序,今天我们就来自己制作一个。作为一个Debugger程序,其最基本的功能框架其实就是完成2件事情:
 启动目标程序。
 实时监控目标程序的运行,并做出相应的应对。
我们要打造自己的Debugger程序,实际上也只需要完成这两个功能就可以了。当然,要完成这两个特定的功能,我们不可能从头开始造轮子,要首先看看操作系统给我们提供了什么样的基础设施:
由于我们是在Windows平台上工作,自然离不开微软公司提供的文档大全——MSDN。翻开MSDN,定位到“Debugging and Error Handling”,一些最基本的Windows Debug信息都在这里面。不过与其他栏目相比,这个栏目的信息明显显得单薄许多——也许越是底层、强大的技术,微软越不想公开吧。
初步浏览之后,我们可以确定,对于我们的Debugger而言,最重要的Debug API有如下几个:
 CreateProcess —— 用于创建被调试进程
 WaitForDebugEvent —— Debug Loop(调试循环)的主要构成函数
 ContinueDebugEvent —— 用于构成Debug Loop
 GetThreadContext —— 得到被调试进程的寄存器信息
 SetThreadContext —— 设置被调试进程的寄存器信息
 ReadProcessMemory —— 得到被调试进程的内存内容
 WriteProcessMemory —— 设置被调试进程的内存内容
最重要的数据结构有如下几个:
 CONTEXT —— 寄存器结构
 STARTUPINFO —— Start信息
 PROCESS_INFORMATION —— 进程相关信息
 DEBUG_EVENT —— Debug Event(调试事件)结构
可以说,我们的Debugger程序就是利用这几个API函数结合下面的几个数据结构,完成我们指定的功能。那么下面就让我们先来看看这几个API和数据结构的具体含义:

 

Debug API解析
在这里,我们将对上面所述的几个Debug调试API做一个检阅式的考察,大概介绍一下每个API的应用领域。而将这些API应用到具体实践中去,将会在下一部分“实例解析”中,给出详细的说明。
1.CreateProcess。
函数原型:BOOL CreateProcess(
LPCTSTR lpApplicationName, // 要创建的进程模块名
LPTSTR lpCommandLine, // 命令行字符串
LPSECURITY_ATTRIBUTES lpProcessAttributes, // 进程安全属性
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程安全属性
BOOL bInheritHandles, // 句柄继承选项
DWORD dwCreationFlags, // 进程创建选项
LPVOID lpEnvironment, // 进程环境块数据指针
LPCTSTR lpCurrentDirectory, // 当前目录名
LPSTARTUPINFO lpStartupInfo, // 启动信息
LPPROCESS_INFORMATION lpProcessInformation // 进程信息
);
函数解析:该函数是Windows平台提供的最基本的创建进程的函数。每当我们双击一个EXE可执行文件,Windows内核就会自动调用该函数创建我们双击的文件所对应的进程。该函数中,最重要的参数有三个:一个是进程模块名,指明了要创建哪个进程;一个是进程创建选项,指明了要如何创建目标进程;对于Debugger程序而言,最常用的创建选项就是:DEBUG_PROCESS|DEBUG_ONLY_THIS_PROCESS。最后还有一个就是进程信息,我们调用CreateProcess创建了进程以后,Windows会将新创建的进程的相关信息全部放到ProcessInfo信息块中,我们在Debug Loop调试循环中使用进程信息块中的数据与目标进程交互,监视和控制目标进程的动作。
2.WaitForDebugEvent。
函数原型:BOOL WaitForDebugEvent(
LPDEBUG_EVENT lpDebugEvent, // Debug Event(调试事件指针)
DWORD dwMilliseconds // 超时设置
);
函数解析:该函数构成了Debug Loop调试循环的主体,一个Debugger程序在创建出目标进程后,一般都会紧接着循环调用该函数等待目标进程的各种调试信息,这个循环调用WaitForDebugEvent的过程,我们就称之为Debug Loop调试循环。调试循环是所有Debugger程序的主体部分,Debugger几乎所有的监视、控制、调整的功能都是在调

WinDbg蓝屏分析入门 一、WinDbg介绍 WinDbg,英文全称为Windows Debugger,Windows调试程序。 WinDbg是Windows平台下面的一款调试工具,通过dmp文件对蓝屏、程序崩溃原因进行分析,定位问题根源。官方描述WinDbg功能为以下三点: 调试内核模式和用户模式代码 分析故障转储 在代码执行时检查 CPU 寄存器。 微软官方文档学习资料:https://docs.microsoft.com/zh-cn/windows-hardware/dr... 阅读详情

相关推荐

PHP Swoole AOT编译:打造零依赖Windows原生EXE

PHP传统上是解释型脚本语言,依赖php.exe和复杂运行环境,导致Windows端交付困难。Swoole 5.0+引入的AOT(Ahead-of-Time)编译技术,通过LLVM IR生成、静态链接与内核模块化,将PHP代码、运行时及扩展(如协程、HTTP服务器)直接编译为独立Windows PE可执行文件。该方案不依赖VC++ Redist、无需安装PHP环境,彻底解决部署不确定性问题,显著提升交付可信度与运维确定性。适用于内部工具、信创轻服务、工控采集客户端等需双击即用、注册为Windows服务的生产

weixin_33696106的博客 351

嵌入式开发实战:CodeWarrior工具链配置、内存优化与多核调试指南

在嵌入式系统开发中,集成开发环境(IDE)和工具链是连接软件逻辑与硬件执行的关键桥梁。其核心原理在于将编译器、链接器、调试器等工具无缝集成,实现对特定处理器架构的深度优化。这套工具链的技术价值在于,它不仅能将高级语言代码高效转化为机器指令,更能通过精细的内存布局控制和实时调试能力,确保程序在资源受限的嵌入式环境中稳定、高效地运行。典型应用场景包括汽车电子、工业控制以及网络处理器等对实时性和可靠性要求极高的领域。本文以NXP CodeWarrior开发工具为例,深入解析其基于Eclipse的定制化IDE环境,

ciya3282的博客 454

TCL调用VC++ DLL实战:从原理到部署的完整指南

动态链接库(DLL)是Windows平台实现代码复用和模块化开发的核心技术,它允许不同编程语言编写的模块在运行时进行交互。其原理在于通过导出函数提供标准接口,实现二进制级别的代码共享。在自动化测试、工业软件二次开发等场景中,脚本语言与本地代码库的高效集成能极大提升开发灵活性与执行性能。TCL作为一种强大的脚本语言,通过其内置的`load`机制与C/C++ DLL直接交互,为C++高性能算法提供了灵活的脚本驱动外壳。然而,这一过程常因环境配置、编译设置或依赖项问题而受阻,典型的如`OSError: [WinE

weixin_30701575的博客 349

Visual Studio C++开发实战:十大高频编译链接错误根治指南

在C++开发中,编译与链接是构建可执行程序的核心环节。编译器负责检查语法与语义,将源代码转换为目标文件;链接器则将多个目标文件及库文件合并,解析符号引用,最终生成可执行文件或动态库。这一过程确保了代码的模块化和复用,是大型项目工程化的基石。其技术价值在于提升构建效率与软件可靠性,广泛应用于桌面应用、游戏引擎、系统软件等场景。实践中,开发者常因环境配置、符号定义、库依赖等问题遭遇阻碍,例如LNK2005重复定义和LNK2019无法解析外部符号等经典链接错误。本文聚焦Visual Studio这一主流IDE,系

weixin_30493401的博客 334

基于Qt与C++的跨平台系统资源监控工具开发实战

系统监控是软件开发与运维中的基础需求,它涉及对计算机核心资源(如CPU、内存、磁盘、网络)运行状态的实时感知与数据可视化。其原理通常是通过调用操作系统提供的原生API或读取系统文件(如Linux的/proc、Windows的性能计数器)来周期性采集性能数据。掌握系统监控技术对于开发高性能、高可用的软件系统具有重要价值,它能帮助开发者进行性能瓶颈分析、资源优化和故障预警。在应用场景上,从服务器运维到桌面应用开发,再到嵌入式设备管理,都离不开轻量级、定制化的监控方案。本文聚焦于使用Qt框架和C++语言,构建一个

weixin_30493401的博客 428

ECN实战指南:如何用SAP系统搞定工程变更(附库存处理避坑技巧)

本文详细解析了如何在SAP系统中高效执行工程变更通知(ECN),特别聚焦PP模块的操作流程与库存处理技巧。通过实战案例和系统操作指南,帮助制造业企业避免库存混乱和生产中断,实现从创建到生效的全流程管理。

m5n6o7的博客 1085

智能客服系统知识库数据清洗

数据清洗(Data Cleaning)是确保智能客服知识库高效运行的重要环节,主要涉及。| 分类 & 标签优化 | 重新组织 FAQ,创建关键字索引 || 定期更新 | 结合用户反馈,每 1-3 个月优化 |才能提供更优质、正确的回答,提升客户满意度!、Zendesk、Intercom 等)中,: FAQ 或客服回答中可能存在。,会影响 AI 匹配的准确性。是一个持续优化的过程,

z1941563559的博客 2102

Gromacs实战:从蛋白质-小分子对接到分子动力学模拟全流程解析

本文详细解析了使用Gromacs进行蛋白质-小分子复合物分子动力学模拟的全流程。从处理AutoDock等对接软件的结果文件开始,逐步指导如何为蛋白质和小分子分别生成拓扑文件,并解决力场合并的核心挑战。文章涵盖了构建模拟盒子、添加溶剂离子、能量最小化、平衡模拟以及关键的轨迹分析步骤,为计算生物学和药物设计研究者提供了一套从静态对接到动态评估的完整实战指南。

weixin_29251337的博客 1221

【自然语言处理】【聚类】TELL:可解释神经聚类

超越分类的XAI:可解释神经聚类 《XAI Beyond Classification: Interpretable Neural Clustering》 论文地址:https://www.jmlr.org/papers/volume23/19-497/19-497.pdf 一、简介 ​ 本文研究了可解释AI(XAI\text{XAI}XAI)和数据聚类这两个挑战性问题。第一个问题是如何设计一种具有固定可解释性的神经网络,而不是给出一个黑盒模型的事后解释。第二个问题是,使用可微分神经网络来实现离散的k-me

bqw的博客 4140

大津法(OTSU)点云强度信息分割

大津法(OTSU)是一种灰度图像自适应的阈值分割方法,大津法根据图像的灰度分布,将图像分成背景和前景两部分,前景就是需要按照阈值分割出来的部分。由于点云的强度信息的特性,也可以利用此方法进行分类,但需要保证信息干扰较少,例如道路标线分割等场景较为适用。

qq_48694523的博客 966

【HAL库】STM32CubeMX开发----STM32F407----ETH+LAN8720A+LWIP----ping通

本次实验以芯片为MCU,使用25MHz外部时钟源。以太网PHY层芯片为LAN8720A,由MCU引脚PA8提供时钟。

MQ0522的博客 4845

windows11下pycharm怎么完全卸载?完整卸载pycharm编辑器的教程

在卸载pycharm时都有遇到卸载不干净不完全的问题,那么具体怎样做才能完全卸载pycharm呢?退出所有的操作,重新启动电脑,会发现相关的软件已经被删除了。步骤1:卸载软件并删除安装目录。步骤2:删除相关的注册表。

拥抱具身智能,昇腾Ascend C 1万+

Arduino ESP8266通过 RF433数据收发实验

Arduino ESP8266通过 RF433射频模块实现数据收发实验 写这篇文章,折腾了2天,在没有成功之前,一直在摸索和采坑当中,不要问我黑暗和黎明之间有多长。开发很多时候只问结果,不问过程的,在这里分享来之不易的结果,希望后面的人不要采坑,有成功的案例先河,后面与之相关的应用开发只需要套用模板修改即可实现。 实物搭建 RF433模块 我使用的是这个:nodemcu 本案例开发所使用到的库:RadioHead:http://www.airspayce.com/mikem/

perseverance51博客 3808

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: 侦测隐藏进程的强文[下]
下一篇: 压缩VC编译文件的体积
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值