ShadowSSDT Hook

2023-05-16

ShadowSSDT表的获取

这里的ShadowSSDT表的获取是通过函数KeAddSystemServiceTable来获取的。
使用这个函数的原因:
1、这个函数是已经导出的,可以在代码中直接使用。
2、这个函数里面使用了ShadowSSDT,包含了ShadowSSDT的地址。
可以使用WinDbg查看该函数代码,如下:

kd> u KeAddSystemServiceTable l 30
nt!KeAddSystemServiceTable:
83fa3008 8bff            mov     edi,edi
83fa300a 55              push    ebp
83fa300b 8bec            mov     ebp,esp
83fa300d 837d1801        cmp     dword ptr [ebp+18h],1
83fa3011 7760            ja      nt!KeAddSystemServiceTable+0x6b (83fa3073)
83fa3013 8b4518          mov     eax,dword ptr [ebp+18h]
83fa3016 c1e004          shl     eax,4
83fa3019 83b8c009f88300  cmp     dword ptr nt!KeServiceDescriptorTable (83f809c0)[eax],0
83fa3020 7551            jne     nt!KeAddSystemServiceTable+0x6b (83fa3073)
83fa3022 8d88000af883    lea     ecx,nt!KeServiceDescriptorTableShadow (83f80a00)[eax]
83fa3028 833900          cmp     dword ptr [ecx],0
83fa302b 7546            jne     nt!KeAddSystemServiceTable+0x6b (83fa3073)
83fa302d 837d1801        cmp     dword ptr [ebp+18h],1
83fa3031 8b5508          mov     edx,dword ptr [ebp+8]
83fa3034 56              push    esi
83fa3035 8b7510          mov     esi,dword ptr [ebp+10h]
83fa3038 57              push    edi
83fa3039 8b7d14          mov     edi,dword ptr [ebp+14h]
83fa303c 8911            mov     dword ptr [ecx],edx
83fa303e 8b4d0c          mov     ecx,dword ptr [ebp+0Ch]
83fa3041 8988040af883    mov     dword ptr nt!KeServiceDescriptorTableShadow+0x4 (83f80a04)[eax],ecx
83fa3047 89b0080af883    mov     dword ptr nt!KeServiceDescriptorTableShadow+0x8 (83f80a08)[eax],esi
83fa304d 89b80c0af883    mov     dword ptr nt!KeServiceDescriptorTableShadow+0xc (83f80a0c)[eax],edi
83fa3053 7418            je      nt!KeAddSystemServiceTable+0x65 (83fa306d)  

在代码中获取ShadowSSDT的方式是暴力搜索,代码如下:

ULONG GetShadowTableAddress()
{
	ULONG dwordatbyte, i;
	PUCHAR p = (PUCHAR)KeAddSystemServiceTable;
	for(i = 0; i < 0x1024; i++, p++)
	{
		__try
		{
			dwordatbyte = *(PULONG)p;
		}
		__except(EXCEPTION_EXECUTE_HANDLER)
		{
			return NULL;
		}
		if(MmIsAddressValid((PVOID)dwordatbyte))
		{
			//这里得到的以dwordatbyte为首地址的数据是否与KeServiceDescriptorTable的前16字节相同
			if(memcmp((PVOID)dwordatbyte, KeServiceDescriptorTable, 16) == 0)
			{
				//地址相同,则排除,因为要找到的是ShadowSSDT,而不是SSDT。
				if((PVOID)dwordatbyte == KeServiceDescriptorTable)
					continue;
				return dwordatbyte;
			}
		}
	}
	return NULL;
}  

ShadowSSDT Hook

ShadowSSDT的Hook方法与SSDT的Hook方法基本一样,不同的地方是以下几点:
1、ShadowSSDT Hook之前需要先KeAttachProcess一个有界面的进程,一般会操作explorer.exe
2、由于KeAttachProcess需要传入一个类型为PEPROCESS的参数,需要通过进程名获取该进程的PEPROCESS结构体。
3、Hook完成之后使用KeDetachProcess获取Attach的进程。
简单说一下通过进程名获取该进程的PEPROCESS结构体的方法:
使用PsGetProcessImageFileName获取当前进程的结构体,以此向前或向后遍历搜索,获取结构体中的进程名信息与需要的进程名比较。在这个里面需要处理的两个地方,由于系统版本不同,导致PEPROCESS结构体中进程名的偏移不同,因此需要先判断系统,设置不同的偏移;第二个是PsGetProcessImageFileName该函数只能运行于PASSIVE_LEVEL层,所以需要获取当前的IRQL进行判断。

