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相关推荐

  1. Windows内核新手上路2——挂钩shadow SSDT

    Windows内核新手上路2--挂钩shadow SSDT 文章核心内容:安全软件窗口保护.安全输入.截屏保护的一些思路.挂钩NtUserFindWindowEx.NtUserGetForegroun ...

  2. Windows内核新手上路3——挂钩KeUserModeCallBack

    Windows内核新手上路3--挂钩KeUserModeCallBack 1.     简介 在Windows系统中,提供了几种方式从R0调用位于R3的函数,其中一种方式是KeUserModeCall ...

  3. 玩转RT-Thread之荔枝派Nano(全志F1C100S) 新手上路

    玩转RT-Thread之荔枝派Nano(全志F1C100S) 一.新手上路 --作者:燕十三(flyingcys) blog:http://blog.csdn.net/flyingcys --荔枝派n ...

  4. 轻松玩转树莓派Pico之一、新手上路

    目录 1.开发板介绍 2.芯片介绍 3.环境搭建 (1)sdk/example下载 (2)文档下载地址 (3)交叉编译器安装 4.编译example 5.运行example 1.开发板介绍 树莓派-P ...

  5. windows 内核情景分析

    原文很长:先转部分过来,有时间看一下: 一 windows 内核情景分析---说明 说明 本文结合<Windows内核情景分析>(毛德操著).<软件调试>(张银奎著).< ...

  6. Windows内核系统调用分析

    系统调用 进程 --> 调用OS API:OS进程管理 --> 调配进程. 仅从用户进程角度,OS就像是一个被动响应的运行时库.Windows提供了一个系统调用界面作为外层,即Win32A ...

  7. Windows内核的表学习总结

    SSDT - 系统服务描述符表 SSDT(System Services Descriptor Table),系统服务描述符表.这个表就是一个把ring3的Win32 API和ring0的内核函数联系 ...

  8. Windows内核API HOOK 之 Inline Hook

    来源:CSDN   作者:daiwen 名字起得好,Inline hook,乍一听,似乎很高深.此处的Inline,我以为,意指将汇编代码直接写入内核API的内存区域.Inline Hook不像用户态 ...

  9. 路由器配置(新手上路,比较全面,强烈推荐)

    路由器配置(新手上路,比较全面,强烈推荐) 第一章 路由器配置基础 一.基本设置方式 二.命令状态 三.设置对话过程 四.常用命令 五.配置IP寻址 六.配置静态路由 第二章 广域网协议设置 一.HD ...

最新文章

  1. java 数据库 流式查询_关于mybatis:强大MyBatis-三种流式查询方法
  2. 云栖专辑|阿里开发者们的第二个感悟:PG大V德哥的使命感与开放心态
  3. 上传图片到第三方服务器
  4. Python-random标准库知识小结
  5. Android模拟器无法上网问题
  6. 使用JBehave,Gradle和Jenkins的行为驱动开发(BDD)
  7. c/c++ 编程试题
  8. UE4角色Location远距离时动画抖动问题(float精度不够)解决方案
  9. nginx反代+varnish缓存+后端LAMP平台集群实现
  10. opencv3.4.x和opencv4.x中 cv2.findContours的不同 ValueError: too many values to unpack (expected 2)
  11. 华为电脑和手机一碰传_华为手机怎么一碰传连接电脑传输照片和文件
  12. Win10设置屏保时间
  13. POJ3658Matrix( 双重二分+负数+死循环)
  14. Eclipse4.6(neno)手动配置Tomcat插件
  15. 寒假每日一题 2 : 干草堆 java
  16. lol无限火力服务器卡顿,LOL无限火力无限彗星BUG是什么? 无限彗星超强卡BUG技巧Get起来...
  17. matlab只显示y一部分,突出显示matlab图的部分内容
  18. android 混淆后的机制,Android 代码混淆机制
  19. 《流浪地球》票房:预测10亿却飚50亿 ,大数据预测为什么这么难...
  20. 海外服务器被攻击怎么办?IP被封要如何处理?

热门文章

  1. Jmeter 多台机器产生负载及问题解决方法
  2. 配置nginx下别名alias支持PHP fastcgi解析
  3. 简单快速开发C\S架构程序用最简单的不分层最快的效率
  4. MapReduce源码之InputFormat
  5. JDK7,JDK8 - 下载地址
  6. 干货:五分钟带你看懂NestedScrolling嵌套滑动机制
  7. 关于文件权限管理了解和使用
  8. php 一次性替换多个关键词
  9. HeadFirst 设计模式 - Chapte5 单例模式
  10. ShineTime - 带有 CSS3 闪亮特效的缩略图相册