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: ...
随机推荐
- Spring Boot 部署浅析(jar or war)
对于传统的 ssm 或者 ssh 项目的部署,一般会打包成war包,或者是一个编译好的文件夹,再放到 tomcat 的 webapps 目录下,如果是 war 包,会自动解压出来.而 Spring B ...
- Springboot 项目源码 Activiti6 工作流 vue.js html 跨域 前后分离 websocket即时通讯
特别注意: Springboot 工作流 前后分离 + 跨域 版本 (权限控制到菜单和按钮) 后台框架:springboot2.1.2+ activiti6.0.0+ mybaits+maven+接 ...
- JS 获取元素、修改元素/css样式/标签属性、简单事件、数据类型
基本使用 写在Script 标签里 引入外部js文件:<script src=" "></script> console.log(" " ...
- python基础之字符串讲解(下)
7.swapspace 这个命令是让大小写翻转 s = 'qwerQ' s3 = s.swapcase() print(s3) 8.title 每个隔开(特殊字符或者数字)的单词首字母大写 s = ' ...
- [小技巧]你真的了解C#中的Math.Round么?
今天在某.NET Core 群中看到有人在问Math.Round的问题.其实这个问题之前有很多人遇到了,在此总结一下. 开发者为了实现小数点后 2 位的四舍五入,编写了如下代码, var num = ...
- Hyperledger Fabric私有数据
官方文档:点这里 1简介 在同一个通道中,允许某一组织在对同一通道内其他组织保持部分的数据私有.也就是说有一部分被标识为私有的数据只能具有权限的组织查看和操作,而其余组织不具备查看和操作私有数据的权限 ...
- Java 添加超链接到Word文档
对特定元素添加超链接后,用户可以通过点击被链接的元素来激活这些链接,通常在被链接的元素下带有下划线或者以不同的颜色显示来进行区分.按照使用对象的不同,链接可以分为文本超链接,图像超链接,E-mail链 ...
- jQuery淡入淡出轮播图实现
大家好我是 只是个单纯的小白,这是人生第一次写博客,准备写的内容是Jquery淡入淡出轮播图实现,在此之前学习JS写的轮播图效果都感觉不怎么好,学习了jQuery里的淡入淡出效果后又写了一次轮播图效果 ...
- js-07-事件
一.js事件绑定在对象上的三种方法 a:将事件绑定在元素标签的属性上 <h3 onclick="console.log('奥特曼打怪兽')">海绵宝宝历险记</h ...
- Dynamics 365 Customer Engagement的标准导入不支持并行导入了吗?
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...