KiSystemCall64 win10 21h2函数流程分析 3环到0环
0x00基本信息
系统:windows 10 21h2
工具:ida 7.7 , windbg 10
3环写一个win32k 函数 看访问流程
0x01分析
例如:3环函数
FlattenPath(x)
会调用到 win32u.dll 的 NtGdiFlattenPath eax=12a0 ssdt 表的下标地址就是 2a0 就是他的映射地址
.text:0000000180006430 public NtGdiFlattenPath
.text:0000000180006430 NtGdiFlattenPath proc near ; DATA XREF: .rdata:000000018000CE4D↓o
.text:0000000180006430 ; .rdata:off_18000F178↓o ...
.text:0000000180006430 mov r10, rcx
.text:0000000180006433 mov eax, 12A0h
.text:0000000180006438 test byte ptr ds:7FFE0308h, 1
.text:0000000180006440 jnz short loc_180006445
.text:0000000180006442 syscall ; Low latency system call
.text:0000000180006444 retn
windbg查看rdmsr 看到KiSystemCall64 地址
rdmsr 0xC0000082
下断点注意不要在 KiSystemCall64 地址下断点 会报错 3行汇编是堆栈切换 不要下断点
.text:00000001404088C0 ; __unwind { // KiSystemServiceHandler
.text:00000001404088C0 swapgs
.text:00000001404088C3 mov gs:10h, rsp
.text:00000001404088CC mov rsp, gs:1A8h
.text:00000001404088D5 push 2Bh ; '+'
可以在KiSystemCall64 偏移15位置下断点 就可以断下
ba e1 KiSystemCall64+15
直接分析到 KiSystemServiceStart 取下标
.text:0000000140408C20 KiSystemServiceStart: ; DATA XREF: KiServiceInternal+5A↑o
.text:0000000140408C20 ; .data:0000000140C00340↓o
.text:0000000140408C20 mov [rbx+90h], rsp
.text:0000000140408C27 mov edi, eax
.text:0000000140408C29 shr edi, 7
.text:0000000140408C2C and edi, 20h
.text:0000000140408C2F and eax, 0FFFh ; 取下标
获取FlattenPath 0环地址
.text:0000000140408C5E loc_140408C5E: ; CODE XREF: KiSystemCall64+389↑j
.text:0000000140408C5E cmp eax, [r10+rdi+10h]
.text:0000000140408C63 jnb loc_140409195
.text:0000000140408C69 mov r10, [r10+rdi]
.text:0000000140408C6D movsxd r11, dword ptr [r10+rax*4] ; 获取地址
.text:0000000140408D90 KiSystemServiceCopyEnd: ; CODE XREF: KiSystemCall64+413↑j
.text:0000000140408D90 ; DATA XREF: KiSystemServiceHandler+27↑o ...
.text:0000000140408D90 test cs:KiDynamicTraceMask, 1
.text:0000000140408D9A jnz loc_140409233
.text:0000000140408DA0 test dword ptr cs:PerfGlobalGroupMask+8, 40h
.text:0000000140408DAA jnz loc_1404092A7
.text:0000000140408DB0 mov rax, r10
.text:0000000140408DB3 call rax
.text:0000000140408DB5 nop dword ptr [rax]
call rax 下断点 也可以直接下偏移断点
ba e1 KiSystemServiceCopyEnd+0x20
nt!_guard_retpoline_indirect_rax 跟进去
call nt!_guard_retpoline_indirect_rax (fffff803`36c1b2e0)
继续f11 一个ret 返回就可以跳到 win32k!NtGdiFlattenPath:
fffff803`36c1b2ff e81c000000 call nt!_guard_retpoline_indirect_rax+0x40 (fffff803`36c1b320)
这里的
ffffd004`2246b268 e833f00800 call ffffd004`224fa2a0
也是直接f11 和上边一样
成功到实际汇编代码 这就看到一个函数内核实现了 可以分析调试了
win32kfull!NtGdiFlattenPath:
ffffd004`238dde70 4053 push rbx
ffffd004`238dde72 4881ecb0000000 sub rsp,0B0h
ffffd004`238dde79 488bd1 mov rdx,rcx
ffffd004`238dde7c 488d4c2420 lea rcx,[rsp+20h]
ffffd004`238dde81 e88e85dcff call win32kfull!DCOBJ::DCOBJ (ffffd004`236a6414)
ffffd004`238dde86 488b4c2420 mov rcx,qword ptr [rsp+20h]
ffffd004`238dde8b 4885c9 test rcx,rcx
ffffd004`238dde8e 7507 jne win32kfull!NtGdiFlattenPath+0x27 (ffffd004`238dde97)
当然最方便的是 3环下断点 直接步过到内核 进行调试
bp win32kfull!NtGdiFlattenPath
记住要记载符号 win32kfull.sys 可以用.reload 命令
KiSystemCall64 win10 21h2函数流程分析 3环到0环的更多相关文章
- Windows系统调用中API从3环到0环(下)
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html Windows系统调用中API从3环到0环(下) 如果对API在 ...
- Windows系统调用中API从3环到0环(上)
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html Windows系统调用中API从3环到0环(上) 如果对API在三 ...
- 64位CreateProcess逆向:(二)0环下参数的整合即创建进程的整体流程
转载:https://bbs.pediy.com/thread-207683.htm 点击下面进入总目录: 64位Windows创建64位进程逆向分析(总目录) 在上一篇文章中,我们介绍了Create ...
- 洛谷3953 (NOIp2017) 逛公园——记忆化搜索+用栈判0环
题目:https://www.luogu.org/problemnew/show/P3953 因为K只有50,所以想到用dp[ cr ][ j ]表示在点cr.比最短路多走了 j 的方案数.(看了TJ ...
- Hogp连接流程分析
当BLE设备已经完成配对,并且完成GATT服务的搜索,下一步就开始profile 的连接流程了,一般LE设备都是走的HOGP的流程,我们这篇文章就分析一下hogp的连接流程. 连接是从framewor ...
- Windows进程创建的流程分析
. 创建进程的大体流程: 创建进程的过程就是构建一个环境,这个环境包含了很多的机制 (比如自我保护, 与外界通信等等). 构建这个环境需要两种"人"来协调完成(用户态和内核 ...
- rest_framework框架之认证功能的使用和源码实现流程分析
rest_framework框架之认证的使用和源码实现流程分析 一.认证功能的源码流程 创建视图函数 Note 创建视图函数后,前端发起请求,url分配路由,执行视图类,视图类中执行对应方法必须经过d ...
- freeswitch呼叫流程分析
今天翻文档时发现之前整理的关于freeswitch呼叫相关的内容,写成博文分享出来也方便我以后查阅. 整体结构图 FreeswitchCore 模块加载过程 freeswitch主程序初始化时会从mo ...
- u-boot 流程分析
u-boot 介绍: 对于计算机来说 , 从一开始上机通电是无法直接启动操作系统的 , 这中间需要一个引导过程 , 嵌入式Linux系统同样离不开引导程序 , 这个启动程序就叫启动加载程序(Boot ...
随机推荐
- git -remote: Support for password authentication was removed on August 13, 2021
克隆代码时,报错: Support for password authentication was removed on August 13, 2021. Please use a personal ...
- spring cloud --- 使用 actuator 热更新【刷新】单机配置文件
1.前言 分布式微服务想要热更新配置文件,还需要 消息中间件 配合使用 ,一般使用 rabbitMQ 或 Kafka ,这里不解释 . 这篇随笔 只讲解 底层的 单机热更新配置文件 2.环境 spri ...
- vue iview element-ui兼容IE11浏览器
首先安装babel-polyfill npm install babel-polyfill --save-dev 入口文件引用,在main.js中引用 import 'babel-polyfill' ...
- MATLAB中拟合算法刚入门
%%%1.拟合问题:(做预测,主要使用的范围是样本比较小,拟合效果会好,样本比较多,拟合的效果就不是很好) 1.应用预测的场景:已经知道10年的样本,预测第11年以内的数据 2.用拟合的到关系式:样本 ...
- access偏移注入原理
前言:近段时间在学习access偏移注入时,在网上查询了大量的资料,感觉很多资料讲解的十分模糊并且我个人认为有很多不够严谨的地方,于是我便在线下经过大量测试,写出以下文章,如有错误,望指出. 如要转载 ...
- 《剑指offer》面试题51. 数组中的逆序对
问题描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4] 输出: 5 限制: ...
- Javascript对象数据类型(键值对)的创建和使用方法
对象数据类型(键值对) 1.创建键值对 var arry={name:"小明",age:20,isgey:falet} // var 键值对名 = {键:值,键:值} 2.增加键值 ...
- [STM32F4xx 学习] 如何在RAM中调试程序
在RAM中调试程序指的是将程序下载到RAM里面(而不是Flash里面),然后在RAM中执行程序.调试. 为什么要在RAM中调试程序?总结起来有以下两点原因: 1. Flash 擦写次数有限,STM32 ...
- 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引
系列背景 在进入微服务的实践系列之前,我们一起来学习和实践一下.NET应用开发生态中一些比较重要的技术,这个系列就是关于GraphQL在.NET 6应用中的实现. 系列导航 使用Hot Chocola ...
- Redis的几点积累
1.Redis比memcache快 Redis具有事务,持久化等机制,但是它还能做到高性能,原因包括如下: Libevent.和Memcached不同,Redis并没有选择libevent.Libev ...