CPU异常分析(以trap00为例)
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html
CPU异常的记录(trap00为例)
一、CPU检测到除零异常的执行流程

二、Trap00 函数的分析
当发生除零异常时,查IDT表会查到Trap00函数,该函数的目的是构建_KTRAP_FRAME结构,查错误码,之后调用 commonDispatchExcption进行封装。
我们可能很奇怪,明明CPU检测到的错误,本身就在内核,还会有 _KTRAP_FRAME结构。
很简单,用户也会走这个函数,我们在反汇编代码分析时,发现其还有一条路线是处理用户层的,如果是用户层直接进来,当然要进行线程上下文切换。

三、CommonDispatchException函数
该函数就是完成封装 _EXCEPTION_RECORD结构体,之后调用 _KiDispatchException来开始真正的派发函数。

四、反汇编代码:
1. Trap00函数反汇编代码
.text: _KiTrap00 proc near ; DATA XREF: INIT:_IDT↓o
.text:
.text: var_2 = word ptr -
.text: arg_4 = dword ptr
.text:
.text: ; FUNCTION CHUNK AT .text:004363FB SIZE BYTES
.text:
.text: push
.text: mov [esp++var_2],
.text: push ebp
.text:0043665A push ebx
.text:0043665B push esi
.text:0043665C push edi
.text:0043665D push fs
.text:0043665F mov ebx, 30h ; 30这个值作为段选择子
.text: mov fs, bx
.text: assume fs:nothing
.text: mov ebx, large fs:
.text:0043666E push ebx
.text:0043666F sub esp,
.text: push eax
.text: push ecx
.text: push edx
.text: push ds
.text: push es
.text: push gs
.text: mov ax, 23h
.text:0043667D sub esp, 30h
.text: mov ds, ax
.text: assume ds:nothing
.text: mov es, ax
.text: assume es:nothing
.text: mov ebp, esp ; 从这里开始 ,EBP已经等于 Trap_Frame 结构,比如ebp+30为SegGs
.text: test [esp+_KTRAP_FRAME.EFlags], 20000h ; 判断 eflag 标准,是否是虚拟8086模式,如果是跳转下面函数
.text: jnz short V86_kit0_a ; 如果是虚拟8086,则继续填充_KTRAP_FRAME 结构
.text:
.text: loc_436692: ; CODE XREF: V86_kit0_a+↑j
.text: mov ecx, large fs:124h
.text: cld
.text:0043669A and [ebp+_KTRAP_FRAME.Dr7],
.text:0043669E test byte ptr [ecx+], 0DFh
.text:004366A2 jnz Dr_kit0_a
.text:004366A8
.text:004366A8 loc_4366A8: ; CODE XREF: Dr_kit0_a+D↑j
.text:004366A8 ; Dr_kit0_a+↑j
.text:004366A8 mov ebx, [ebp+_TRAP_FRAME.Ebp] ; ebp
.text:004366AB mov edi, [ebp+_KTRAP_FRAME._Eip] ; eip
.text:004366AE mov [ebp+_KTRAP_FRAME.DbgArgPointer], edx
.text:004366B1 mov [ebp+_KTRAP_FRAME.DbgArgMark], 0BADB0D00h
.text:004366B8 mov [ebp+_KTRAP_FRAME.DbgEbp], ebx ; 保存堆栈
.text:004366BB mov [ebp+_KTRAP_FRAME.DbgEip], edi ; 保存异常的EIP
.text:004366BE test byte ptr [ebp+(_KTRAP_FRAME.EFlags+)],
.text:004366C2 jnz short loc_436712
.text:004366C4 test byte ptr [ebp+_KTRAP_FRAME.SegCs],
.text:004366C8 jnz short loc_4366DB
.text:004366CA sti
.text:004366CB push ebp
.text:004366CC push
.text:004366CE push
.text:004366D0 push
.text:004366D2 push
.text:004366D4 push 7Fh
.text:004366D6 call _KeBugCheck2@ ; KeBugCheck2(x,x,x,x,x,x)
.text:004366DB ; ---------------------------------------------------------------------------
.text:004366DB
.text:004366DB loc_4366DB: ; CODE XREF: _KiTrap00+↑j
.text:004366DB cmp word ptr [ebp+_KTRAP_FRAME.SegCs], 1Bh
.text:004366E0 jnz short loc_4366FF
.text:004366E2 sti
.text:004366E3 push ebp ; 将trap_frame压进去
.text:004366E4 call _Ki386CheckDivideByZeroTrap@ ; 拿到除零异常的错误码
.text:004366E9 mov ebx, [ebp+_KTRAP_FRAME._Eip]
.text:004366EC jmp loc_4363FB
.text:004366F1 ; ---------------------------------------------------------------------------
.text:004366F1
.text:004366F1 loc_4366F1: ; CODE XREF: _KiTrap00+C0↓j
.text:004366F1 ; _KiTrap00+CB↓j
.text:004366F1 sti
.text:004366F2 mov ebx, [ebp+_KTRAP_FRAME._Eip]
.text:004366F5 mov eax, 0C0000094h
.text:004366FA jmp loc_4363FB
.text:004366FF ; ---------------------------------------------------------------------------
.text:004366FF
.text:004366FF loc_4366FF: ; CODE XREF: _KiTrap00+↑j
.text:004366FF mov ebx, large fs:124h
.text: mov ebx, [ebx+50h]
.text: cmp dword ptr [ebx+148h],
.text: jz short loc_4366F1
.text:
.text: loc_436712: ; CODE XREF: _KiTrap00+↑j
.text: push
.text: call _Ki386VdmReflectException_A@ ; Ki386VdmReflectException_A(x)
.text: or al, al
.text:0043671B jz short loc_4366F1
.text:0043671D jmp Kei386EoiHelper@ ; Kei386EoiHelper()
.text:0043671D _KiTrap00 endp
2.CommonDispatchException反汇编代码
.text:0043641C CommonDispatchException proc near ; CODE XREF: sub_43653F-↑p
.text:0043641C ; sub_43653F-↑p ...
.text:0043641C
.text:0043641C var_50 = dword ptr -50h
.text:0043641C var_4C = dword ptr -4Ch
.text:0043641C var_48 = dword ptr -48h
.text:0043641C var_44 = dword ptr -44h
.text:0043641C var_40 = dword ptr -40h
.text:0043641C var_3C = byte ptr -3Ch
.text:0043641C
.text:0043641C sub esp, 50h
.text:0043641F mov [esp+_EXCEPTION_RECORD32.ExceptionCode], eax
.text: xor eax, eax
.text: mov [esp+_EXCEPTION_RECORD32.ExceptionFlags], eax
.text: mov [esp+_EXCEPTION_RECORD32.ExceptionRecord], eax
.text:0043642C mov [esp+_EXCEPTION_RECORD32.ExceptionAddress], ebx
.text: mov [esp+_EXCEPTION_RECORD32.NumberParameters], ecx
.text: cmp ecx, ; 判断是否存在参数
.text: jz short loc_436445 ; 如果存在参数,则进行赋值,否则直接跳过。
.text: lea ebx, [esp+_EXCEPTION_RECORD32.ExceptionInformation]
.text:0043643D mov [ebx], edx
.text:0043643F mov [ebx+], esi
.text: mov [ebx+], edi
.text:
.text: loc_436445: ; CODE XREF: CommonDispatchException+1B↑j
.text: mov ecx, esp ; 将 _EXCEPTION_RECORD 首地址放到 ecx 中
.text: test byte ptr [ebp+72h],
.text:0043644B jz short loc_436454
.text:0043644D mov eax, 0FFFFh
.text: jmp short loc_436457
.text: ; ---------------------------------------------------------------------------
.text:
.text: loc_436454: ; CODE XREF: CommonDispatchException+2F↑j
.text: mov eax, [ebp+6Ch]
.text:
.text: loc_436457: ; CODE XREF: CommonDispatchException+↑j
.text: and eax,
.text:0043645A push ; char
.text:0043645C push eax ; int
.text:0043645D push ebp ; BugCheckParameter3
.text:0043645E push ; int
.text: push ecx ; int
.text: call _KiDispatchException@ ; KiDispatchException(x,x,x,x,x)
.text: mov esp, ebp
.text: jmp Kei386EoiHelper@ ; Kei386EoiHelper()
.text: CommonDispatchException endp
CPU异常分析(以trap00为例)的更多相关文章
- Android异常分析(转)
关于异常 异常? 异常就是一种程序中没有预料到的问题,既然是没有预料到的,就可能不在原有逻辑处理范围内,脱离了代码控制,软件可能会出现各种奇怪的现象.比如:android系统常见异常现象有应用无响应. ...
- 两种异常(CPU异常、用户模拟异常)的收集
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 两种异常(CPU异常.用户模拟异常)的收集 文章的核心:异常收集 ...
- Linux Kernel Oops异常分析
1.PowerPC小系统内核异常分析 1.1 异常打印 Unable to handle kernel paging request for data at address 0x36fef31eFa ...
- MySQL 外键异常分析
外键约束异常现象 如下测例中,没有违反引用约束的插入失败. create database `a-b`; use `a-b`; SET FOREIGN_KEY_CHECKS=0; create tab ...
- 【STM32H7教程】第11章 STM32H7移植SEGGER的硬件异常分析
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第11章 STM32H7移植SEGGER的硬 ...
- Intel CPU 漏洞分析
Intel CPU漏洞分析报告 预备知识 存储分级 由于计算机存储分级的特性(第一级:寄存器,第二级:高速缓存,第三级:内存,第四级:磁盘),每一级之间的访问速度差距高达数量级.所以处理器会将用到的数 ...
- nohup 程序在后台运营 避免 xshell 卡死 通过 nohup.out分析调取系统命令时的异常分析
nohup 程序在后台运营 避免 xshell 卡死 [root@admin1 after_fc_distributed]# nohup /root/anaconda3/bin/python da ...
- 软件调试——CPU异常列表
CPU异常主要分为三类:错误类异常,陷阱类异常和终止类异常 1 错误类异常 Fault CPU遇到该类异常后,会先将CS和EIP(当前发生错误的指令,而不是下一条指令)压栈,然后跳到异常处理函数中,执 ...
- java.net.SocketException:Software caused connection abort: recv failed 异常分析 +socket客户端&服务端代码
java.net.SocketException:Software caused connection abort: recv failed 异常分析 分类: 很多的技术 2012-01-04 12: ...
随机推荐
- contiue和break的用法
contiue和break的作用分别是什么: 1.continue的意思是终止本次循环,直接进入下一次循环. 注意: continue不能加在循环体的最后一步执行的代码,因为代码加上去毫无意义 2.b ...
- 《Java练习题》进阶练习题(二)
编程合集: https://www.cnblogs.com/jssj/p/12002760.html 前言:不仅仅要实现,更要提升性能,精益求精,用尽量少的时间复杂度和空间复杂度解决问题. [程序58 ...
- 利用PyCharm操作Github(二):分支新建、切换、合并、删除
在文章利用PyCharm操作Github:仓库新建.更新,代码回滚中,我们已经学习到了如何利用PyCharm来操作Github,其中包括了一些常见的Github操作:仓库的新建.更新以及代码回滚. ...
- c++之程序流程控制
三种程序运行结构:顺序结构.选择结构.循环结构. 顺序结构:程序按顺序执行,不发生跳转. 选择结构:依据条件执行不同的语句. 循环结构:判断条件是否满足,循环多次执行某段代码. 一.选择结构 //单行 ...
- Caffe源码-Layer类
Layer类简介 Layer是caffe中搭建网络的基本单元,caffe代码中包含大量Layer基类派生出来的各种各样的层,各自通过虚函数 Forward() 和 Backward() 实现自己的功能 ...
- 暴力破解( Hydra | Medusa)
暴力破解 By : Mirror王宇阳 笔者告知 : 暴力破解的结果是运气和速度的结晶,开始暴力破解前烧一炷香也是必要的! 引用张炳帅的一句话:"你的运气和管理员的安全意识成正比" ...
- Orcle如何获取当前时间
Oracle获取当月所有日期: SELECT TRUNC(SYSDATE, 'MM') + ROWNUM - 1 FROM DUAL CONNECT BYROWNUM <= TO_NUMBER( ...
- 持续集成(CI):Jmeter+Ant+Jenkins定时构建
这里Jenkins的安装部署以及工程项目的整体配置不做赘述,其它博文已经说明,这里主要是赘述Ant的相关配置,build.xml文件配置以及项目中的部分配置 一.build.xml 在Ant的安装目录 ...
- JavaScript工具库
jPublic 交流QQ群:1017567122 前言 在我们开发项目的时候,无论项目规模大小,在所难免会写一些工具型函数来解决一些问题,随着项目开发和维护的时间越来越长,这些工具型函数会越来越多,同 ...
- LeetCode 二叉树的锯齿形层次遍历
第103题 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7] ...