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: ...
随机推荐
- 电商设计V1(一):软件工程设计
软件工程设计的方式方法 多视图法: 全面分析软件方方面面的问题 尽早地发现和排除项目风险与不确定因素 从不同角度去展现要设计的软件系统 为项目进行不同的干系人提供指导: 逻辑架构描述系统功能,并指导系 ...
- 分布式全文搜索引擎ElasticSearch—超详细
1 ElasticSearch 1.1 ES的概念和特点 ES:全文检索的框架,专门做搜索,支持分布式.集群.封装的Lucene. 特点: 原生的Lucene使用的不足,优化了Lucene的调用方式 ...
- JS Math对象、日期对象、函数、定时器
Math对象 开平方:sqrt 绝对值:abs π:PI x的y次方:pow 四舍五入取整:round 向下取整:floor 向上取整:ceil 最大值:max 最小值: min 随机数:random ...
- Cookie与Session会话技术
Cookie与Session会话技术 一.什么是会话 会话:当用户打开浏览器,访问多个WEB资源,然后关闭浏览器的过程,称之为一个会话,选项卡,弹出页面都属于这个会话,且共享同一个session. 二 ...
- mysql如何处理高并发(转)
mysql高并发的解决方法有:优化SQL语句,优化数据库字段,加缓存,分区表,读写分离以及垂直拆分,解耦模块,水平切分等. 高并发大多的瓶颈在后台,在存储mysql的正常的优化方案如下: (1)代码中 ...
- javascript中的slice()方法
JavaScript中的Array对象提供了一个slice()方法,用于从已有的数组中返回选定的元素. arrayObject.slice(start, end) 参数说明 start 必需(否则没有 ...
- LinuxProbe小结
1.修改主机名: /etc/hostname 2.配置 yum 软件仓库: (1)进入到 /etc/yum.repos.d/目录下,创建一个linuxprobe.repo的新文件(文件名称任意,结尾必 ...
- .net core3.0部署Linux服务器 使用Docker容器和Nginx反代理教程
本人刚接触.net core 由于公司项目需要部署在Linux上 近些日子学习和网上大面积搜教程 我在这给大家归拢归拢借鉴的教程做了套方案(我写的可以实现 但不一定是最好的 仅供参考) 我只用过cor ...
- 爬虫(四):requests模块
1. requests模块 1.1 requests简介 requests 是一个功能强大.简单易用的 HTTP 请求库,比起之前用到的urllib模块,requests模块的api更加便捷.(本质就 ...
- MyBatis映射文件 相关操作
一.MyBatis映射文件 1.简介 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行 ...