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: ...
随机推荐
- LCT能干啥???
LCT能干啥 模板: 维护可加的树链信息:询问都是一条链上的信息:维护方式和线段树差不多: 增加一条边: 删除一条边: 修改一个点权: 修改一条路径上的所有点的点权: 整体来说 ...
- dev gridcontrol设置过滤器下拉列表
调用: //为类别名称列启用选中的过滤器下拉式样式. ].OptionsFilter.FilterPopupMode = FilterPopupMode.CheckedList; //订阅ShowFi ...
- VS2019 开发Django(七)------VS2019不能格式化html代码
如题,在VS2019中不能使用快捷键Ctrl+K,+D格式化html代码,印象中之前的版本是可以的吧!不太确定,这给我带来了很大的麻烦,在编写Django项目的时候,标准的模板是新建的html文件,不 ...
- 用Python抢到回家的车票,so easy!
“ 盼望着,盼望着,春节的脚步近了,然而,每年到这个时候,最难的,莫过于一张回家的火车票. 据悉,今年春运期间,全国铁路发送旅客人次同比将增长 8.0%.达到 4.4 亿人次. 2020 年铁 ...
- 参加杭州 2019 AI Bootcamp有感与总结(1)
上周末参加了微软人工智能的活动,感慨多多. 感谢活动主讲和主办方. 通过参加活动,对微软认知服务和ML.NET的现状与发展有了更多的认识.文章不是活动内容的堆叠,总结少点,更多的大概是感慨. 微软认知 ...
- Spring Boot 项目维护全局json数据
1:概述 过去 我们在每一个方法中处理前端发过来的请求,需要自己构造请求数据,然后通过spring 提供的@ResponseBody 强制转为JSON数据吗,实际上出现了很多重复的代码,我么亦可以通过 ...
- 再窥R(包括一个R示例)
一.将输出作为输入——结果的重用 R有个特点,分析的结果可以保存下来,并可以作为进一步分析的输入使用.下面我们通过R中的预先安装好的数据集作为实例(这里只讲述原理,涉及到的统计知识,以后在另外的统计专 ...
- 4. java基础之修饰符
其他修饰符 public 可以修饰属性.方法.构造方法.类 protected 可以修饰属性.方法.构造方法 default 可以修饰属性.方法.构造方法.类 private 可以修饰属性.方法.构造 ...
- 大疆无人机 Android 开发总结——视频解码
DJI_Mobile_SDK是大疆为开发者提供的开发无人机应用的开发接口,可以实现对无人机飞行的控制,也可以利用无人机相机完成一些视觉任务.目前网上的开发教程主要集中于DJI 开发者社区,网上的资源非 ...
- VMware安装vmtools实现宿主机和虚拟机共享粘贴板
打开VMware以Ubuntu14.04.6为例,保持网络畅通,在线下载工具包 下载完成后dvd下出现该压缩包 将其复制到桌面并在桌面进入终端 执行命令: tar -zxvf xxxx.tar.gz ...