修改SSDT来挂钩API的代码

Windows内核新手上路1——挂钩SSDT Windows内核新手上路1——挂钩SSDT         这个系列记录学习我学习windows内核的点点滴滴,高手请直接无视。         文章核心内容:挂钩SSDT中函数列NtOpenProcess,NtDuplicateObject,NtCreateThread,NtOpenThread,NtWriteVirtualMemory,过滤进程操作来保护目标进程空间。SSDT的全称是System Services Descriptor Table,系统服务描述符表。这个表把ring3的Win32 AP 阅读详情
/////////////////////////////////
//函数用途:修改SSDT表         //
/////////////////////////////////
//输入:服务ID, 新地址         //
//返回值:原始地址             //
/////////////////////////////////

ULONG SetSSDTAddress(ULONG ulServiceID, ULONG procNewAddress)

QUOTE:

// SSDT_Hook.c: SSDT Hook API.
//
//////////////////////////////////////////////////////////////////////
/*
代码最初来源于网络,原作者未知,表示歉意,代码经由at.Least(炉子)
*/
#include <ntddk.h>
typedef struct _SERVICE_DEscrīptOR_TABLE
{
  
PVOID   ServiceTableBase;
  
PULONG  ServiceCounterTableBase;
  
ULONG   NumberOfService;
  
ULONG   ParamTableBase;
}
SERVICE_DEscrīptOR_TABLE,*PSERVICE_DEscrīptOR_TABLE; //由于KeServiceDescrīptorTable只有一项,这里就简单点了
extern PSERVICE_DEscrīptOR_TABLE    KeServiceDescrīptorTable;//KeServiceDescrīptorTable为导出函数
static ULONG JmpAddress;//跳转到的地址
static ULONG OldServiceAddress;//原来的服务地址
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
/////////////////////////////////
//函数用途:修改SSDT表         //
/////////////////////////////////
//输入:服务ID, 新地址         //
//返回值:原始地址             //
/////////////////////////////////
ULONG SetSSDTAddress(ULONG ulServiceID, ULONG procNewAddress)
{
  
ULONG  Address;
  
Address = (ULONG)KeServiceDescrīptorTable->ServiceTableBase + ulServiceID * 4;//服务ID
  /*
  炉子(at_Least) 注解 1(Address变量):
  其实这个 Address 并不是真正的原始地址,从下文的
  “OldServiceAddress = *(ULONG*)Address;”就可看
  出其实这个 Address 是指向地址变量的指针(可能我
  说的很复杂或者是很难懂,你可以把这个Address理解
  为一个 *Address 变量 (ULONG *Address),并且被
  赋值为:
  Address = &服务函数地址(就是0x8XXXXXXX那东西)
  */
  ///////////////////////////////////////////////
  /*
  炉子(at_Least) 注解 2(如何获得Address的值):
  SSDT 中数据的存放方式实际是:
  ------------------理论譬如说------------------>
  lkd> dd KeServiceDescrīptorTable
  8055ab80  804e3d20 00000000 0000011c 804d9f48
  8055ab90  00000000 00000000 00000000 00000000
  8055aba0  00000000 00000000 00000000 00000000
  8055abb0  00000000 00000000 00000000 00000000
  在windbg.exe中我们就看得比较清楚,KeServiceD-
  escrīptorTable中就只有第一项有数据,其他都是0
  。其中804e3d20就是KeServiceDescrīptorTable.n-
  toskrnel.ServiceTableBase,服务函数个数为0x1-
  1c个。我们再看看804e3d20地址里是什么东西:
  lkd> dd 804e3d20
  804e3d20  80587691 805716ef 8057ab71 80581b5c
  804e3d30  80599ff7 80637b80 80639d05 80639d4e
  804e3d40  8057741c 8064855b 80637347 80599539
  804e3d50  8062f4ec 8057a98c 8059155e 8062661f
  如上,80587691 805716ef 8057ab71 80581b5c 这些
  就是系统服务函数的地址了。
  <------------------理论譬如说------------------
  (【理论譬如说】中的内容为引用——懒得打字- -)
  相信大家也看明白了,每个地址占用4个字节( 1个字
  节可以表示两位数字 ——不明白的自己换算。)所以
  当我们获取地址的指针时,需要用服务 ID * 4(地址
  是连续存放的, 不存在两个地址之间的间隔符之类的
  情况)来获取相对于起始地址(在引用部分是【804e-
  3d20】)的差值,然后再加上起始地址(就是Servic-
  eTableBase)
  */
  
DbgPrint("Address:0x%08X",Address);
  
OldServiceAddress = *(ULONG*)Address;//保存原来的地址
  
DbgPrint("OldServiceAddress:0x%08X",OldServiceAddress);
  
DbgPrint("procNewFunAddress:0x%08X",procNewAddress);
  
JmpAddress = (ULONG)NtOpenProcess + 10; //跳转到函数头+10的地方,这样在其前面写的JMP都失效了
  
DbgPrint("JmpAddress:0x%08X",JmpAddress);
   
  
__asm{//去掉内存保护
   
cli
         mov  eax
,cr0
   
and  eax,not 10000h
   
mov  cr0,eax
  
}
  *((
ULONG*)Address) = (ULONG)procNewAddress;//HOOK SSDT
  
__asm{//恢复内存保护  
         
mov  eax,cr0
   
or   eax,10000h
   
mov  cr0,eax
    sti
  
}
  
return OldServiceAddress;
}
 
