首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >10.0 探索API调试事件原理

10.0 探索API调试事件原理

原创
作者头像
王瑞MVP
发布于 2023-10-03 10:40:10
发布于 2023-10-03 10:40:10
25100
代码可运行
举报
运行总次数:0
代码可运行

本章笔者将通过Windows平台下自带的调试API接口实现对特定进程的动态转存功能,首先简单介绍一下关于调试事件的相关信息,调试事件的建立需要依赖于DEBUG_EVENT这个特有的数据结构,该结构用于向调试器报告调试事件。当一个程序发生异常事件或者被调试器附加时,就会产生对应的DEBUG_EVENT调试事件,通常DEBUG_EVENT包含了多种调试类型,包括异常事件、进程创建事件、线程创建事件、进程退出事件和线程退出事件等等,我们只需要动态捕捉这些调试事件并作相应的处理即可实现更多有用的功能。

调试事件通常可以分为如下几种类型;

  • 异常事件 (Exception Event) - 发生了异常,例如访问非法的内存、除以零或调用了无效的函数。
  • 进程创建事件 (Process Creation Event) - 当一个新进程被创建时发送此事件。
  • 进程退出事件 (Process Exit Event) - 当一个进程退出时发送此事件。
  • 线程创建事件 (Thread Creation Event) - 当一个新线程被创建时发送此事件。
  • 线程退出事件 (Thread Exit Event) - 当一个线程退出时发送此事件。
  • 调试字符串事件 (Debug String Event) - 当一个进程向其调试器发送字符串消息时发送此事件。
  • 输出字符串事件 (Output String Event) - 当输出调试字符串时发送此事件。
  • 动态链接库加载事件(LOAD_DLL_DEBUG_EVENT) - 当进程装载 DLL 时发送此事件。

当我们需要调试一个程序时有两种方式可以实现,第一种方式是通过CreateProcess()函数创建一个进程,并在调用函数时指定DEBUG_PROCESS || DEBUG_ONLY_THIS_PROCESS则当程序被运行起来后自动进入到调试状态,另一种方式则是通过DebugActiveProcess()函数,该函数接受一个正在运行的进程PID号,可动态附加到一个已运行程序上而对其进行调试。

一旦调试器通过CreateProcess()附加并运行,下一步则是通过WaitForDebugEvent()用于等待一个调试事件,当有调试事件到达后系统会将调试类型存储到debugEvent.dwDebugEventCode这个变量内,此时我们可以通过判断该变量内的参数来对特定的事件做出自定义处理操作,接着会通过ContinueDebugEvent()继续等待下一个调试事件的到来,我们以打开一个进程并创建调试为例,看一下如下代码片段;

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <windows.h>

int main(int argc, char* argv[])
{
    DEBUG_EVENT debugEvent = { 0 };
    BOOL bRet = TRUE;

    // 创建调试进程
    STARTUPINFO startupInfo = { 0 };
    PROCESS_INFORMATION pInfo = { 0 };
    GetStartupInfo(&startupInfo);

    // 创建调试进程并设置 DEBUG_PROCESS || DEBUG_ONLY_THIS_PROCESS 调试事件
    bRet = CreateProcess("d://lyshark.exe", NULL, NULL, NULL, TRUE, DEBUG_PROCESS || DEBUG_ONLY_THIS_PROCESS, NULL, NULL, &startupInfo, &pInfo);
    if (!bRet)
    {
        return 0;
    }

    // 附加调试进程
    // DebugActiveProcess(13940)

    // 无限循环等待调试事件
    while (WaitForDebugEvent(&debugEvent, INFINITE))
    {
        // 根据调试事件判断
        switch (debugEvent.dwDebugEventCode)
        {
            // 异常调试事件
        case EXCEPTION_DEBUG_EVENT:
            printf("异常处理事件 \n");
            break;

            // 线程创建调试事件
        case CREATE_THREAD_DEBUG_EVENT:
            printf("线程创建调试事件 \n");
            break;
            // 进程创建调试事件
        case CREATE_PROCESS_DEBUG_EVENT:
            printf("进程创建调试事件 \n");
            break;
            // 线程退出调试事件
        case EXIT_THREAD_DEBUG_EVENT:
            printf("线程退出调试事件 \n");
            break;
            // 进程退出调试事件
        case EXIT_PROCESS_DEBUG_EVENT:
            printf("进程退出调试事件 \n");
            break;
            // 装载DLL调试事件
        case LOAD_DLL_DEBUG_EVENT:
            printf("装载DLL调试事件 \n");
            break;
            // 卸载DLL调试事件
        case UNLOAD_DLL_DEBUG_EVENT:
            printf("卸载DLL调试事件 \n");
            break;
            // 输出调试信息事件
        case OUTPUT_DEBUG_STRING_EVENT:
            printf("输出调试信息事件 \n");
            break;
        }

        // 使调试器能够继续以前报告调试事件的线程
        bRet = ContinueDebugEvent(debugEvent.dwProcessId, debugEvent.dwThreadId, DBG_CONTINUE);
    }

    system("pause");
    return 0;
}

