SSDT的检测与恢复

Rootkit Unhooker驱动逆向分析  这个驱动本来准备端午节搞的,但后来端午节去了躺北京玩了几天,也就搁置了...最近连续花了4个晚上,大致把它搞的差不多了,有些收获...初学 window驱动,水平很菜,有些东西我也未必清明,加上3环的代码还没有吃透,期间也没有用调试器跟踪,全是IDA(F5)静态分析的,谬误在所难免, 高手请飘过,希望对菜鸟学习有点帮助.1.SSDT检测这个功能有三个IoControlCode与之对应,他们分别是 阅读详情

为避免检测失效(rootkit惯用的hook,inline hook)一个有效的方法是,我们在进行每一项检测之前都确保自身所使用的函数没有被hook,这样就不得不涉及到ssdt恢复和一些inline hook恢复了.

ssdt是啥?原理之类的网上很多,相信感兴趣的你肯定不缺乏这方面的知识.我这里提供个方便,放个片段,

//枚举SSDT表

typedef struct _tagSSDT {
     PVOID pvSSDTBase;
     PVOID pvServiceCounterTable;
     ULONG ulNumberOfServices;
     PVOID pvParamTableBase;
} SSDT, *PSSDT;

NTSTATUS SSDT_IoCtlDispath( IN PFILE_OBJECT FileObject,
                            IN BOOLEAN Wait, IN PVOID InputBuffer,
                            IN ULONG InputBufferLength,
                            OUT PVOID OutputBuffer,
                            IN ULONG OutputBufferLength,
                            IN ULONG IoControlCode,
                            OUT PIO_STATUS_BLOCK IoStatus,
                            IN PDEVICE_OBJECT DeviceObject )
{
NTSTATUS ntStatus;

IoStatus->Status = STATUS_SUCCESS;
     IoStatus->Information = 0;

     switch ( IoControlCode )
{
case IOCTL_GETSSDT:
         {
             __try
             {
                 ProbeForWrite( OutputBuffer, sizeof( SSDT ), sizeof( ULONG ) );
                 RtlCopyMemory( OutputBuffer, KeServiceDescriptorTable, sizeof( SSDT ) );
             }
             __except ( EXCEPTION_EXECUTE_HANDLER )
             {
                 IoStatus->Status = GetExceptionCode();
             }
         }
         break;
case IOCTL_GETPROC:
         {
             ULONG uIndex = 0;
             PULONG pBase = NULL;

             __try
             {
                 ProbeForRead( InputBuffer, sizeof( ULONG ), sizeof( ULONG ) );
                 ProbeForWrite( OutputBuffer, sizeof( ULONG ), sizeof( ULONG ) );
             }
             __except( EXCEPTION_EXECUTE_HANDLER )
             {
                 IoStatus->Status = GetExceptionCode();
                 break;
             }

             uIndex = *(PULONG)InputBuffer;
             if ( KeServiceDescriptorTable->ulNumberOfServices <= uIndex )
             {
        IoStatus->Status = STATUS_INVALID_PARAMETER;
                 break;
             }
             pBase   = KeServiceDescriptorTable->pvSSDTBase;
             *((PULONG)OutputBuffer) = *( pBase + uIndex );
         }
         break;
default:
   IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
   break;
}

     return IoStatus->Status;
}

当前地址通过与原始地址比较,如果不相同则是被hook了.接下来是SSDT全局恢复工作.(当然你也可以有针对性的恢复)

