Windows内核新手上路1——挂钩SSDT
Windows内核新手上路1——挂钩SSDT
这个系列记录学习我学习windows内核的点点滴滴,高手请直接无视。
文章核心内容:挂钩SSDT中函数列NtOpenProcess,NtDuplicateObject,NtCreateThread,NtOpenThread,NtWriteVirtualMemory,过滤进程操作来保护目标进程空间。
SSDT的全称是System Services Descriptor Table,系统服务描述符表。这个表把ring3的Win32 API和ring0的内核API联系起来。SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。
SSDT管的是与系统相关的函数(kernel32.dll、ntdll.dll)。通过修改此表的函数地址可以对常用windows函数及API进行hook,从而实现对一些关心的系统动作进行过滤、监控的目的。一些HIPS、防毒软件、系统监控、注册表监控软件往往会采用此接口来实现自己的监控模块。
SSDT在Win32子系统的内核实现是NTOSKRNL.EXE,导出表名是 KeServiceDescriptorTable,对应系统进程一般有System
SSDT结构:
typedef struct tagSSDT {
PULONG pSSDTBase; //SSDT在内存中的基址
PVOID pServiceCounterTable;
ULONG uNumberOfServices; //SSDT项个数
PUCHAR pParamTableBase;
} SSDT, *PSSDT; //SSDT
1 如何挂钩SSDT
首先关闭CR0写保护(通过改变CR0寄存器的WP位),然后用新的函数地址替换原来SSDT中的函数地址,最后恢复CR0写保护。
挂钩SSDT中函数列NtOpenProcess,NtDuplicateObject,NtCreateThread,NtOpenThread,NtWriteVirtualMemory,过滤进程操作来保护目标进程空间。
1.1NtOpenProcess
在Windows操作系统中,kernel32!OpenProcess通过调用ntdll!NtOpenProcess最终转到内核态的nt!NtOpenProcess,通过挂钩NtOpenProcess,可以过滤和拦截进程打开其他进程的操作。
在自定义的NtOpenProcess函数中,首先获取要打开的进程PID,判断该PID是否是被保护的进程,如果是被保护的进程,则去掉打开权限中的相应权限,如果是打开本系统R3进程,还要去掉结束进程的权限,最终,再调用真实的NtOpenProcess函数,最后返回给R3的进程句柄就无法读写操作受保护的进程,恶意程序也无法结束目标进程。
通过进程句柄获取PID 判断是否受保护的PID 如果是 做一些权限的处理…. 调用真实NtOpenProcess 如果否 调用真实的NtCreateThread |
代码1.1 MyNtOpenProcess
1.2NtDuplicateObject
Windows系统提供了一个函数DuplicateHandle,用于从其他进程复制一个句柄到当前进程,而且csrss.exe进程会保存所有进程的句柄,通过调用DuplicateHandle从csrss中复制句柄,可以间接的达到调用OpenProcess获取目标进程句柄的目的。
在定义的NtDuplcateObject函数中,首先调用真实的NtDuplicateObject,如果调用成功,判断最后返回的句柄是不是受保护进程的句柄,如果是受保护的进程句柄,则关闭之。通过这样的过滤,恶意程序无法通过调用DuplicateHandle来打开受保护的进程。
1.3NtCreateThread
R3中在进程中和其他进程中创建线程(分别调用CreateThread和CreateRemoteThread)最终通过ntdll!NtCreateThread转到内核态的nt!CreateThread,通过过滤nt!CreateThread可以防止恶意程序在受保护的进程中创建远程线程(即调用CreateRemoteThread)。实现的MyNtCreateThread处理流程如代码1.2所示:
通过进程句柄获取PID 判断是否受保护的PID 如果是 返回STATUS_ACCESS_DENIED 如果否 调用真实的NtCreateThread |
代码1.2 MyNtCreateThread
1.4NtOpenThread
在windows操作系统中,通过调用OpenThread可以获取目标线程的句柄,进一步通过此句柄操作目标线程。防密码窃取系统挂钩了NtOpenThread来防止恶意程序操作受保护进程的线程。
在自定义的NtOpenThread函数中,首先获取线程所在进程的PID,然后判断该PID是否被保护,如果是被保护的PID,则直接返回STATUS_ACCESS_DENIED,否则调用真实的NtOpenThread。
1.5NtWriteVirtualMemory
在windows操作系统中,进程可以调用kernel32!WriteProcessMemory来写其他进程内存,kernel32!WriteProcessMemory通过ntdll!NtWriteVirtualMemory转到内核态的nt!NtWriteVirtualMemory。通过挂钩nt!NtWriteVirtualMemory来防目恶意程序写受保护的进程内存。伪代码如代码1.3所示。
通过进程句柄获取PID 判断是否受保护的PID 如果是 返回STATUS_ACCESS_DENIED 如果否 调用真实的NtWriteVirtualMemory |
代码1.3 MyNtWriteVirtualMemory
Windows内核新手上路1——挂钩SSDT相关推荐
- Windows内核新手上路2——挂钩shadow SSDT
Windows内核新手上路2--挂钩shadow SSDT 文章核心内容:安全软件窗口保护.安全输入.截屏保护的一些思路.挂钩NtUserFindWindowEx.NtUserGetForegroun ...
- Windows内核新手上路3——挂钩KeUserModeCallBack
Windows内核新手上路3--挂钩KeUserModeCallBack 1. 简介 在Windows系统中,提供了几种方式从R0调用位于R3的函数,其中一种方式是KeUserModeCall ...
- 玩转RT-Thread之荔枝派Nano(全志F1C100S) 新手上路
玩转RT-Thread之荔枝派Nano(全志F1C100S) 一.新手上路 --作者:燕十三(flyingcys) blog:http://blog.csdn.net/flyingcys --荔枝派n ...
- 轻松玩转树莓派Pico之一、新手上路
目录 1.开发板介绍 2.芯片介绍 3.环境搭建 (1)sdk/example下载 (2)文档下载地址 (3)交叉编译器安装 4.编译example 5.运行example 1.开发板介绍 树莓派-P ...
- windows 内核情景分析
原文很长:先转部分过来,有时间看一下: 一 windows 内核情景分析---说明 说明 本文结合<Windows内核情景分析>(毛德操著).<软件调试>(张银奎著).< ...
- Windows内核系统调用分析
系统调用 进程 --> 调用OS API:OS进程管理 --> 调配进程. 仅从用户进程角度,OS就像是一个被动响应的运行时库.Windows提供了一个系统调用界面作为外层,即Win32A ...
- Windows内核的表学习总结
SSDT - 系统服务描述符表 SSDT(System Services Descriptor Table),系统服务描述符表.这个表就是一个把ring3的Win32 API和ring0的内核函数联系 ...
- Windows内核API HOOK 之 Inline Hook
来源:CSDN 作者:daiwen 名字起得好,Inline hook,乍一听,似乎很高深.此处的Inline,我以为,意指将汇编代码直接写入内核API的内存区域.Inline Hook不像用户态 ...
- 路由器配置(新手上路,比较全面,强烈推荐)
路由器配置(新手上路,比较全面,强烈推荐) 第一章 路由器配置基础 一.基本设置方式 二.命令状态 三.设置对话过程 四.常用命令 五.配置IP寻址 六.配置静态路由 第二章 广域网协议设置 一.HD ...
最新文章
- java 数据库 流式查询_关于mybatis:强大MyBatis-三种流式查询方法
- 云栖专辑|阿里开发者们的第二个感悟:PG大V德哥的使命感与开放心态
- 上传图片到第三方服务器
- Python-random标准库知识小结
- Android模拟器无法上网问题
- 使用JBehave,Gradle和Jenkins的行为驱动开发(BDD)
- c/c++ 编程试题
- UE4角色Location远距离时动画抖动问题(float精度不够)解决方案
- nginx反代+varnish缓存+后端LAMP平台集群实现
- opencv3.4.x和opencv4.x中 cv2.findContours的不同 ValueError: too many values to unpack (expected 2)
- 华为电脑和手机一碰传_华为手机怎么一碰传连接电脑传输照片和文件
- Win10设置屏保时间
- POJ3658Matrix( 双重二分+负数+死循环)
- Eclipse4.6(neno)手动配置Tomcat插件
- 寒假每日一题 2 : 干草堆 java
- lol无限火力服务器卡顿,LOL无限火力无限彗星BUG是什么? 无限彗星超强卡BUG技巧Get起来...
- matlab只显示y一部分,突出显示matlab图的部分内容
- android 混淆后的机制,Android 代码混淆机制
- 《流浪地球》票房:预测10亿却飚50亿 ,大数据预测为什么这么难...
- 海外服务器被攻击怎么办?IP被封要如何处理?