绕过安全软件挂钩SSDT的检测

进程线程创建过程 一、进程创建过程 所有进程都通过 PspCreateProcess 函数创建,包括 System 进程。它被三个函数调用,分别是NtCreateProcessEx、PsCreateSystemProcess 和 PspInitPhase0 。 NtCreateProcessEx 是 CreateProcess 的内核服务; PspInitPhase0 函数是系统初始化早期调用的,它创建了 System 进程,System 进程的句柄保存在全局变量 PspInitialSystemProcessHandle 阅读详情

很多安全软件都靠挂钩SSDT中的函数来检测恶意代码,就拿卡巴举例吧,他挂了NtCreateKey来检测注册表的创建,NtCreateThread和NtResumeThread/NtWriteVirtualMemory来检测远程注入, 等等,这些钩子让我们后期的动作很可能暴露,怎么样才能为所欲为呢?
我这里提一种方案:
1. 首先在用户态读取NTOSKRNL.EXE,找出原始的SSDT的位置,提交到内核驱动中,内核保存起来以便使用
2. 在用户态勾住Ntdll中的NtCreateThread,
3. 当调用NtCreateThread,直接将NtCreateThread的参数以及SSDT索引号通过DeviceIoControl传递到自己的驱动中,在自己的驱动手动压栈并根据对应的SSDT索引号来调用相应的函数,最后将返回值传递到应用层, 这个只是针对NtCreateThread的特例,其他的可以照搬, 不过不用担心必须针对任何一个函数都要在驱动做特定的措施,可以写个通用的,这个就自己想办法了,我倒是早就实现了一个,不过感觉有点黄and暴力,就不贴代码了.
经过我们这番处理之后,流程的变化我简单描述一下:

干净的系统创建线程的流程:
CreateThread->NtCreateThread->(2000通过int 2e进入内核)->原始的SSDT表中的NtCreateThread->

安装安全产品后的创建线程的流程:
CreateThread->NtCreateThread->(2000通过int 2e进入内核)->被挂钩的SSDT表中的NtCreateThread(这里安全软件开始检测)->原始的SSDT表中的NtCreateThread->

经过我们处理后的流程:
CreateThread->NtCreateThread->(通过DeviceIoControl进入内核)->直接调用原始的SSDT表中的NtCreateThread->

可能有人说那还不如直接恢复SSDT来的痛快, (那还不被发现了哦! 呵呵,要低调低调)

思路就这样, 欢迎讨论!

驱动开发:内核扫描SSDT挂钩状态 其次我们还需要实现另一个功能,此时想像一下当我告诉你一个内存地址,我想要查该内存地址属于哪个模块该如何实现,其实很简单只需要拿到这个地址依次去判断其是否大于等于该模块的基地址,并小于等于该模块的结束地址,那么我们就认为该地址落在了此模块上,在这个思路下。则是读取磁盘文件并将其完整拷贝一份,这是两者的本质区别,如下代码则是实现完整拷贝的实现;开头的系列函数,然后依次对比起源地址与原地址是否一致,得出是否被挂钩,完整代码如下所示;函数,该函数的作用是读入一个内核文件到内存空间中,此处如果您使用前一篇。 阅读详情

相关推荐

Win64 驱动内核编程-19.HOOK-SSDT

HOOK SSDT     在 WIN64 上 HOOK SSDT 和 UNHOOK SSDT 在原理上跟 WIN32 没什么不同,甚至说 HOOK 和 UNHOOK 在本质上也没有不同,都是在指定的地址上填写一串数字而已 (填写代理函数的地址时叫做 HOOK,填写原始函数的地址时叫做 UNHOOK)。不过实现起来还是很大不同的。 一 、 HOOK SSDT     要挂钩 SSDT,必然

天使也掉毛 5071

线程的创建过程——NtCreateThread逆向

线程的创建是从NtCreateThread开始真正执行的。

weixin_45678798的博客 854

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

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

weixin_35752233的博客 975

Inject集合----远程线程注入(NtCreateThreadEx)