NTSTATUS DispatchDeviceControl(IN PDEVICE_OBJECT   DeviceObject,IN PIRP   pIrp)
{
NTSTATUS status=STATUS_INVALID_DEVICE_REQUEST;
PIO_STACK_LOCATION pIrpStack=IoGetCurrentIrpStackLocation(pIrp);

ULONG uIoControlCode=pIrpStack->Parameters.DeviceIoControl.IoControlCode;
PVOID pInputBuffer= pIrpStack->Parameters.DeviceIoControl.Type3InputBuffer;
PVOID pOutputBuffer=pIrp->UserBuffer;
ULONG uInsize=pIrpStack->Parameters.DeviceIoControl.InputBufferLength;
ULONG uOutsize=pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;
switch(uIoControlCode)
{
case IOCTL_SETPROC:
{
   ULONG uIndex = 0;
   PULONG pBase = NULL;

   __try
   {
    ProbeForRead( pInputBuffer, sizeof( ULONG ), sizeof( ULONG ) );
    ProbeForWrite( pOutputBuffer, sizeof( ULONG ), sizeof( ULONG ) );
   }
   __except( EXCEPTION_EXECUTE_HANDLER )
   {
    status= GetExceptionCode();
    break;
   }


   uIndex = *(PULONG)pInputBuffer;
   if ( KeServiceDescriptorTable->ulNumberOfServices <= uIndex )
   {
    status= STATUS_INVALID_PARAMETER;
    break;
   }
  
   pBase   = KeServiceDescriptorTable->pvSSDTBase;

   DbgPrint("0x%x 0x%x",uIndex,*((PULONG)pOutputBuffer));
   __asm
   {//关中断
              cli
    mov eax,cr0
    and eax,~0x10000
    mov cr0,eax
   }
   *( pBase + uIndex )=*((PULONG)pOutputBuffer);
   __asm
   {//开中断
    mov   eax,cr0
    or    eax,0x10000
    mov   cr0,eax
    sti
   }
  
   status=STATUS_SUCCESS;
}
break;
default:
   break;
}
if(status==STATUS_SUCCESS)
pIrp->IoStatus.Information=uOutsize;
else
pIrp->IoStatus.Information=0;

pIrp->IoStatus.Status=status;
IoCompleteRequest(pIrp,IO_NO_INCREMENT);
return status;
}

CE+OD无法附加游戏进程的破解方法 CE+OD无法附加游戏进程的破解方法 来吧 别在为这烦恼了 其实看过 windows 核心编程那本书的人都知道 计算机编程领域 那些所谓的游戏保护 真的只是为难菜鸟而已,对于大鸟基本不起作用. 游戏无法就是采用 线程 进程 SSDT等等这些东西来限制一些如:CEOD ASM32这些工具调试而已 比如OD要调试一个程序进程 首先做的是2步操作 ... 阅读详情

相关推荐

仿游戏反作弊系统中SSDT Hook检测与恢复应对技术实战

简介:本文深入探讨“仿游戏检测被恢复的SSDT Hook”这一核心技术,聚焦于Windows内核层面的系统服务描述表(SSDT)钩子机制在游戏反作弊中的应用。通过模拟游戏对SSDT Hook的检测行为,并应对钩子被恢复的情况,揭示反作弊与绕过之间的攻防对抗。结合C++语言与R0级驱动开发,文章详细解析了SSDT Hook原理、内核模式编程、反作弊监控策略及SDK设计思路,涵盖驱动安全性、稳定性和逆向对抗等关键问题。本技术方案适用于需要高强度系统控制与防护的场景,为开发高性能反作弊模块提供实践指导。

weixin_42513209的博客 585

驱动还原:恢复SSDT内核钩子(2)

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

weixin_30790841的博客 1279

深入解析Hook Shadow SSDT技术与源码实现

Hook技术是一种在软件运行时,改变或控制其他程序执行的技术手段。它允许开发者“挂钩”到系统、库或应用的某些部分,并插入自定义代码以执行额外的操作。通过这种方式,开发者可以观察和控制函数调用、消息传递或事件处理等。在系统编程中,Hook技术常用于调试、监控、扩展功能等场景。系统编程指的是编写运行在操作系统内核级别或接近内核级别的软件,如驱动程序、系统服务、操作系统组件等。这些程序通常是用C或C++等底层语言编写,并需要对操作系统的工作原理有深入了解。

weixin_33240461的博客 775

用SSDT方法恢复冒险岛的部分函数

看了那么多文章、视频,现在自己跟着做下恢复的驱动程序吧。今天拿冒险岛的HS驱动做为例子吧。冒险岛游戏对Xuetr进行检测了,打开XueTr不久就会游戏发现非法模块,最终游戏关闭。就拿上了一款叫Kernel Detective的ARK工具进行检测冒险岛的驱动吧。   因为Kernel Detective这款工具不能检测到有任何SSDT函数的挂钩,而使用一般的打开进程工具却不能打开它的进程,可知

liujiayu2的专栏 1536

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

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

weixin_35752233的博客 982

ring3恢复SSDTHOOK(易语言ssdthook恢复工具)V1.0.0绿色免费版

ring3恢复SSDT HOOK(易语言ssdt hook恢复工具)是一款易语言源码恢复辅助工具。他可以基于ring3恢复SSDTHOOK,一款很专业的工具。使用ZwSystemDebugControl,可以在ring3下读写内核空间虚拟内存,但是XP以上系统貌似就不支持写内核了,还有NtSystemDebugControl被SSDT HOOK之后也无法写进内核,有需要的朋友来下载ring3恢复S

检测SSTD是否被hook