挂钩SSDT隐藏进程 (本文发表于黑访11期上,请勿转载) 新学期又开始了,一来到学校我口袋的资金剧烈减少,我估计因该和现在轻微的通货膨胀有关(其实是我开学乱花钱花的),没有办法只好也来黑防算是“骗”点钱花了。嘿嘿。最近大家对于ring0级的研究正如当年的注入一样越来越火,认识的朋友似乎张口闭口都是内核,看来这有可能是以后的趋势了,在下不才在此献上一篇文章,算是抛砖引玉。希望以后有更好的文章发表出来。^_^ 阅读详情

相关推荐

Windows内核编程 文件监控(ssdt hook)

本文主要针为进行内核编程的一些初学者提供一些错误,如有错误,希望大家能够指出。         这里先简单介绍一下概念。说到SSDT HOOK,可以从MEP技术说起,MEP(即执行路径修改)主旨就是拦截系统函数或相关处理例程,让它们转向我们自己的函数进行处理,这样就能实现过滤参数或者修改目标函数处理结果的目的。而SSDT(即 系统服务描述符表),主要是将位于Ring3的应用API函数和Ring0

u013032601的博客 4051

驱动开发:内核扫描SSDT挂钩状态

在笔者上一篇文章《驱动开发:内核实现SSDT挂钩与摘钩》中介绍了如何对SSDT函数进行Hook挂钩与摘钩的,本章将继续实现一个新功能,如何检测SSDT函数是否挂钩,要实现检测挂钩状态有两种方式,第一种方式则是类似于《驱动开发:摘除InlineHook内核钩子》文章中所演示的通过读取函数的前16个字节与原始字节做对比来判断挂钩状态,另一种方式则是通过对比函数的当前地址与起源地址进行判断,为了提高检测准确性本章将采用两种方式混合检测。

微软技术分享 9345

24、Windows代码注入与挂钩技术解析

本文深入解析了Windows系统下的代码注入与API挂钩技术,详细介绍了从用户模式到内核模式的API调用流程,包括WriteFile等系统调用如何通过ntdll和ntoskrnl实现。文章重点阐述了三种主要的DLL注入技术:远程DLL注入、APC注入和使用SetWindowsHookEx的注入方法,涵盖其原理、执行步骤及恶意软件应用场景,如持久化、权限提升和绕过安全检测。同时,文中提供了清晰的技术流程图和API调用序列,帮助读者理解攻击者如何利用系统机制在目标进程中执行恶意代码。

java5的博客 56

挂钩SSDT详解附源代码

源代码下载地址:挂钩SSDT源代码     据微软所言,服务描述符表是一个由四个结构组成的数组,其中的每一个结构都是由四个双字项组成。因此,我们可以将服务描述符表表示为: typedef struct ServiceDescriptorTable {       SDE ServiceDescriptor[4]; }SDT; 其中,其中的每一个服务描述符呈现出四个双字的形式,它

dcsno1的专栏 857

SSDT Hook技术实现:NtCreateSection案例分析

软件服务描述表(SSDT,Software Service Description Table)是操作系统内核中的一个关键组件,负责管理系统服务的调度。在Windows操作系统中,SSDT用于定义一组函数指针,这些指针指向内核服务函数。通过SSDT,应用程序可以间接调用这些内核服务,执行如文件操作、进程管理和内存分配等核心功能。SSDT是系统稳定运行的基础,但同时也成为黑客和安全研究人员关注的焦点,因为通过修改SSDT条目,可以实现系统服务的拦截与修改。

weixin_35972981的博客 527

Delphi开发的SSDT钩子卸载工具包

