滴水逆向系统调用

一、API函数调用过程(3环部分)

在这里插入图片描述

ReadProcessMemory调用其他模块中的_NtReadVirtualMemory函数
_NtReadVirtualMemory函数在ntdll.dll模块中
在这里插入图片描述
0BAH是一个编号,对应操作系统内核函数的编号。7FFE0300h存放的是一个函数,决定了我们用什么方式进0环
在这里插入图片描述
在这里插入图片描述

二、API函数的调用过程(3环进0环 上)

在这里插入图片描述
在这里插入图片描述
7FFE0300h为SystemCall
在这里插入图片描述
执行了cpuid指令后,SEP的第11位为1表示支持sysenter/sysexit指令,为0表示不支持
如果支持sysenter/sysexit指令,会将nedll.dll!KiFastSystemCall函数放到_KUSER_SHARED_DATA+0x300中,不支持则将ntdll.dll!KiIntSystemCall函数放到_KUSER_SHARED_DATA+0x300中

在这里插入图片描述
所有的API进入内核的中断号都是2E
在这里插入图片描述
在这里插入图片描述

三、API函数的调用过程(3环进0环 下)

在这里插入图片描述
在这里插入图片描述
0x2e号中断函数进入到了内核模块
在这里插入图片描述
通过sysenter进入0环,cs、ss、eip、esp的值全都来自于MSR寄存器
当执行sysenter指令时,CPU会将MSR中的对应的CS、ESP、EIP的值存入对应的寄存器中。SS段的值并没有写到MSR寄存器中,IA32_SYSENTER_CS的值加上8就是SS的值
在这里插入图片描述
内核模块的选择取决于操作系统的分页模式,10-10-12分页选择ntoskrnl.exe模块,2-9-9-12分页选择ntkrnlpa.exe模块
在这里插入图片描述
在这里插入图片描述

四、API函数的调用过程(保存现场)

在这里插入图片描述
了解KiSystemService需要了解几个结构体
无论是通过中断门还是KifastcallEntry进入0环,三环的所有寄存器都会存到Trap_Frame结构体中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
中断门当权限发生变化时,中断门会像0环堆栈中压入五个值,分别是三环的ss,三环的esp,三环的eflag,三环的cs还有三环的eip
中断门进入0环提权会压入这五个值,KiSystemService在开始执行时Trap_Frame结构体中就有五个值了
如果通过KiFastCallEntry进入0环是没有这五个值的
从这个角度讲可以理解操作系统为什么会设置两个函数进入0环
在这里插入图片描述
有些情况中断门会压入六个值,push 0为了补齐
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将三环的ExceptionList压栈,0FFDFF000是KPCR的地址,0FFDFF124是KPRCB中的CurrentThread
在这里插入图片描述
KThread+0x140是先前模式,也压入到堆栈中
在这里插入图片描述
sub esp,48h esp指向Trap_Frame结构体的头
esi指向KTHREAD,KTHREAD+134h指向Trap_Frame,要将栈中形成的Trap_Frame替换原来KTHREAD+134h处的Trap_Frame
在这里插入图片描述
在这里插入图片描述
判断esi+0x2c DebugActive是否为-1,如果处于调试状态,跳转,将调试寄存器压入到Trap_Frame中。如果不是处于调试状态中,向下执行跳转KiFastCallEntry中的代码
在这里插入图片描述

五、API函数的调用过程(系统服务表)

在这里插入图片描述
在这里插入图片描述
系统服务表中ServiceTables是一个指针,指向一张表,表中存储的是函数的地址。Count表示系统服务表被调用了多少次。ServiceLimit表示系统服务表中一共有多少个函数。ArgentTable指向另一张表,表中数据以字节为单位,表中存储函数参数的个数,如果传递两个参数,每个参数四字节,表中值为8。系统服务表中的函数全是内核文件(Ntoskrl.exe)导出的函数,
并不是内核文件中所有的函数,只是一部分。
系统服务表有两个,第二个系统服务表中所有的函数来自Win32k.sys模块,Win32k.sys模块中是与图形显示以及用户界面相关的系统服务。
如果我们画一个窗口,会使用user32.dll,user32.dll调用GDI32.dll实现画界面功能,GDI32.dll也只是接口,实现全在Win32k.sys系统内核中
在这里插入图片描述
CPU只要找到当前线程就能得到系统服务表
在这里插入图片描述
三环调用零环函数时候是传递了一个系统服务号,在三环是放到eax寄存器中了,系统服务号决定了函数在哪里,参数在哪里。
系统服务号只使用了低十三位,下标12的位置为0代表要找的函数在第一张表里,为1代表要找的函数在第二张表里。
低十二位对应函数表中的索引
在这里插入图片描述
把三环传进来的服务号赋值给edi,将服务号右移八位和30h比较,查看服务号下标12的位置是0还是1,决定查看哪张系统服务表
吧服务号中的函数索引和系统服务表中的第三个成员函数个数比较,看是否超出总个数,如果超出跳转越界
查看是否要调用第二张系统服务表,如果是的话,调用KeGdiFlushUserBatch函数
在这里插入图片描述
在这里插入图片描述
edx存储三环传入函数参数的指针,得到三环传入参数的个数cl,提升堆栈高度cl,shr ecx 2和rep movsd这两行代码配合看,为了得到参数个数
cmp esi,ds:_MmUserProbeAddress为了查看用户程序能访问地址的最大范围,有没有越界
在这里插入图片描述