当编译并运行上述程序后,读者应该能看到如下图所示的输出效果,其中包括了各类调试事件被触发时的提示信息,由于在调试事件内没有做任何操作,程序在加载后就被自动运行起来了;

本文作者: 王瑞

本文链接: https://www.lyshark.com/post/b8eecce4.html

版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LaTeX详细教程+技巧总结[通俗易懂]
若想学习Markdown,请参见我的另一篇博客:Markdown详细教程+技巧总结 。 若想直接学习LaTeX数学公式,请参见我的另一篇博客:LaTeX数学公式-详细教程 。
全栈程序员站长
2022/08/29
18.2K0
LaTeX详细教程+技巧总结[通俗易懂]
【latex】图片插入和引用
源地址:http://blog.163.com/xiaoting_hu/blog/static/504647722013528143405/
蛮三刀酱
2019/09/10
9.9K0
LaTeX详细安装步骤和简明教程
配置TeXLive和TeXstudio。TeXLive是编译器为Latex提供运行所需的环境;TeXstudio编辑器,提供操作界面,需要先安装好TeXLive之后,TeXstudio才能使用。
全栈程序员站长
2022/08/30
4.2K0
LaTeX详细安装步骤和简明教程
Latex如何插入图片[通俗易懂]
在写报告或论文的过程中,几乎不可避免的要插入一些图片,并且根据不同情况及要求进行排版,例如如何插入单个图片、一行插入两张图片、插入两行两列图片等等。在此,汇总一下各种插入图片的方法。
全栈程序员站长
2022/06/28
11.9K0
Latex如何插入图片[通俗易懂]
CVPR2024 Rebuttal 收获
7天的Rebuttal终于结束了,高强度全力focus到一件事的时候,时间就过的飞快,这一周股市又是腥风血雨,但实属无暇顾及,每天就匆匆看一眼,连悲伤的情绪都没时间流露。好似“折跃”到了2月,在1号算是短暂的休息了一下(其实就是洗了堆了一周的衣物,去修了车),晚上开始回忆一周的经过,总结一周的收获和感受。这可能不是一篇专业度极高的文章,但一定是一个Research萌新的用心之作,如果对你也所帮助那就再好不过了。
Here_SDUT
2024/02/03
1K0
CVPR2024 Rebuttal 收获
Latex学习笔记(十一)各种图片的插入
插入单张普通图片: \begin{figure}[H] \small \centering \includegraphics[width=.6\textwidth]{1.png} \caption{SIER Model of Ebola propagation } \end{figure} 插入三张图(第一行两张,第二行一张居中): \begin{figure}[H] \centering \subfigure[Guinea]{ \includegraphics[width=7.5cm]{
zstar
2022/06/14
6550
使用 LaTeX 进行论文写作
最近几个月一直在忙着跑实验,写论文,博客确实也是好久没有更新了,乘着最近论文搞得差不多了,碰巧也是在排版,来记录一下使用 LaTeX 进行论文写作的一些东西。
EmoryHuang
2023/03/12
2.9K0
使用 LaTeX 进行论文写作
Latex学习笔记(六)插入图片
其中,[H]是需要调用宏包 \usepackage{graphicx} \usepackage{float} 可以放置图片插入错位 netofGame1.png为图片输入路径,相对路径需要放置在和.tex同一文件夹下 防踩雷:图片命名不要加空格,否则在图片上方会出现乱码 caption为图片下方的标题
zstar
2022/06/14
4720
LaTeX 插入图片 公式
首先需要添加一个宏包graphicx,在插入图片的位置可以直接点击LaTeX的插入图片快捷按钮,然后修改其中的 * 位置的内容既可(caption与label若不需要也可以删掉)。
全栈程序员站长
2022/08/14
1.5K0
LaTeX 插入图片 公式
latex插入图片
\begin{figure}[htbp] 表示位置优先级: h(当前位置)>t(顶部)>b(底部)>p(浮动页);上一个优先级满足不了依次落入下一个。
全栈程序员站长
2022/06/28
8400
Latex插入图片
首先包含包\usepackage{graphicx}\usepackage{subfigure}其次在需要插入图片的地方输入代码\begin{figure}[h]\centering\includegraphics[width=4cm,height=5cm]{clsap}\caption{clsap}\end{figure}clsap为文件名,不要带文件的拓展名。
狼啸风云
2019/12/10
1.6K0
Latex 论文elsevier,手把手如何用Latex写论文
这几天在开始写论文,准备发的是elsevier,这个网站的instruction有问题,下载的东西基本上好多的错误,所以我就写博客记录。
林德熙
2018/09/19
11.7K0
Latex 论文elsevier,手把手如何用Latex写论文
Latex中插入多张图片,实现并排排列或者多行多列排列
但是我原来只插入过一张图片(图片内容来源于网络;是国漫一人之下的宝儿姐。强推这部国漫~),代码如下,效果如图:
全栈程序员站长
2022/08/14
27.5K1
Latex中插入多张图片,实现并排排列或者多行多列排列
LaTeX简单常用方法笔记
API参考手册: http://www.personal.ceu.hu/tex/latex.htm
小锋学长生活大爆炸
2020/08/25
1.3K0
LaTeX简单常用方法笔记
LaTeX两张图并排显示
切记\subfigure之外如果加了\centering两幅图就不会并列了,需要加在\subfigure之内。
SL_World
2022/05/06
4.2K0
LaTeX两张图并排显示
【知识】Latex中subfigure和subcaption的详细区别
在 LaTeX 中,subfigure 和 subcaption 都是用于处理多张子图的工具,但它们有显著的区别。以下从功能、兼容性、语法、优势/劣势几个方面详细对比两者。
小锋学长生活大爆炸
2025/05/24
6390
LaTeX 插入图片
有时候,我们使用双栏的论文格式,通常图片显示于单栏,不会跨栏显示;想要跨越双栏显示,则使用如下办法;
全栈程序员站长
2022/06/28
9400
通俗易懂的Latex教程文档
本篇文档可以搭配视频讲解使用。 讲解视频: https://player.bilibili.com/player.html?aid=933470753&page=1 通俗易懂的Latex教程(附数学
zstar
2022/06/14
2.7K0
通俗易懂的Latex教程文档
[论文工具] LaTeX论文撰写常见用法及实战技巧归纳(持续更新)
回过头来,我们在编程过程中,经常会遇到各种各样的问题。然而,很多问题都无法解决,网上夹杂着各种冗余的回答,也缺乏系统的实战技巧归纳。为更好地从事科学研究和编程学习,后续将总结各类常见实战技巧,希望对您有所帮助。
Eastmount
2023/10/07
3.1K0
[论文工具] LaTeX论文撰写常见用法及实战技巧归纳(持续更新)
LaTeX简单常用方法笔记,附模板
标题:\title{标题} 作者:\author{作者} 学号:\studentid{123} 正文:
小锋学长生活大爆炸
2021/06/11
1.7K0
LaTeX简单常用方法笔记,附模板
相关推荐
LaTeX详细教程+技巧总结[通俗易懂]
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验