本文还有配套的精品资源,点击获取 简介:本工具是使用Delphi语言开发的,能够在内核模式下运行,主要用于从系统服务描述表(SSDT)中移除恶意软件设置的钩子。SSDT是Windows内核的关键部分,被恶意软件篡改后会影响系统功能。工具包含对Windows API的低级访问、内存泄漏检测、DLL加载配置以及安全相关API的封装。这对于系统安全维护和恶意软件检测具有重要意义。...

weixin_35752233的博客 982

挂钩SSDT

一、原理篇1.            关于系统服务。系统服务是由操作系统提供一组函数,使得开发者能够通过APIs直接或间接的调用。一个API可以对应一个系统服务,也可以一个API依赖多个系统服务。比如,WriteFile API对应的系统服务是ntoskrnl.exe中的NtWriteFile。系统服务分发属于陷阱分发的范畴,更详细的资料可参考’Windows Internal(4th e

yaozhu88的专栏 2129

SSDT挂钩_基于Windows内核的RootKit技术样本

Windows

[内核安全2]内核态Rootkit之SSDT Hook

/*++ * @Description * 主逻辑控制函数 * @Param * @Return * @Attention --*/ void Running(); /*++ * @Description * 不接收换行的从标准输入内收到键入,是一个安全函数 * * @Param * lpszBuf: 接受键盘输入的缓冲区 * uiSizeOfBuf: 描述lpszBuf的大小 * * @Return * 返回状态码 * * @Attention --*/ NTSTATUS kgets(OUT.

輚至消亡 1049

WslRegisterDistribution failed with error_ 0x8007019e、0x800701bc、0x80370102

Ubuntu 20.04.4 LTS 报错解决方案。分别涉及到三个错误:WslRegisterDistribution failed with error: 0x8007019e、WslRegisterDistribution failed with error: 0x800701bc和WslRegisterDistribution failed with error: 0x80370102

一起加油~ 5万+

模糊高清修复真王炸!ComfyUI-SeedVR2-Kontext(画质修复+P图)本地部署教程

SeedVR2_comfyUI 是由字节跳动 Seed 实验室与南洋理工大学 S-Lab 联合开源的,专为 ComfyUI 用户开发的插件版本,官方项目名为。它主打,在图像超分上表现尤其亮眼,被多位实测者称为“目前模糊图像修复最强模型“。SeedVR2 在图像超分任务中表现突出,尤其擅长恢复模糊图像的细节,被称为“模糊高清修复真王炸”。特别的,也适合用于文字密集图像(如截图、扫描文档、老照片字幕)修复。模型通过对抗训练 + 特征匹配损失提升细节真实感,理论上对文字边缘锐化也有帮助。

SJJS_1的博客 2688

驱动开发:挂接SSDT内核钩子

SSDT 中文名称为系统服务描述符表,该表的作用是将Ring3应用层与Ring0内核层,两者的API函数连接起来,起到承上启下的作用,SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基址、服务函数个数等,SSDT 通过修改此表的函数地址可以对常用 Windows 函数进行内核级的Hook,从而实现对一些核心的系统动作进行过滤、监控的目的,接下来将演示如何通过编写简单的驱动程序,来实现搜索 SSDT 函数的地址,并能够实现简单的内核 Hook 挂钩。

微软技术分享 1万+

MFC使用Websocket通讯介绍和实例(附完整源码)

踩坑点,下载了好几个boost版本编译,经常出问题,后来搜索了好久资料才发现如下评论:WebSocket++0.8.2 has been tested through Boost 1.72。WebSocketpp依赖于boost,因此在使用WebSocketpp前需要编译Boost;所以我们直接下载Boost 1.72的windows版的进行安装,安装完成还需要编译;WebSocketpp也叫WebSocket++;服务编译好之后,使用。

weixin_42530684的博客 1171

X86驱动:挂接SSDT内核钩子

SSDT 中文名称为系统服务描述符表,该表的作用是将Ring3应用层与Ring0内核层,两者的API函数连接起来,起到承上启下的作用,SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基址、服务函数个数等,SSDT 通过修改此表的函数地址可以对常用 Windows 函数进行内核级的Hook,从而实现对一些核心的系统动作进行过滤、监控的目的,接下来将演示如何通过编写简单的驱动程序,来实现搜索 SSDT 函数的地址,并能够实现简单的内核 Hook 挂钩。

微软技术分享 5925

Voicebox本地部署:模型下载与离线模式实战指南

在本地语音处理场景中,模型下载失败和离线运行需求是开发者最常遇到的两大难题。理解语音工具的本地推理原理,关键在于掌握模型文件与程序逻辑的分离管理:模型独立下载,程序负责推理,输出留在本机。这种架构带来显著的技术价值——数据不出本地、不依赖公网、批量任务不中断。无论是语音识别转写、语音合成,还是集成到自动化脚本中,本地离线模式都能在隐私敏感或网络不稳定环境下稳定运行。对开发者而言,先解决模型文件的完整获取,再验证离线启动流程,就能绕过“无法下载模型”的常见坑。本文从环境准备、模型放置、服务启动到接口调用,提供

weixin_29048309的博客 312

Veritas NetBackup8.1.1安装

1.在服务器上运行Browser.exe 2.选中安装,点击"NetBackup Server Software Installation" 3.提示一个”UAC模式”,我们确定忽略它 4.下一步 5.接受授权,下一步 6.自定义安装 7.输入Key,并点击”netBackup Master Server” 8.自定义路径,下一步 9.默认端口,下一步 10.创建内置账户 创建本地用户帐户: C:\>net user nbwebsvc <StrongPassword> /

万物皆可学 2万+

Rookit技术之SSDT_Hook

Rookit技术之SSDT_Hook Rookit技术之SSDT_Hook 0x0 SSDT简介 0x1 测试环境 0x2 达到目标 0x3 主要思路 0x4 关键代码 0x5 测试效果 0x0 SSDT简介 SSDT全称为System Services Descriptor Table,中文为系统服务描述符表,ssdt表就是把ring3的Win32 API和ring0的...

Hades的博客 686

#systemverilog# 之 event region 和 timeslot 仿真调度(三)Verdi 辅助查看

通过今天的学习,我们知道:event region 是event sequence 的全集。我们打开了 event region feature 也就开启了event sequence 的功能。

那么菜的博客 1367

通过直接恢复SSDT(系统服务分派表)的方式解除核心原生API钩子

简介WIN32核心RootKit通过挂钩核心原生API的方式改变了系统的行为.这项技术最典型的实现方式是更改内核的SSDT(系统服务分派表).这种更改保证了被rootkit安装的钩子函数可以预先调用初始原生API.钩子函数通常调用初始的原生API,然后在原生API将结果返回到用户态程序之前将其输出结果改变.这种技术可以使核心态rootkit隐藏文件,进程或者阻止恶意进程被结束.此篇论文会对

如是所来的专栏 3135

【华为OD机试真题】3、 路灯照明问题 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

题目描述 >在一条笔直的公路上安装了N个路灯,从位置0开始安装,路灯之间间距固定为100米。 每个路灯都有自己的照明半径,请计算第一个路灯和最后一个路灯之间,无法照明的区间的长度和。

KJ.JK 1万+

大数据与宠物:健康监测数据分析

随着全球宠物市场规模的快速增长(2023年全球宠物产业规模已达3500亿美元),宠物健康管理需求呈现指数级上升。传统宠物医疗依赖定期体检和症状观察,存在滞后性和主观性缺陷。本文聚焦如何通过物联网(IoT)设备采集宠物生理数据(体温、心率、活动量等),利用大数据分析技术构建实时健康监测系统,实现宠物健康状态的动态评估、异常预警和疾病预测。研究范围涵盖数据采集技术、数据预处理方法、机器学习模型构建及实际应用场景落地。背景介绍:明确研究目的、目标读者及核心术语核心概念与联系。

2502_91592937的博客 1068

API钩取技术研究(四)——SSDT Hook

简单起见,我将要保护的进程PID硬性编码为cmd.exe的PID。自定义钩取函数MyZwOpenProcess()的实现思路类似于IAT Hook中自定义钩取函数的实现思路,通过修改进程参数Desired Access的值为0,然后再将修改的参数传入正常调用的原ZwOpenProcess() API即可实现进程保护。

m0_55220082的博客 972

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

驱动开发:恢复SSDT内核钩子

SSDT 中文名称为系统服务描述符表,该表的作用是将Ring3应用层与Ring0内核层,两者的API函数连接起来,起到承上启下的作用,SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基址、服务函数个数等,SSDT 通过修改此表的函数地址可以对常用 Windows 函数进行内核级的Hook,从而实现对一些核心的系统动作进行过滤、监控的目的。通过前面的学习我们已经可以编写一个驱动程序并挂钩到指定的内核函数上了,接下来我们将一步步的通过编写驱动程序,手动的来解除。

微软技术分享 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: 一个在命令行下改注册表权限的小工具
下一篇: vbs+hta 实现同时关闭多个系统进程
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值