六、API函数的调用过程(SSDT)

在这里插入图片描述
KeServiceDescriptorTable中总共有四张表,xp系统中第三和第四张表没有使用,但是我们只能看见一张表,需要使用KeServiceDescriptorTableShadow来查看
KeServiceDescriptorTable为ntoskrl.exe模块导出的全局变量,KeServiceDescriptorTableShadow并没有导出
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本资源为非常不错的一套王网传资源,是继之前上传的基础班的升级版,更加全面,资源过大,上传乃是下载链接,如失效请留言!!!资源远大于5积分,不多说,下面直接上目录: APC机制 I5 J$ i: U0 f1 r: O9 B( Q" b │ 01 APC的本质.mp4 │ 02 备用Apc队列.mp4: U8 p7 ]3 f" w$ b0 ?5 Z9 `0 H8 G* [ │ 03 APC挂入过程.mp48 g! H4 s1 V; ]+ b4 Y9 H0 L- B │ 04 内核APC执行过程.mp4 │ 05 用户APC执行过程.mp4 │ ├─事件等待' x% `" J' } ?& S: t' ]# I5 \5 G │ 01临界区.mp4- o( U$ W9 O+ ` ~0 u4 ~, @. \ │ 02 自旋锁.mp4) c3 ~. J& L, V& s. Q8 x/ [. w │ 03 线程等待与唤醒.mp4# b* ^" k$ d# O3 f8 t8 a3 k │ 04 WaitForSingleObject函数分析.mp4$ V7 L' C3 I( W │ 05 事件.mp4 │ 06 信号量.mp4 │ 07 互斥体.mp4 │ ├─保护模式- }! n! C$ O/ s" Q │ 014 中断门.mp4, B' i, r7 Y: B3 |! N( ^6 { l9 F │ 015 陷阱门.mp4 │ 017 任务段_下.mp4, |/ M# A: K3 T7 i* Q/ ? I& o& D; p │ 018 任务门.mp46 m. D+ f4 _/ V) ~9 S& B │ 019 10-10-12分页.mp4 │ 020 PDE_PTE.mp4 │ 021 PDE_PTE属性(P_RW).mp43 ~/ ]1 x5 {4 u: {$ I │ 022 PDE_PTE属性(US_PS_A_D).mp4 │ 023 页目录表基址.mp4 │ 024 页表基址.mp4$ A f' [+ g6 }5 F; e │ 025 2-9-9-12分页.mp4 │ 026 2-9-9-12分页(下).mp4- ~' ~9 i0 T5 f" p2 U$ j │ 027 TLB.mp4 │ 028 中断与异常.mp4 │ 029 控制寄存器.mp46 j2 l3 j) O# {% {4 w │ 030 PWT_PCD属性.mp4 │ 031 保护模式阶段测试.mp4 │ _001 保护模式.mp4, I; c5 X ~) t1 d1 }8 S# f3 i: b │ _002 段寄存器结构.mp48 n- |- i( H$ ^* f │ _003 段寄存器属性探测.mp4 │ _004 段描述符与段选择子.mp4 │ _005 段描述符属性_P位_G位.mp4 │ _006 段描述符属性_S位_TYPE域.mp4 │ _007 段描述符属性_DB位.mp4 │ _008 段权限检查.mp4 │ _009 代码跨段跳转流程.mp4& S# i9 i- \0 D" @1 U- P │ _010 代码跨段跳转实验.mp4" @* S2 Y- a- S6 n7 n: ~ │ _011 长调用与短调用.mp4 │ _012 调用门_上.mp4; [) _2 c8 A5 F% }! u% ]: ~. N │ _013 调用门_下.mp4 │ ├─内存管理 │ 01 线性地址的管理.mp4; ? |+ ^5 i& } │ 02 Private Memory.mp4* @3 B( Y6 ^ y- { │ 03 Mapped Memory.mp4 │ 04 物理内存的管理.mp4' [8 C6 q \1 H8 w" H2 ]0 Y │ 05 无处不在的缺页异常.mp4 │ ├─句柄表 │ 01 句柄表.mp4 │ 02 全局句柄表.mp4 │ 5 h" u" i& {+ G4 T+ E ├─异常 │ 01 CPU异常记录.mp4 │ 02 模拟异常记录.mp4: K0 J( d1 n4 ] Q │ 03 内核异常的处理流程.mp4 │ 04 用户异常的分发.mp4 │ 05 VEH.mp4 C F6 A% j# M* @- h% N │ 06 SEH.mp4 │ 07 编译器扩展SEH课堂代码_1.mp42 I" @1 i1 b% G6 o4 O% j: t │ 08 编译器扩展SEH_2.mp4 │ 09 编译器扩展SEH_3.mp4 │ 10 编译器扩展SEH_4.mp4 │ 11 未处理异常.mp4. m' z+ `$ v- R/ K. `/ \2 M, S │ ├─消息机制0 y7 o3 ?7 X7 Z, F" I( Q │ 01 消息队列在哪.mp4$ {& n5 ]* g' H, W# k6 |+ M │ 02 窗口与线程.mp4 │ 03 消息的接收.mp4- a8 k- Q8 {! I* T8 L7 j │ 04 消息的分发.mp4- M* `$ q% z, y, R │ 05 内核回调机制.mp4 │ 0 ]( v: v$ e% _/ v, e ├─系统调用: |5 y7 Y% q' w, J │ 001 API函数的调用过程(3环部分).mp4; }0 Z8 P$ g# I6 \! _ y │ 002 API函数的调用过程(3环进0环 上).mp4- g. o" u+ M1 Y) x │ 003 API函数的调用过程(3环进0环 下).mp46 p* w2 @* j9 ?% Z3 e$ \: ? │ 004 API函数的调用过程(保存现场).mp44 G8 |/ j3 ^8 ?1 D9 Y │ 005 API函数的调用过程(系统服务表).mp4 │ 006 API函数的调用过程(SSDT).mp4 │ ! A- ~, L8 M. l ├─软件调试% a8 o, z* m) E$ M( \" P D! m7 x4 B │ 01 调试对象.mp4 c- K+ k3 F( v3 p2 R9 E$ n$ f: Z6 k) @ │ 02 调试事件的采集.mp4 │ 03 调试事件的处理.mp4( w" W. m) o: D3 P7 ? │ 04 异常的处理流程.mp4 │ 05 软件断点.mp4 │ 06 内存断点.mp4 │ 07 硬件断点.mp4 │ 08 单步异常.mp4% P5 e* U+ M# a1 j3 D6 n; n │ 09 单步步过.mp4 │ 10 硬件HOOK过检测.mp46 H5 q2 K& X1 u$ ]/ E │ ├─进程与线程 │ 001 进程结构体.mp4 │ 002 线程结构体.mp41 `5 e+ [1 U) j │ 003 KPCR.mp4 │ 004 等待链表_调度链表.mp41 m! T& `3 t' U& U# A- @+ _ │ 005 模拟线程切换.mp4& ?, D% H/ z- d# _& \$ X- X$ U │ 006 Windows线程切换_主动切换.mp4 │ 007 Windows线程切换_时钟中断切换.mp4/ s& N% Y5 B" @2 g │ 008 Windows线程切换_时间片管理.mp48 X( v. g" T0 ~- k! v* Q │ 009 Windows线程切换_TSS.mp4 n+ A9 L5 B2 t* M# H │ 010 Windows线程切换_FS.mp4 │ 011 Windows线程切换_线程优先级.mp4 A! a% n1 c. Y5 y# ~ L4 P │ 012 进程挂靠.mp4 │ 013 跨进程读写内存.mp4, E0 ^0 U I1 h │ $ {. ?; O) C* w1 K. q) K └─驱动开发 01 驱动开发环境配置.mp4* W) g2 z& T/ _; @1 V" n 02 第一个驱动程序.mp4 03 如何调试驱动程序.mp4; [8 U2 T) B' V 04 内核编程基础.mp4 05 内核空间与内核模块.mp4 06 0环与3环通信(常规方式).mp46 O: Z; `3 `( L 07 SSTD HOOK.mp46 D t( {, u1 D/ x) h! ]: g 08 Inline Hook.mp4 09 多核同步之临界区.mp40 l& ^, e3 J( E1 d( b2 S 10 多核同步之自旋锁.mp4 11 重载内核

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值