疑问

关于KeAttachProcess和KeDetachProcess,
我想在Hook之后,KeAttachProcess一个进程,然后,在卸载Hook之后,再执行KeDetachProcess函数,但是当我Hook完成之后,运行一会,就出现系统蓝屏了,难道KeAttachProcess之后,对ShadowSSDT做完操作,就必须先KeDetachProcess吗?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ShadowSSDT Hook 的相关文章

  • 低级鼠标和键盘钩子回调在哪个线程中运行?

    我正在设置一个低级鼠标钩与SetWindowsHookEx HANDLE handle SetWindowsHookEx WH MOUSE LL callback GetModuleHandle NULL NULL 因为这是一个低级回调 所
  • 使用LD_PRELOAD方法注入printf时出现问题

    我在我的一个项目中破解了 glibc 的 printf 并遇到了一些问题 您能提供一些线索吗 我关心的问题之一是为什么同样的 malloc free 解决方案可以完美地工作 如附件所示 PrintfHank c 包含我自己的 printf
  • xunit 添加信息到输出

    有谁知道如何在运行 xUnit 测试时向输出控制台添加附加信息 我正在使用 testdriven net 但我不认为这就是我的答案所在 我正在使用一个IUseFixture 实际上IClassFixture从 2 0 开始 在测试之间维护数
  • WH_MOUSE 和 WH_MOUSE_LL 挂钩之间有哪些区别?

    我发现WH MOUSE并不总是被调用 问题可能是我正在使用WH MOUSE并不是WH MOUSE LL 代码 class MouseHook public static signal
  • 如何在 WordPress 中设置动态 `home` 和 `siteurl`?

    我使用动态配置多语言设置locale筛选 其中获取子域名来确定语言 function load custom language locale get the locale code according to the sub domain n
  • 提交颠覆时可以修改文本文件吗?

    我想在正在提交的文本文件上运行以下脚本 Send the commands H and w to ed ed will append newline if the file does not end in one printf s n H
  • 防止在 C++ 中重新绘制窗口

    我正在编写一个全局钩子 DLL 它需要在窗口上使用 GDI 进行一些绘图以响应事件 我的问题是正在绘制的窗口不断重新绘制自身 因此我绘制的内容在我想要的之前就被删除了 有什么办法可以阻止窗户在我需要的时间内绘制任何东西吗 我的钩子目前是WH
  • 关闭挂钩 C++

    无论何种终止 异常 正常 未捕获的异常等 是否有某种方法可以在终止时运行代码 我知道它在 Java 中实际上是可能的 但是在 C 中也可能吗 我假设一个Windows环境 不 如果有人调用TerminateProcess 您的进程将被销毁
  • 从注入的 DLL 中挂钩 DirectX EndScene

    我想绕道EndScene从任意 DirectX 9 应用程序创建一个小的覆盖层 例如 您可以使用 FRAPS 的帧计数器叠加层 该叠加层在激活时会显示在游戏中 我知道以下方法可以做到这一点 创建一个新的d3d9 dll 然后将其复制到游戏路
  • pthread_create 的钩子

    是否有 在 glibc 2 5 及更新版本中 为 pthread create 定义钩子的方法 有很多二进制应用程序 我想编写一个动态库通过 LD PRELOAD 加载 我可以在 main 属性构造函数 的入口处添加钩子 但是如何强制我的代
  • 基于Git的网站部署工作流程

    在我的服务器上 我有两个用户 www data 由 nginx 使用 和git The git用户拥有一个包含我网站代码的存储库 并且www data用户拥有该存储库的克隆 用作 nginx 的 Webroot 我想建立一个工作流程 以便推
  • 如何连接 Windows 中的其他程序?

    谁能解释一个程序如何挂钩并修改 Windows 中其他程序的行为 这怎么可能呢 Windows 程序是否不会保护自己免受其他程序进入其内存等的影响 我不知道它的内部结构是如何工作的 所以我只是说 进入他们的记忆 我敢打赌它比这更复杂 另外
  • “安全”DLL 注入

    抱歉 这不是一个很好的问题 我有一个程序 当从资源管理器打开文件时需要发出警报 即调用 ShellExecute A W 不幸的是 微软删除了允许您在 Vista 及更高版本中挂钩这些事件的 COM 接口 IShellExecuteHook
  • Outlook 对象模型 - 连接到对话清理功能

    Outlook 2010 有一个功能称为对话清理 http office microsoft com en us outlook help use conversation clean up to eliminate redundant m
  • 用于挂钩进程函数的 Linux 模块

    我有一个问题 也许你有一些关于这方面的信息 我想在运行进程中挂钩套接字接收函数 recv 并修改传入数据 我怎么知道 我可以使用内核模块来做到这一点 但我找不到有关如何执行此类挂钩的信息 我尝试过其他方法 例如 Netfilter ipta
  • 从 C# 连接到 Windows 文件复制 API

    有没有办法从 C 连接到 Windows 文件复制 API 我知道这需要非托管代码 但代码示例或入门程序会很有帮助 我已经看过 C 代码 但都是希腊语 UPDATE 我很抱歉 我应该更清楚地表达我的意图 我实际上希望将 Windows 的复
  • 仅 mysqldump 模式,模式更新不丢失

    我正在考虑在提交更改之前使用 git pre commit hook 导出 MySQL 数据库模式 以便其他开发人员可以使用 git 存储库中的 SQL 脚本更新自己的数据库 默认情况下 mysqldump 我正在使用 no data 会在
  • 连接 Hibernate 的查询生成

    我想实施虚拟视图与预处理器 一个简单的例子 之前的HQL FROM PublishedArticle a 生效后的 HQL FROM Article a WHERE a published true 本质上 我需要一种在执行查询之前处理查询
  • git pre-status 或 post-status hook

    我想运行 lintergit status 不过似乎没有pre status nor post status hook 如何给 git 添加一个 hook The 精美文档 https git scm com book en v2 Cust
  • 低级键盘钩子不在 UI 线程上

    我想为键盘挂钩创建一个好的库 我使用 SetWindowsHookEx 方法 我注意到如果我的应用程序的主线程繁忙 则应在任何系统 KeyDown 事件中调用的方法 hookProc 不会执行 我认为钩子应该这样制作 以便另一个线程负责它

