首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

驱动开发内核运用LoadImage屏蔽驱动

在笔者上一篇文章《驱动开发内核监视LoadImage映像回调》中LyShark简单介绍了如何通过PsSetLoadImageNotifyRoutine函数注册回调来监视驱动模块的加载,注意我这里用的是监视而不是监控之所以是监视而不是监控那是因为...节点,该节点里面就是被加载驱动入口,通过汇编在驱动头部写入ret返回指令,即可实现屏蔽加载特定驱动文件。...原理其实很容易理解,如果我们需要实现则只需要在《驱动开发内核监视LoadImage映像回调》这篇文章的代码上稍加改进即可,当检测到lyshark.sys驱动加载时,直接跳转到入口处快速写入一个Ret让驱动返回即可...,至于如何写出指令的问题如果不懂建议回头看看《驱动开发内核CR3切换读写内存》文章中是如何读写内存的,这段代码实现如下所示。...FullImageName, szFullImageName);if (strstr(_strlwr(szFullImageName), "lyshark.sys")){DbgPrint("[LyShark] 拦截SYS内核模块

1.3K20
您找到你想要的搜索结果了吗?
是的
没有找到

Windows内核驱动开发:HelloWorld

Version: 10.0.19041.1 Visual Studio: Community 2019 Test Machine: Windows 7 SP1 + KMD Manager + DbgView 开发环境搭建...参照:https://docs.microsoft.com/zh-cn/windows-hardware/drivers/download-the-wdk 除了在安装VS2019的时候,选择C++桌面开发环境...然后下载适用2004的WDK安装文件,双击之后,需要联网下载安装WDK相关文件和VS2019驱动开发插件,根据提示点过去就可以。...KMD Mananger工具用来管理内核驱动服务(注册、启动、停止、卸载),DbgView用来查看驱动打印信息,这两个工具都需要管理员权限运行。...根据官网的描述,如果创建的驱动不是基于设备的,即通用型内核驱动,则需要删或者改一些东西,如果可以看懂怎么改就直接改就可以,例如: 原始inf中要改的部分: [Manufacturer] %ManufacturerName

2.3K40

驱动开发内核ShellCode线程注入

还记得《驱动开发内核LoadLibrary实现DLL注入》中所使用的注入技术吗,我们通过RtlCreateUserThread函数调用实现了注入DLL到应用层并执行,本章将继续探索一个简单的问题,如何注入...传入内存块的变量列表,而如果将StartParameter地址填充为NULL则表明不传递任何参数,也就是只在线程中执行ShellCode代码,利用这个特点我们就可以在上一篇文章的基础之上简单改进代码即可实现驱动级后门注入的功能...msf6 exploit(multi/handler) > exploit 服务端执行后则会进入侦听等待阶段,输出效果图如下所示; 此时我们使用如下代码片段,并自行修改进程PID为指定目标进程,编译生成驱动程序...ref_address); DbgPrint("对端进程: %d \n", process_id); DbgPrint("分配长度: %d \n", create_size); DbgPrint("分配的内核堆基址...process_id, ref_address); } DriverObject->DriverUnload = Unload; return STATUS_SUCCESS; } 编译并在客户端运行这个驱动程序

26140

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

通过前面的学习我们已经可以编写一个驱动程序并挂钩到指定的内核函数上了,接下来我们将一步步的通过编写驱动程序,手动的来解除 NtOpenProcess 函数的驱动保护,以此来模拟如何一步步干掉游戏保护。...,然后回到虚拟机并加载这段驱动,手动验证一下观察:图片上方的驱动代码也可以改用汇编来实现,其效果是相同的,贴出汇编代码的实现流程,这里就不演示了。...//去掉内核页面保护__asm{//保存写入前的数据,用于驱动卸载恢复。...//恢复内核页面保护将代码编译,并拖入虚拟机加载驱动,Hook之前如图一所示,Hook之后如图二,发现程序已经跳转到了原始的代码上了,Hook被解除啦。...通过WinDBG附加内核调试,然后输入以下命令,记得加载符号链接。

66210

驱动开发内核枚举ShadowSSDT基址

在笔者上一篇文章《驱动开发:Win10枚举完整SSDT地址表》实现了针对SSDT表的枚举功能,本章继续实现对SSSDT表的枚举,ShadowSSDT中文名影子系统服务描述表,SSSDT其主要的作用是管理系统中的图形化界面...,其Win32子系统的内核实现是Win32k.sys驱动,属于GUI线程的一部分,其自身没有导出表,枚举SSSDT表其与SSDT原理基本一致。...如下是闭源ARK工具的枚举效果:图片首先需要找到SSSDT表的位置,通过《驱动开发:Win10内核枚举SSDT表基址》文章中的分析可知,SSSDT就在SSDT的下面,只需要枚举4c8d1dde1e3a00...NumberOfServices);return pWin32k->NumberOfServices;}VOID UnDriver(PDRIVER_OBJECT driver){DbgPrint(("驱动程序卸载成功...NumberOfServices);return pWin32k->NumberOfServices;}VOID UnDriver(PDRIVER_OBJECT driver){DbgPrint(("驱动程序卸载成功

49730

驱动开发:摘除InlineHook内核钩子

在笔者上一篇文章《驱动开发内核层InlineHook挂钩函数》中介绍了通过替换函数头部代码的方式实现Hook挂钩,对于ARK工具来说实现扫描与摘除InlineHook钩子也是最基本的功能,此类功能的实现一般可在应用层进行...,而驱动层只需要保留一个读写字节的函数即可,将复杂的流程放在应用层实现是一个非常明智的选择,与《驱动开发内核实现进程反汇编》中所使用的读写驱动基本一致,本篇文章中的驱动只保留两个功能,控制信号IOCTL_GET_CUR_CODE...图片首先将内核驱动程序代码放到如下,内核驱动程序没有任何特别的,仅仅只是一个通用驱动模板,在其基础上使用CR3读写,如果不理解CR3读写的原理您可以去看《驱动开发内核CR3切换读写内存》这一篇中的详细介绍...WinDDK.sys并通过KmdManager将驱动程序拉起来,运行客户端lyshark.exe程序会输出当前FunctionList列表中,指定的4个函数的挂钩情况。...图片参考文献WIN64内核编程基础 胡文亮

29810

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

,诸如地址索引的基址、服务函数个数等,SSDT 通过修改此表的函数地址可以对常用 Windows 函数进行内核级的Hook,从而实现对一些核心的系统动作进行过滤、监控的目的,接下来将演示如何通过编写简单的驱动程序...,由 ntoskrnl.exe 程序向内核发送IO请求,然后内核驱动程序返回执行的结果。...编写驱动程序: 接着我们分别使用C语言和汇编实现读取系统的SSDT表,此处使用的系统是Win7,由于 Win7 系统默认情况下本地内核调试功能被屏蔽了,所以必须在控制台下运行 bcdedit -debug...,下面的第一种挂钩方式可以实现对特定内核函数的重写,而第二种挂钩方式则可以用于驱动保护。...\n");}当驱动被加载时,可以通过Xuetr查看到内核SSDT层出现了红色的钩子。

71320

驱动开发内核枚举ShadowSSDT基址

在笔者上一篇文章《驱动开发:Win10枚举完整SSDT地址表》实现了针对SSDT表的枚举功能,本章继续实现对SSSDT表的枚举,ShadowSSDT中文名影子系统服务描述表,SSSDT其主要的作用是管理系统中的图形化界面...,其Win32子系统的内核实现是Win32k.sys驱动,属于GUI线程的一部分,其自身没有导出表,枚举SSSDT表其与SSDT原理基本一致。...如下是闭源ARK工具的枚举效果: 首先需要找到SSSDT表的位置,通过《驱动开发:Win10内核枚举SSDT表基址》文章中的分析可知,SSSDT就在SSDT的下面,只需要枚举4c8d1dde1e3a00...NumberOfServices); return pWin32k->NumberOfServices; } VOID UnDriver(PDRIVER_OBJECT driver) { DbgPrint(("驱动程序卸载成功...NumberOfServices); return pWin32k->NumberOfServices; } VOID UnDriver(PDRIVER_OBJECT driver) { DbgPrint(("驱动程序卸载成功

35820

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

,诸如地址索引的基址、服务函数个数等,SSDT 通过修改此表的函数地址可以对常用 Windows 函数进行内核级的Hook,从而实现对一些核心的系统动作进行过滤、监控的目的,接下来将演示如何通过编写简单的驱动程序...,由 ntoskrnl.exe 程序向内核发送IO请求,然后内核驱动程序返回执行的结果。...编写驱动程序: 接着我们分别使用C语言和汇编实现读取系统的SSDT表,此处使用的系统是Win7,由于 Win7 系统默认情况下本地内核调试功能被屏蔽了,所以必须在控制台下运行 bcdedit -debug...挂钩函数有多种用途,下面的第一种挂钩方式可以实现对特定内核函数的重写,而第二种挂钩方式则可以用于驱动保护。...\n"); } 当驱动被加载时,可以通过Xuetr查看到内核SSDT层出现了红色的钩子。

57520

驱动开发:摘除InlineHook内核钩子

在笔者上一篇文章《驱动开发内核层InlineHook挂钩函数》中介绍了通过替换函数头部代码的方式实现Hook挂钩,对于ARK工具来说实现扫描与摘除InlineHook钩子也是最基本的功能,此类功能的实现一般可在应用层进行...,而驱动层只需要保留一个读写字节的函数即可,将复杂的流程放在应用层实现是一个非常明智的选择,与《驱动开发内核实现进程反汇编》中所使用的读写驱动基本一致,本篇文章中的驱动只保留两个功能,控制信号IOCTL_GET_CUR_CODE...首先将内核驱动程序代码放到如下,内核驱动程序没有任何特别的,仅仅只是一个通用驱动模板,在其基础上使用CR3读写,如果不理解CR3读写的原理您可以去看《驱动开发内核CR3切换读写内存》这一篇中的详细介绍...WinDDK.sys并通过KmdManager将驱动程序拉起来,运行客户端lyshark.exe程序会输出当前FunctionList列表中,指定的4个函数的挂钩情况。...参考文献 WIN64内核编程基础 胡文亮

24920

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

通过前面的学习我们已经可以编写一个驱动程序并挂钩到指定的内核函数上了,接下来我们将一步步的通过编写驱动程序,手动的来解除 NtOpenProcess 函数的驱动保护,以此来模拟如何一步步干掉游戏保护。...,然后回到虚拟机并加载这段驱动,手动验证一下观察: 上方的驱动代码也可以改用汇编来实现,其效果是相同的,贴出汇编代码的实现流程,这里就不演示了。...//去掉内核页面保护 __asm { //保存写入前的数据,用于驱动卸载恢复。...//恢复内核页面保护 将代码编译,并拖入虚拟机加载驱动,Hook之前如图一所示,Hook之后如图二,发现程序已经跳转到了原始的代码上了,Hook被解除啦。...通过WinDBG附加内核调试,然后输入以下命令,记得加载符号链接。

65430

驱动开发内核ShellCode线程注入

还记得《驱动开发内核LoadLibrary实现DLL注入》中所使用的注入技术吗,我们通过RtlCreateUserThread函数调用实现了注入DLL到应用层并执行,本章将继续探索一个简单的问题,如何注入...传入内存块的变量列表,而如果将StartParameter地址填充为NULL则表明不传递任何参数,也就是只在线程中执行ShellCode代码,利用这个特点我们就可以在上一篇文章的基础之上简单改进代码即可实现驱动级后门注入的功能...9999msf6 exploit(multi/handler) > exploit服务端执行后则会进入侦听等待阶段,输出效果图如下所示;图片此时我们使用如下代码片段,并自行修改进程PID为指定目标进程,编译生成驱动程序...KeUnstackDetachProcess(&ApcState);}return FALSE;}VOID Unload(PDRIVER_OBJECT pDriverObj){DbgPrint("[-] 驱动卸载...&ref_address);DbgPrint("对端进程: %d \n", process_id);DbgPrint("分配长度: %d \n", create_size);DbgPrint("分配的内核堆基址

44150

驱动开发内核枚举驱动内线程(答疑篇)

这篇文章比较特殊,是一篇穿插答疑文章,由于刚好在前一篇教程《驱动开发内核枚举PspCidTable句柄表》整理了枚举句柄表的知识点,正好这个知识点能解决一个问题,事情是这样的有一个粉丝求助了一个问题,...好了步入正题,这个枚举驱动内的线程我们无法用传统的API去枚举,原因很简单你拿不到进程的EPROCESS结构,或者说他这个驱动程序本身就是系统的一部分根本就没有进程ID的概念,由于我一直没有尝试这个需求...图片但是这个是全局的,无法得到它属于哪个驱动模块,这就很尴尬了。...你或许灵机一动,我直接得到ETHREAD信息,从里面找EPROCESS,再从里面找进程名,但跟到最后你会发现它显示的是SYSTEM进程,如果继续往下就是内核了,小丑竟是你自己。...这样我们首先枚举的是驱动完整信息,然后在和线程作比较,从而判断或者说归档,将某一些子线程归类到某个驱动程序上面,代码我就不写了,再写也是重复的东西,前面的文章中都有代码,自己拼凑一下就可以实现的功能。

46450

驱动开发:封装x64内核驱动读写

内核级别的内存读写可用于绕过各类驱动保护,从而达到强制读写对端内存的目的,本人闲暇之余封装了一个驱动级的内核读写接口,使用此接口可实现对远程字节,字节集,整数,浮点数,多级偏移读写等。...如下将简单介绍该内核读写工具各类API接口是如何调用的,鉴于驱动读写商业价值较大故暂时不放出源码(后期考虑)。...GitHUB项目地址:https://github.com/lyshark/LyMemory驱动读写首先要看的就是驱动支持的控制信号,如下是我封装的几个驱动控制器。...METHOD_BUFFERED, FILE_ANY_ACCESS)// 版本升级后的新功能 2022-09-24#define IOCTL_IO_ReadDeviationMemory 0x815内核驱动读写类库在...: 内核中强制读取指定进程中模块的基地址。

1.9K30

驱动开发内核LoadLibrary实现DLL注入

远程线程注入是最常用的一种注入技术,在应用层注入是通过CreateRemoteThread这个函数实现的,该函数通过创建线程并调用 LoadLibrary 动态载入指定的DLL来实现注入,而在内核层同样存在一个类似的内核函数...路径字符串写出到对端内存,函数封装来源于《内核MDL读写进程内存》章节;3.调用GetUserModuleAddress,获取到kernel32.dll模块基址,函数封装来源于《内核远程线程实现DLL注入...注入依赖于RtlCreateUserThread这个未到处内核函数,该内核函数中最需要关心的参数是ProcessHandle用于接收进程句柄,StartAddress接收一个函数地址,StartParameter...sign one's name on a piece of work// PowerBy: LyShark// Email: me@lyshark.com#include "lyshark.h"// 驱动卸载例程...VOID UnDriver(PDRIVER_OBJECT driver){DbgPrint("Uninstall Driver \n");}// 驱动入口地址NTSTATUS DriverEntry(IN

771150

驱动开发:WinDBG 配置内核双机调试

WinDBG 是在windows平台下,强大的用户态和内核态调试工具,相比较于Visual Studio它是一个轻量级的调试工具,所谓轻量级指的是它的安装文件大小较小,但是其调试功能却比VS更为强大,WinDBG...由于是微软的产品所以能够调试Windows系统的内核,另外一个用途是可以用来分析dump数据,本笔记用于记录如何开启Windows系统内核调试功能,并使用WinDBG调试驱动。...DriverDefaultHandle; } // 设置断点 DbgBreakPoint(); // KdBreakPoint(); // __debugbreak(); DbgPrint("驱动已加载...\n"); Driver->DriverUnload = UnDriver; return STATUS_SUCCESS;}当Windows系统加载完成以后,拖入我们的驱动文件WinDDK.sys...,并通过驱动加载工具加载运行,此时Windows系统会卡死,回到WinDBG中发现已经可以进行调试了。

1.1K20

驱动开发内核读取SSDT表基址

在前面的章节《X86驱动:挂接SSDT内核钩子》我们通过代码的方式直接读取 KeServiceDescriptorTable 这个被导出的表结构从而可以直接读取到SSDT表的基址,而在Win64系统中...为了确保系统的安全性与稳定性,微软从 Windows Vista X64 开始对系统内核增加了一定的限制,其主要增加了两种保护措施,一是KPP (内核补丁保护),KPP是机制其利用了PG(PatchGuard...)技术,PG技术在x64系统下加入了内核哨兵,用于检测系统内核是否被恶意篡改(打补丁),如果发现被打了补丁,则会导致关键结构损毁直接蓝屏,二是DSE (驱动强制签名),DSE技术则是拒绝加载不包含正确签名的驱动...1.这里我们可以通过MSR(特别模块寄存器),读取C0000082寄存器,从而得到KiSystemCall64的地址,在内核调试模式下直接输入 rdmsr c0000082 即可读取到该地址,反汇编可看到...include #pragma intrinsic(__readmsr) VOID UnDriver(PDRIVER_OBJECT driver) { DbgPrint(("驱动程序卸载成功

45920

驱动开发内核遍历文件或目录

在笔者前一篇文章《驱动开发内核文件读写系列函数》简单的介绍了内核中如何对文件进行基本的读写操作,本章我们将实现内核下遍历文件或目录这一功能,该功能的实现需要依赖于ZwQueryDirectoryFile...这个内核API函数来实现,该函数可返回给定文件句柄指定的目录中文件的各种信息,此类信息会保存在PFILE_BOTH_DIR_INFORMATION结构下,通过遍历该目录即可获取到文件的详细参数,如下将具体分析并实现遍历目录功能...\\C:\\Windows"); MyQueryFileAndFileFolder(ustrQueryFile); DbgPrint("驱动加载成功 \n"); Driver->DriverUnload...= UnDriver; return STATUS_SUCCESS; } 编译如上驱动程序并运行,则会输出C:\\Windows目录下的所有文件和目录,以及创建时间和修改时间,输出效果如下图所示;...你是否会觉得很失望,为什么不是递归枚举,这里为大家解释一下,通常情况下ARK工具并不会在内核层实现目录与文件的递归操作,而是将递归过程搬到了应用层,当用户点击一个新目录时,在应用层只需要拼接新的路径再次发送给驱动程序让其重新遍历一份即可

19240
领券