我们知道在ssdt中可以被hook,那么如何检测出来自己的ssdt被hook了呢? 在内核文件中保留了一份原始的ssdt表,我们只要通过检测内核文件即可获取到原始的ssdt表即可首先先要确认自己的内核使用的文件是哪个? 是ntkrnlmp.exe还是ntkrnlpa.exe?这个可以通过ZwQuerySystemInformation传入SystemModuleInformation(11)得到

LoveQuietly 1748

SSDT查看和恢复工具

SSDT查看和恢复,SSDT查看和恢复,SSDT查看和恢复,SSDT查看和恢复

ring0 恢复SSDTHook

原理: 用ZwQuerySystemInformation 功能号为11(SystemModuleInformation) 得到所有系统模块的地址 遍历搜索得到ntos模块的基地址 读Ntos模块到System进程空间中 在ntos中找到函数真正地址 将地址转换为ssdt的索引 //X64版本#include "ResumeSSDTHook.h" #define ...

aijuzhou1959的博客 182

SSDT 恢复工具 ...

WDK 7600.16385.0 写的驱动

pi-star图形界面安装指南

pi-star图形界面安装指南,MMDVM热点安装,树莓派3B+热点

blueisman的专栏 1908

区分本地磁盘和外接磁盘的三种方法

最近在做一个检测存储器稳定性的一个项目,要检测SD卡或者SSD的稳定性,过程中遇到了一些问题,所以在这里总结记录下来,等到后期回顾完善,也和大家交流一下。 既然要检测存储器(SD、SSD固态硬盘或者机械硬盘等),就需要先弄清楚电脑都连接了哪些存储设备,有几个,都是什么类型的,以及其各自的属性。我在网络中搜索了很多内容,目前基本解决了怎么区分本地硬盘和外接硬盘。但是如何从根本上区分刚买的电脑中的磁

andy_luoy的专栏 7789

应急响应之windows日志分析工具logparser使用

windows日志分析工具logparser使用介绍

u013930899的博客 8123

检测和恢复SSDT HOOK,INLINE SSDT HOOK

检测和恢复SSDT HOOK,INLINE SSDT HOOK2008-09-25 来源:梦飞鸟( 投递新闻稿件 )<!--google_ad_client = "pub-3730291377033254";google_ad_slot = "7307761760";google_ad_width = 336;google_ad_height = 2

lionzl的专栏 1405

手把手教你用STM32H743+FreeRTOS+LWIP搭建物联网网关(附完整工程)

本文详细介绍了如何使用STM32H743微控制器结合FreeRTOS实时操作系统和LWIP协议栈构建高性能物联网网关。内容涵盖硬件配置、FreeRTOS任务设计、LWIP协议栈优化及物联网协议集成,提供完整工程示例,助力开发者快速实现稳定可靠的网络通信枢纽。

weixin_42623010的博客 502

Python爬虫(一)京东商品价格及详情页抓取

这是一个以http://item.jd.com/2957726.html为例的单网页抓取案例 import urllib.request; #载入urllib.request,用于获取页面html源代码 from pandas import Series; #载入series包 from pandas import DataFrame; #载入dataframe包 from bs4 impo

Data Proc 1万+

内核层获取SSDT中函数原始地址

标 题: 【下载】内核层获取SSDT中函数原始地址 作 者: QEver 时 间: 2011-08-30,20:32:28 链 接: http://bbs.pediy.com/showthread.php?t=139524 昨天在看雪看到《【下载】发个获得SSDT函数名和索引号的代码》,一时兴起整理了一份内核层根据ntdll.dll和nt模块文件来获取SSDT函数原始的地址的代码,可以

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 1562

从编译到调通:RK3588与FPGA的PCIe XDMA驱动实战解析

本文详细解析了在RK3588平台上为FPGA板卡编译、加载与调试PCIe XDMA驱动的完整实战流程。内容涵盖环境准备、Makefile深度定制、编译排错、驱动加载与内核日志解读、设备节点分析以及用户空间编程实战,旨在帮助开发者打通RK3588与FPGA之间的高速PCIe通信链路,实现稳定可靠的数据传输。

weixin_29304021的博客 482

获得SSDT函数名和索引号的代码

昨天在看雪看到《【下载】发个获得SSDT函数名和索引号的代码》,一时兴起整理了一份内核层根据ntdll.dll和nt模块文件来获取SSDT函数原始的地址的代码,可以用来检测和恢复SSDT hook。 没什么技术含量,不过这却是我第一次规规矩矩地写代码,花费了一下午的时间调整代码格式,填写注释。希望能够尽可能地使代码易读易用易维护,当然,现在依旧感觉有很多不如意的地方,包括安全性与函数的封装,