随机推荐

  • 【学习SLAM】c++时间戳 获取与转换

    https tool lu timestamp c 43 43 时间戳 自 1970 年 1 月 1 日以来经过的秒数 time t time1 61 time 0 这里获取到的其实就是一个long类型的时间戳 xff0c 是秒级别 的 1
  • 简单行编辑程序

    实验题目 xff1a 简单行编辑程序 问题描述 文本编辑程序是利用计算机进行文字加工的基本软件工具 xff0c 实现对文本文件的插入 删除等修改操作 限制这些操作以行为单位进行的编辑程序称为行编辑程序 被编辑的文本文件可能很大 xff0c
  • 要求循环队列不损失一个空间全部都得到利用,设置一个标志域tag,以0和1来区分当队头与队尾指针相同时队列状态的空和满,试编写与此结构相对应的入队和出队操作。

    用标志域表示队空队满状态的循环队列的综合操作 描述 xff1a 在这里插入代码片 要求循环队列不损失一个空间全部都得到利用 xff0c 设置一个标志域tag xff0c 以0和1来区分当队头与队尾指针相同时队列状态的空和满 xff0c 试编
  • C语言_字符串转数字

    C语言 字符串转数字 程序实现基础算法与思想 xff1a 1 0 gt 1 字符1减字符0得到数字1 2 0 gt 2 9 0 gt 9 即 xff1a 数字字符 0 gt 对应的数字 xff08 注意 xff1a 只能得到1 9 xff0
  • linux复习2 -- 文件权限、修改文件权限(用chmod)、常用命令

    1 文件权限 对于一个文件而言 xff0c 操作它 的用户可分为三类 xff1a 所有者 同组用户 其他用户 xff1b u user 表示文件属主的访问权限 xff1b g group xff1a 表示文件同组用户的访问权限 xff1b
  • C++1-C语言和C++的区别

    一 C语言与C 43 43 的区别 1 头文件 xff1a C 43 43 xff1a span class token macro property span class token directive hash span span cl
  • BW:LO数据源初始化步骤(精简版)

    首先在r3上删除 setup table xff0c 然后再填充 setup table xff08 锁定凭证 xff09 xff0c 同时 xff0c 在bw做无数据的初始化 xff0c 最后在bw做full load
  • C++3--构造函数、冒号语法

    一 构造函数 1 为什么要有这个概念 xff1a 例如下面的代码 xff0c 对于Table类 xff0c 可以通过t Set公有的方法给对象设置内容 xff0c 但是如果每次创建对象都调用该方法设置信息 xff0c 就会有点麻烦 xff0
  • c/c++语言面试题目整理

    1 static有什么用途 xff1f 在C语言中 xff0c static主要定义全局静态变量 xff0c 定义局部静态变量 xff0c 定义静态函数 限制变量的作用域 xff0c 设置变量的存储域 static 关键字主要有两种作用 x
  • c语言宏定义一个MAX函数

    1 span class token macro property span class token directive hash span span class token directive keyword define span sp
  • C++ -- 异常:try、throw、catch

    异常 申请内存的时候 xff0c 内存不够用 空间配置器申请失败 xff0c 不做处理 拷贝时内存错误 除数分母不能为0 等情况 会抛出异常 try throw catch 1 使用示例 1 xff09 除数为零 xff0c 情况 未处理情
  • C++ -- 笔试题

    1 下列对派生类的描述中错误的说法是 D A 派生类至少有一个基类 B 派生类可作为另一个派生类的基类 C 派生类除了包含它直接定义的成员外 xff0c 还包含其基类的成员 D 派生类所继承的基类成员的访问权限保持不变 2 当派生类中有和基
  • Linux 用户切换、修改用户名、修改密码

    一 用户切换 34 34 xff1a 普通用户提示符 34 34 xff1a root用户提示符 1 普通用户到root 方式一 xff1a 命令 xff1a su 然后输入root密码 此种方式只是切换了root身份 xff0c 但She
  • C++中的.和::和:和->的区别

    在学习C 43 43 的过程中我们经常会用到 和 和 xff1a 和 gt xff0c 在此整理一下这些常用符号的区别 1 A B则A为对象或者结构体 xff1b 2 A gt B则A为指针 xff0c gt 是成员提取 xff0c A g
  • AirSim学习日志 5-LQR实现无人机轨迹跟踪

    1 LQR控制器算法原理推导 1 1 状态反馈控制 连续线性系统的状态空间表示为 x
  • 英语常用短语

    1 xff0e 经济的快速发展 the rapid development of economy 2 xff0e 人民生活水平的显著提高 稳步增长 the remarkable improvement steady growth of pe
  • PX4进入系统控制台以及运行程序

    这里提供进入控制台两种办法 1 运行 Tools mavlink shell py dev ttyACM0 是我进入Px4系统控制台的命令 xff0c 进入之后应该是这样 Pixhawk src Firmware Tools mavlink
  • 哈哈,终于知道CSDN怎么改头像了

    话说之前一直郁闷 xff0c 说改头像的功能还没修好 xff0c 一直说服务器错误 今天偶尔发现 xff0c 右上角有个设置 xff0c 原来在这里可以改 我还发了几封邮件给CSDN的admin xff0c 居然只知道道歉 xff0c 不告
  • Hello Sky! pixhawk第一个例程学习解读

    学习px4的第一个程序 xff0c 这个例子作为官方给出解释的例程 xff0c 对于新手上手来说 xff0c 是很好的范例 接下来我对照程序源码 xff08 已经经过自己的修改和添加注释 xff09 进行讲解 1 PX4 INFO是标准的L
  • ShadowSSDT Hook

    ShadowSSDT表的获取 这里的ShadowSSDT表的获取是通过函数KeAddSystemServiceTable来获取的 使用这个函数的原因 xff1a 1 这个函数是已经导出的 xff0c 可以在代码中直接使用 2 这个函数里面使