介绍: 前面写过一片远程线程注入的文章,用到的是CreateRemoteThread函数来远程注入线程的,这次我们用NtCreateThreadEx来创建远程线程,其实并没有技术的升级,而是进行了创建远程线程函数的升级,下面是CreateRemoteThread在Reactos中的源码 /* Create the Kernel Thread Object */ Status = NtCreateThread(&hThread, ...

qq_42021840的博客 2882

初探SSDT

SSDT 的全称是 System Services Descriptor Table,系统服务描述符表。这个表就是一个把 Ring3 的 Win32 API 和 Ring0 的内核 API 联系起来。SSDT 并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。通过修改此表的函数地址可以对常用 Windows 函数及 API 进行 Hook,从而实现对一些关心的系统动作进行过滤、监控的目的。一些 HIPS、防毒软件、系统监控、注册表监控软件往往会采用此接.

hongduilanjun的博客 2725

远程线程注入之突破Session0隔离会话

当我们使用远程线程注入将dll注入至系统服务进程中往往会失败,这是因为大多数系统服务都是在Session0中运行的 "Session 0"是Windows操作系统中的一个特殊的会话,专门用于运行系统服务和其他在用户登录之前就需要运行的程序。从Windows Vista和Windows Server 2008开始,为了提高安全性,Windows将用户和系统服务分隔在不同的会话中。具体来说,所有的服务和系统任务都在Session 0中运行,而所有用户交互任务都在其他会话中运行

xf555er的博客 1689

深入解析Shadow SSDT服务函数原始地址获取技术

回顾这场长达二十年的攻防拉锯战,你会发现:SSDT Hook 曾经是 Rootkit 的标配技能;Shadow SSDT 的出现标志着微软开始推行纵深防御理念;PatchGuard 让“默认拒绝”成为内核设计的新哲学;如今的终端安全早已超越单一技术点,走向体系化对抗。而对于我们这些技术人员来说,理解这些底层机制的意义远不止于“炫技”。当你知道不仅是一个隐藏的结构,更是现代操作系统自我保护思想的具体体现时,你会更加敬畏每一行代码背后的工程智慧。

weixin_35257663的博客 1021

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

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

weixin_33240461的博客 770

过TP驱动1(SSDT部分)

#include #include #include typedef struct _ServiceDescriptorTable { PVOID ServiceTableBase; PVOID ServiceCounterTable; unsigned int NumberOfServices; PVOID ParamTableBase; }*PSe

guoyi987的专栏 981

城里城外看SSDT[转]

点这里下载本文的配套代码 引子 2006年,中国互联网上的斗争硝烟弥漫。这时的战场上,先前颇为流行的窗口挂钩、API挂钩、进程注入等技术已然成为昨日黄花,大有逐渐淡出之势;取而代之的,则是更狠毒、更为赤裸裸的词汇:驱动、隐藏进程、Rootkit…… 前不久,我不经意翻出自己2005...

chubaisheng8627的博客 74

【原创】RootKit hook之[二] SSDT hook

标 题: 【原创】RootKit hook之[二] SSDT hook 作 者: combojiang 时 间: 2008-01-12,23:00:47 链 接: http://bbs.pediy.com/showthread.php?t=58199 哈,好大一场雪啊,2008年的第一场雪,比以往来得早些。外面的雪在下,透过书房的窗,欣赏着外面的雪和过往的车辆,欣赏之余,便有了想写点东

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

SSDT inlineHook

上一篇我们介绍了最简单的SSDT,这篇来写一下inlineHook。 所谓的inlineHook就是在内存中修改所需要挂钩函数的前几个字节,让其跳转到我们的fake函数,执行完毕后再跳回去执行原函数,这样的话我们就没有修改SST表里面的内容,而是对函数本身修改。 流程摘自:看雪aniquest 1. 获取服务函数地址: (1)通过全局变量KeServiceDescriptorTable获得SSDT表的起始地址; (2)映射ntdll.dll到ring0空间,获得要Hook的函数的服务索引号; (

dre4merp 522

部分主流杀软驱动挂钩分析

本帖最后由 shulun743 于 2014-1-24 12:27 编辑 主要说32位系统: 挂钩方式,现在常用的就是挂钩ssdt,shadown ssdt,inline hook 挂钩文件系统过滤驱动和HOOK NT!KiFastCallEntry! 不具体讨论HOOK和INLINE HOOK的区别了!就是蓝屏不蓝屏的问题! 主要讨论挂钩位置的问题: 分为两大阵营: 1

swanabin的专栏 1040
上一篇: guitoolkit 的使用问题
下一篇: 通过PspTerminateThreadByPointer结束进程
galihoo
博客等级 码龄21年 14粉丝 14原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值