cqyczj的专栏 2284

用 Joule 点燃 ABAP 开发者的舞台感:SAP BTP 上的 ABAP AI 能力实战解读

摘要:SAP推出的Joule for developers和ABAP AI功能为开发者提供了智能辅助工具,旨在优化ABAP开发流程。主要功能包括上下文感知的代码预测补全、代码解释、单元测试生成和开发问题实时解答。这些能力特别适合应对Cloud环境下ABAP开发的复杂约束,如Clean Core原则和受限语法范围。通过减少重复劳动和提升代码理解效率,该工具帮助开发者将注意力集中在业务逻辑而非技术细节上。随着企业加速向S/4HANA迁移,这些AI功能将在遗留代码改造和云适配中发挥更大作用,建议团队将其纳入工程体

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 296

古风仙侠少女三视图提示词,一键生成角色设定

3D中国写实CG风格,CG渲染质感,精细3D建模,PBR物理材质,细腻服装纹理,电影级灯光,丰富表情,高精度场景,次世代引擎画质。平视正交视角,统一光照,纯白背景,无文字无水印,避免强透视和动态变形。3D中国写实CG风格,CG渲染质感,精细3D建模,PBR物理材质,细腻服装纹理,电影级灯光,丰富表情,高精度场景,次世代引擎画质。3D中国写实CG风格,CG渲染质感,精细3D建模,PBR物理材质,细腻服装纹理,电影级灯光,丰富表情,高精度场景,次世代引擎画质。少女,古风仙侠少女气质,灵动、温婉、仙气。

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 1022

SSDT_Helper for Delphi v1(Ring3下查看SSDT HOOK的Delphi版)

SSDT(System Services Descriptor Table) 这几年被讲烂了,各大论坛、Blog相关文章都是成堆成堆的。检测SSDT HOOK的代码也相当多,只不过放眼望去都是C的。实在不忍自己苦苦捍卫的Delphi就此末落(D2009倒是让人振奋了一把),于是把自己感兴趣的几个代码都给翻成了Delphi的,现在拿来共享。 不会驱动,这方面涉水也比较浅,只能写个查看S

zbc_vc的专栏 1040

大模型多智能体协作面试题及参考答案

在多智能体系统里,代理定义自身目标或效用函数的过程与系统架构、应用场景紧密相关。从本质上讲,目标是代理行为的导向,而效用函数则是对目标达成程度的量化评估。代理通常依据自身角色、系统全局需求以及与其他代理的交互关系来确立目标。比如在合作型 MAS 中,代理目标可能需要与全局目标对齐,像多个物流机器人协作完成货物配送时,每个机器人的目标会围绕 “高效完成分配任务”“避免路径冲突” 等展开,其效用函数可能涉及任务完成时间、能耗等指标的加权求和。目标定义的方式存在多种类型。

大模型大数据攻城狮的专栏 1022

Kernel下检测还原正确的SSDT

Kernel下检测还原正确的SSDT 首先声明这个是菜鸟—我的学习日记,不是什么高深文章,高手们慎看.都好久没写自己的博客了,玩游戏玩到好闷,突然想写一些东西.以前我见到www.rootkit.com上面有人写了怎么在ntkrnlpa.exe或ntoskrnl.exe搜索出正确的SSDT,不过他写的是在User Mode下进行的,那么我就想做到怎么在驱动中也能直接实现搜索正确SSDT.(已

啤梨Lily的 world 2680

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

UNSSDTHOOK

这里先开一个题外话     因为我一直再看 pwn的堆溢出 然后有学弟问我 烫烫 屯屯 什么意思 我一直感觉是个中断值  当  栈或者 堆 溢出的时候  引起中断 然后 警告  后来 感觉自己  理解的有点偏差  这里 是正确的 烫烫是debug中未初始化的栈变量 屯屯是debug中未初始化的堆变量   然后开始今天的重点    emmmmmm  很可惜的一点   这个东西我一直想做 但是...

qq_41071646的博客 159

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

shadow ssdt学习笔记(二)

三。如何hook 似乎这个问题并不大,shadow ssdt和ssdt本质上都是1个地址表,最为简单的方法是把你的函数替换地址表的对应项,具体hook代码甚至可以完全照抄ssdt的,这里只说1下几个偶遇到的小问题 1。win32k.sys不是常在内存的,如果不是GUI线程,shadow ssdt地址无效 解决办法: 1。在driverdispatch中hokk driverdispatc

M-先生 974

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: SHELLCMD下文件上传大法
下一篇: ring3 hide file reg service
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值