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: ...
随机推荐
- 关于eclipse码代码时光标自动消失要重新点击输入框的问题
前几天码代码时在两个电脑都出现了同样的问题,就是在输入的时候,输入法突然从程序框切换到某不可名状的位置,要重新点击输入框才能解决.(后发现不但是eclipse,任何带有输入框的都会出现此问题) 经排查 ...
- Unity5优秀插件分享
转载请标明原文地址:http://www.cnblogs.com/zhangyukof/p/6836001.html 天空盒:1.SkyboxesUnity4中自带的天空盒,经常用到.不知道为什么U ...
- 【开发必备】2018最新中国国内可用API合集
中国国内可用API合集 笔记 OneNote - OneNote支持获取,复制,创建,更新,导入与导出笔记,支持为笔记添加多媒体内容,管理权限等.提供SDK和Demo. 为知笔记 - 为知笔记Wind ...
- MySql全文检索使用详解
实际项目中经常会有一个字段存储多个值用逗号分隔的场景,当分开查询的时候,使用模糊查询会非常影响效率.mysql提供了全文检索函数可以有效解决这一问题: 1.数据结构 ID CODE MSG 1 111 ...
- 基于HTML的购物车模型的代码设计
HTML代码 <html lang="en"> <head> <meta charset="UTF-8"> < ...
- 萌新入门Github请看这里,学不会远程教
一些废话 本文的主旨是为初次接触Github的同学提供一个入门的教程,如果你已经是Github老鸟,可以忽略本文哦,另外本文只是抛砖引玉,其实最好的教程是官方文档!!! Github官网 Github ...
- 剑指offer题解(Java版)
剑指offer题解(Java版) 从尾到头打印链表 题目描述 输入一个链表,按从尾到头的顺序返回一个ArrayList. 方法1:用一个栈保存从头到尾访问链表的每个结点的值,然后按出栈顺序将各个值存入 ...
- C#程序编写高质量代码改善的157个建议【20-22】[泛型集合、选择集合、集合的安全]
建议20.使用泛型集合来替代非泛型集合 http://www.cnblogs.com/aehyok/p/3384637.html 这里有一篇文章,是我之前专门来介绍泛型的.我们应尽量的使用泛型集合.因 ...
- Sql Server数据库常用Transact-SQL脚本
数据库 1.创建数据库 USE master ; GO CREATE DATABASE Sales ON ( NAME = Sales_dat, FILENAME = 'C:\Program File ...
- Please ensure the argon2 header and library are installed
在CentOS上安装libargon2和libargon2-devel即可 yum install -y libargon2 libargon2-devel