当前位置: 首页 > news >正文

windows内核研究(软件调试-异常的处理流程)

软件调试


异常的处理流程

在这里插入图片描述

在程序是以调试状态下发生异常时,一但程序发生异常,首先接管异常的不是异常处理程序而是我们的调试器

测试代码:

#include<iostream>
#include<windows.h>int main() {int x = 100;int y = 0;_try{int z = x / y; // 除0的异常std::cout << "无法执行的代码 " << z << std::endl;}_except(1){std::cout << "SEH异常处理代码" << std::endl;}system("pause");return 0;
}

在我们正常执行这个程序时,会打印SEH异常处理代码,这符合我们的预期,但是一但有调试器在调试这个程序时,它就会把这个异常先抛给调试器

在这里插入图片描述
在x64dbg中可以选择让调试器来处理异常,这样即使是我们程序当中有对应的异常处理程序也不会去执行

我们来梳理一下异常的处理流程

  1. 当发生异常时,首先会判断是否有调试器,如果有就发送给调试器(第一次)
  2. 如果调试器不处理,寻找异常处理器,处理了程序就继续运行
  3. 如果我们没有写对应的异常处理函数,调试器又没有处理异常,此时异常处理器会有最后一道防线UnhandledExceptionFilter
  4. UnhandledExceptionFilter会通过NtQueryinformationProcess查询当前进程是否正在被调试,如果是,返回EXCEPTION_CONTINUE_SEARCH,进入第二轮分发(如果没有调试则通过SetunhandledExceptionFilter注册异常处理函数,有就调用,如果没有则终止程序)

利用UnhandledExceptionFilter来反调试

#include<iostream>
#include<windows.h>int g_num = 0;LONG NTAPI TopLevelExcepFilter(PEXCEPTION_POINTERS pExcepInfo ) {std::cout << "异常修复!\n";g_num = 1; // 把异常处理让程序正常运行return EXCEPTION_CONTINUE_EXECUTION;
}int main() {int x = 100;int i = 0;// 这里只有在不被调试的情况下才会执行SetUnhandledExceptionFilter(&TopLevelExcepFilter);int z = x / g_num;std::cout << "程序正常运行!\n";for (;;){Sleep(1000);printf("%d\n", ++i);}system("pause");return 0;
}

效果

在这里插入图片描述

使用调试器加载则无法运行

在这里插入图片描述

http://www.dtcms.com/a/312013.html

相关文章:

  • 幂等性介绍和下单接口幂等性保证实现方案
  • 雷卯针对香橙派Orange Pi RV2开发板防雷防静电方案
  • kotlin小记(1)
  • Waterfox水狐浏览器、火狐浏览器外观修改
  • Dice Combinations(Dynamic Programming)
  • 【Bug记录】关于copy的表不能copy主键和index的解决办法
  • python:以支持向量机(SVM)为例,通过调整正则化参数C和核函数类型来控制欠拟合和过拟合
  • SM2椭圆曲线密码算法原理与纯C语言实现详解
  • #Linux内存管理# 用一个案例详细介绍ARMv7-A架构 缺页中断处理的原理
  • ARMv8/v9架构FAR_EL3寄存器介绍
  • imx6ull-驱动开发篇6——Linux 设备树语法
  • P10816 [EC Final 2020] Namomo Subsequence|普及+
  • 堆----1.数组中的第K个最大元素
  • [buuctf-misc]喵喵喵
  • Linux学习--数据结构
  • 前端-移动Web-day3
  • 基于springboot的郑州旅游景点推荐系统
  • Kotlin单例模式懒汉模式:LazyThreadSafetyMode.SYNCHRONIZED(2)
  • 多线程(二) ~ 线程核心属性与状态
  • C#中对于List的多种排序方式
  • LeeCode 88. 合并两个有序数组
  • DeepSpeed - 超大LLM分布式训练框架 ZeRO技术
  • Python day32
  • 力扣 二叉树遍历 中序/前序/后序(递归和迭代版)
  • dbt中多源数据的处理
  • 混合嵌入与置信度增强:新一代RAG技术如何提升LLM性能
  • 1.6 vue 监听
  • JavaScript 原始值与引用值
  • SQL语言学习(group by,having)
  • PyTorch 中 Tensor 统计学函数及相关概念