编译器扩展SEH
前言前面学习了VEH以及SEH,相较于全局链表的VEH,局部链表SEH有一个特别不方便的一点是,需要手动构造SEH结构体,并手动将其挂入SEH链表中,过程较为繁琐。本篇学习的编译器扩展SEH,就是在SEH的基础上,通过编译器的支持,简化了构造SEH结构体以及将其挂入链表的步骤。
需要注意一点,SEH ...
SEH
前言在学习了用户异常的分发后了解到KiUserExceptionDispatcher会调用RtlDispatchException函数来查找并调用异常处理函数,类似的内核异常处理时也会调用0环的RtlDispatchException函数来查找处理函数。
上一篇在学习VEH时比对过两者的差异,即处理 ...
VEH
前言前一篇学习了用户异常的分发过程,当用户异常产生后,内核函数KiDispatchException并不是像处理内核异常那样在0环直接进行处理,而是修改3环EIP为KiUserExceptionDispatcher函数后就结束了。这样,当线程再次回到3环时,将会从KiUserExceptionDis ...
用户异常的分发
前言上一篇学习了内核异常的分发,内核异常发生在内核层,处理起来比较简单,因为异常处理函数也在0环,不用切换堆栈;但是如果异常发生在3环,就意味着必须要切换堆栈,回到3环执行处理函数。
切换堆栈的处理方式与用户APC的执行过程几乎是一样的,唯一的区别就是执行用户APC时返回3环后执行的函数是KiUse ...
内核异常的分发
前言在之前的文章中提过,异常处理机制的执行流程分为
异常记录
异常的分发
异常的处理
本篇开始,开始学习异常分发的过程。
用户层异常与内核层异常异常可以发生在用户空间,也可以发生在内核空间。正如APC一样。
无论是CPU异常还是模拟异常,是用户层异常还是内核异常,都要通过KiDispatchEx ...
软件模拟异常记录
前言在上一篇介绍了CPU异常记录的过程,本篇介绍软件模拟异常的记录过程。并比对两者之间的区别。
分析软件模拟异常本次用一个小实验,分析软件模拟异常的流程
测试代码编译并运行如下代码(环境:Windows XP,IDE:VC++6.0)
c123456789#include "stdafx.h"int ...
CPU异常记录
前言从本篇开始,进入异常专题,这部分内容就比较关键了,因为异常这种机制,大部分操作系统都有一套自己的规则,大部分漏洞利用手法也和异常有关,前面的内容如果是基础,那么异常就是核心了。之前曾在中断与异常这篇提到过异常,当时只是简要总结了一下异常与中断的差异,现在来从异常的本质开始学习。
异常执行流程异常 ...
互斥体
前言前一篇文章学习了信号量(Semaphore),信号量的引出是为了解决事件(Event)解决不了的同步问题,例如生产者消费者问题。本篇将要学习的互斥体(Mutant),同样是为了解决信号量与事件解决不了的事情而诞生的。
为什么要有互斥体等待对象被遗弃问题互斥体(Mutant)与事件(Event)和 ...
信号量
前言前一篇学习了事件(Event)对象,线程在进入临界区之前会通过调用WaitForSingleObject或者WaitForMultipleObjects来判断当前的事件对象是否有信号(SignalState>0),只有当事件对象有信号时,才可以进入临界区。 需要说明的是,这里的临界区指的是广义上 ...
hexo博客常见问题(持续更新)
前言弄这个博客也有一段时间了,早在3月份的时候,刚开始弄博客,花费的心思也比较多。还会稍微布局一下,学习一些模板的使用。但之后便再没花心思。最近写博客的时候,遇到一个问题,很快就解决了,甚至没有查资料。觉得以后也许还会遇到,想着记录下来这些情况总是不会错的,因此从本篇开始,会不定期更新一些遇到的关于 ...