入侵Windows揭秘 平台内核级文件访问

[Win驱动7]ObReferenceObjectByName获取设备对象指针(PDEVICE_OBJECT) 1. ObReferenceObjectByName是通过设备对象名获取设备对象指针, 其会造成设备对象的引用计数增加所以还需要调用ObDereferenceObject来降低引用计数 2. IoGetDeviceObjectPointer可以通过设备对象名获取设备对象指针和与其相关的文件对象指针,同样需要对其调用ObDereferenceObject来降低引用 第一种方式是通过这个未公开的内核函数ObReferenceObjectByName来获取设备对象指针,该原型是这样的: NTKERNELA 阅读详情
背景

  在windows平台下,应用程序通常使用API函数来进行文件访问,创建,打开,读写文件。从kernel32的CreateFile/ReadFile/WriteFile函数,到本地系统服务,再到FileSystem及其FilterDriver,经历了很多层次。在每个层次上,都存在着安全防护软件,病毒或者后门作监视或者过滤的机会。作为安全产品开发者,我们需要比别人走得更远,因此我们需要一个底层的“windows平台内核级文件访问”的方法来确保我们能够看到正确的干净的文件系统。

  直接访问FSD的内核级别文件访问

  FSD(FileSystemDriver)层是文件API函数经过本地系统服务层(native API)最后到达的驱动层次。如果我们可以模仿操作系统,在我们自己的驱动程序里直接向FSD发送IRP,就可以绕过那些native API 和win32 API了,也就可以绕过设置在这些层次上面的API钩子等监控措施。

  文件的Create和Open

  文件的Create和Open可以通过发送IRP_MJ_CREATE给FSD,或者调用IoCreateFile函数来完成。Create和Open的区别实际上在于IoCreateFile/IRP_MJ_CREATE的一个参数Disposition的取值。

  通过发送IRP_MJ_CREATE给FSD的方法与此类似,可以参考IFSDDK document的IRP_MJ_CREATE说明。不同于上面方法的是需要自己创建一个FILE_OBJECT,好于上面方法的是这种方法不需要一个HANDLE,HANDLE是线程依赖的,FileObject则是线程无关。

  文件的Read和Write

  我们通过给FSD发送IRP_MJ_READ来读取文件,给FSD发送IRP_MJ_WRITE来改写文件。

  如果我们是通过一个HANDLE来执行(如使用IoCreateFile打开的文件),就要先用ObReferenceObjectByHandle函数来获得这个Handle对应的FileObject。我们只能给FileObject发送IRP。

  之后我们使用IoAllocateIrp分配一个IRP。根据FileObject->DeviceObject->Flags的值,我们判断目标文件系统使用什么样的IO方式。

  对每种不同的IO方式使用不同的地址传递方式。随后我们填充IRP内的各个参数域,就可以发送IRP了。

  接着要考虑如果IRP不能及时完成,会异步的返回的情况,我们安装一个CompletionRoutine,在CompletionRoutine里面设置一个事件为已激活,通知我们的主线程读取或者写入操作已经完成。

  现在可以发送IRP了。如果不采取特殊的措施的话,IRP发送目标是FileObject对应的DeviceObject。发送后,等待IRP的完成并且释放资源,返回。

  文件的Delete

  Delete实际上是通过向FSD发送IRP_MJ_SET_INFORMATION的IRP,并把IrpSp->Parameters.SetFile.FileInformationClass设置为FileDispositionInformation,用一个FILE_DISPOSITION_INFORMATION结构填充buffer来执行的。

  文件的Rename

  类似于Delete,Rename是向FSD发送IRP_MJ_SET_INFORMATION的IRP,把IrpSp->Parameters.SetFile.FileInformationClass设置为FileRenameInformation,填充buffer为FILE_RENAME_INFORMATION结构。

  综上,于是我们可以在驱动里面通过发送IRP来直接访问文件系统了,绕过了native API 和win32 API层次。

  绕过文件系统过滤驱动和钩子

  有了以上的内容,我们目前可以直接给FSD发送请求操作文件。但是这还不够,因为有很多的杀毒软件或者监视工具使用FSD Filter Driver或者FSD Hook的办法来监控文件操作

  对付文件系统过滤驱动

  文件系统过滤驱动Attach在正常的文件系统之上,监视和过滤我们的文件访问。文件系统驱动栈就是由这一连串的Attach起来的过滤驱动组成。我们可以用IoGetRelatedDeviceObject这个函数来获得一个FileObject对应的最底层的那个功能驱动对象(FDO)。但是这样虽然绕过了那些过滤驱动,却同时也绕过了正常的FSD如Ntfs/Fastfat,因为正常的FSD也是作为一个过滤驱动存在的。磁盘文件对象的对应的最底层的FDO是Ftdisk.sys,它已经因为过于底层而不能处理我们投递的IRP请求。

  其实正常的FSD信息存储在一个Vpb结构中,我们可以使用IoGetBaseFileSystemDeviceObject这个未公开的内核函数来得到它。它就是我们发送IRP的目标了。

  对付替换DispatchRoutine的FSD Hook

  这是一种常用的FSD Hook方式。我们需要得到原本的DispatchRoutine,向原本的DispatchRoutine发送我们的IRP。这里提供一个思路:我们可以读取原本FSD驱动的.INIT段或者.TEXT段,查找其DriverEntry函数,在它的DriverEntry函数中肯定设置了自己的DriverObject的各个DispatchRoutine。在这个函数中我们就能找到我们想要的DispatchRoutine的地址。只需要使用特征码搜索的方法就可以搜索到这个值。

  对付Inline Hook DispatchRoutine函数本身的FSD Hook

  这种Hook方法比较狠毒,但不是非常常见于安全产品中,一般应用在木马和rootkit上,比如我自己写的rootkit。它没有更改DriverObject里面的DispatchRoutine的函数指针,而是向函数开头写入汇编指令的JMP来跳转函数。对付它的基本思路就是读取存在磁盘上的FSD的文件,加载到内存一份干净的备份,察看我们要调用的DispatchRoutine开头的几个字节和这个干净备份是否一致。如果不一致,尤其是存在JMP,RET,INT3一类的汇编指令的时候,很可能就是存在了Inline Hook。(但要充分考虑重定位的情况。)如果存在Inline Hook,我们就把干净的函数开头拷贝过来覆盖掉被感染的函数头。然后在发送IRP,就不会被Inline Hook监视或篡改了 
从零开始:使用PacBio HiFi和ONT超长读取组装基因组(保姆级教程) 本文提供了一份从零开始的基因组组装保姆级教程,详细讲解了如何融合PacBio HiFi高精度读长与ONT超长读长数据。内容涵盖数据质控、预处理、混合组装策略选择、结果评估及Hi-C支架构建等关键步骤,旨在帮助研究人员获得高质量的完整基因组。 阅读详情

相关推荐

卷王问卷考试系统——测试报告

本问卷考试系统是一款在线平台,支持用户发布和完成调查问卷,并进行考试管理,核心功能在于简化问卷创建发布、数据收集及考试组织流程。此次测试将围绕其关键模块展开,涵盖用户注册登录、项目列表、我的练习以及我的题库等核心部分。问卷考试系统(一)硬件环境普通办公电脑(CPU:Intel i5 、内存:16GB 、硬盘:512GB )(二)软件环境操作系统:Windows 11 ;浏览器:Chrome(版本 120+)、Firefox(版本 115+)、Edge(版本 120+)验证界面信息在完整性、一致性、准确性和用

m0_73433755的博客 556

windows文件操作简单笔记

 windows中文件操作:   copyfile->copyfileexw(fileopcr.c)->BasepCopyFileExW(检查源文件是否存在,看是否是链接文件   NtQueryInformationFile查询文件拷贝的大小)->BaseCopyStream(查询原文件时间和属性,新建目的文件,做目的文件的句柄处理,拷贝数据,处理the reparse p...

研究源码的最底层,只持有正确的仓位 1529

新手必看:LiteRadio 2c SE遥控器从开箱到飞行的完整指南(附常见问题解答)

本文为新手提供LiteRadio 2c SE遥控器的完整使用指南,涵盖从开箱到首飞的20个关键步骤。详细介绍了遥控器的功能设置、与无人机的对频技巧以及首飞注意事项,帮助用户快速掌握飞行控制,避免常见错误。特别适合无人机初学者阅读。

weixin_29209801的博客 381

过滤驱动容易让新手纠结的几个函数

1. IoAttachDevice NTSTATUS IoAttachDevice( IN PDEVICE_OBJECT SourceDevice, IN PUNICODE_STRING TargetDevice, OUT PDEVICE_OBJECT *AttachedDevice ); 将【指定指针】的设备对象附加到【指定名称】的设备对象所在的【设备对象栈】

StoneRain 3100

【第三方互联】12、支付宝(Alipay)授权第三方登录

我们创建了支付宝开放平台的网页&移动应用,审核通过后,我们需要拿到appid,支付宝公钥,私钥进项开发 一、添加应用信息至项目环境中 我们保存了 appid、应用私钥、支付宝公钥、支付宝回调地址等信息,这里的公钥为支付宝开放平台为我们生成的“支付宝公钥” 二、引入 Maven 依赖 <!-- 支付宝SDK --> <dependency> <g.........

JACKAL 21万+

Python爬虫实战:全面采集国家自然科学基金项目数据的全流程指南

国家自然科学基金委员会(NSFC)支持基础研究、应用基础研究,是我国科研投入的核心项目之一。公开的项目数据包括项目名称、负责人、资助金额、年度、单位等,具备极高科研和数据分析价值。requests:基础HTTP请求库,简单直观:异步HTTP请求库,适合大规模并发:HTML解析,提取数据:处理JavaScript渲染网页pandas:数据分析与清洗:数据库存储:重试机制实现。

2201_76125261的博客 753

遍历驱动的设备栈遇到的问题及解决

首先来说一下我遇到的几个问题: 可以看到上面的代码中我是要打印4项,分别是驱动名称, 设备名称,驱动地址以及设备地址。但结果: 驱动名称出来了但设备名没有。 分明pObjNameInfo->Name.Buffer都存在,怎么会打印不出来呢? 于是我看了下里面 可以看到这里显示无法读取这里的内存, 这我真的懵逼了。 在者,这里面会打印如下内容: 驱动自身的设备链 附着在驱动设备上的设备链 可以看到上面结果中所有设备名称都存在的但是没被显示出来,原因是无法被读取。而无法读取的

輚至消亡 1040

YOLO11-pose关键点检测:训练实战篇 | 自己数据集从labelme标注到生成yolo格式的关键点数据以及训练教程

教会你如何用自己的数据集转换成对应格式的数据集以及如何训练YOLO11-pose关键点检测

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 5419

windows内核情景分析---设备驱动

设备驱动 设备栈:从上层到下层的顺序依次是:过滤设备、类设备、过滤设备、小端口设备【过、类、过滤、小端口】 驱动栈:因设备堆栈原因而建立起来的一种堆栈  老式驱动:指不提供AddDevice的驱动,又叫NT式驱动 Wdm驱动:指提供了AddDevice的驱动 驱动初始化:指IO管理器加载驱动后,调用驱动的DriverEntry、AddDevice函数 设备栈中上层设备与下层设备的绑定关

maomao171314的专栏 2055

AHB—SRAMC项目(结构图,核心代码、Testbench架构)

文章目录一、AHB_SRAMC项目介绍1.1.AHB总线控制单元(ahb_slv_if.v)1.2.SRAM控制单元(sramc_top.v)1.3.主要的传输路径二、结构框图2.1.AHB_SRAMC结构图(重点)2.2.总线控制单元与SRAM控制单元结构图三、部分核心代码(重点理解)四、SystemVerilog Testbench架构(重点)五、目录结构 一、AHB_SRAMC项目介绍 本项...

Mr.翟的博客 3万+

智能温室:温室环境监测_(7).土壤监测技术包括pH值和电导率

土壤的pH值是指土壤溶液的酸碱度,它对植物的营养吸收和生长发育有着重要的影响。在智能温室中,土壤监测是非常重要的一个环节,因为土壤的pH值和电导率直接影响植物的生长和健康。本节将详细介绍如何利用传感器和数据处理技术来监测土壤的pH值和电导率,并提供具体的代码示例。在智能温室中,监测到的土壤pH值和电导率数据需要传输到中央控制系统进行进一步的处理和分析。通过以上步骤,您可以构建一个完整的智能温室土壤监测系统,实时监控土壤的pH值和电导率,确保植物在最佳的生长环境中。校准通常包括在已知电导率的标准溶液中进行。

zhubeibei168的博客 1408

Windows系统安全终极武器:OpenArk深度解析与实战指南

你是否曾经遇到过杀毒软件无法检测的隐藏恶意进程?或者面对系统异常却找不到根源?在Windows安全防护领域,传统的安全工具往往难以应对高级Rootkit(根工具包)的威胁。OpenArk作为新一代开源反Rootkit工具,为技术爱好者和安全研究人员提供了强大的系统底层检测能力,让隐藏的系统入侵者无处遁形。本文将带你深入了解OpenArk的核心功能,并通过实战案例展示如何利用这款工具保护你的Wind

gitblog_00543的博客 194

EMD (经验模态分解) 在 C++ 中的实现指南

EMD 是由 Norden E. Huang 等人在1998年提出的一种适用于非线性和非平稳信号的分析方法。对称性:IMF 的上下包络对称。零交叉点:IMF 的零交叉点数量与极值点数量相同或相差一个。本文详细介绍了如何在C++中实现EMD,包括理论背景、算法步骤、代码实现和优化等内容。通过丰富的代码示例和详细的解释,希望能够帮助读者掌握EMD的基本原理,并能够在实际项目中灵活应用。未来,随着信号处理技术的不断发展,EMD及其变种(如EEMD、CEEMDAN等)将继续在各个领域发挥重要作用。

qq_38334677的博客 1750

【3步】揪出系统寄生虫:用OpenArk实战清除顽固Rootkit

你的电脑最近是否变得异常缓慢?杀毒软件扫描后一切正常,但系统总感觉"不对劲"?这可能是Rootkit在作祟——这种隐藏在系统深处的恶意软件,就像寄生虫一样附着在Windows内核中,常规安全工具根本无法检测。今天,我将带你使用开源反Rootkit工具OpenArk,通过三个实战步骤,亲手揪出这些系统深处的入侵者。 ## 问题场景:当杀毒软件也束手无策时 想象一下这个场景:你的系统运行越来越慢,

gitblog_01023的博客 181

IDEA的使用指南

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

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

3步搞定USB3380硬件配置:PCILeech终极内存分析实战指南

想知道如何用不到200元搭建专业级内存取证平台吗?PCILeech项目为你提供了一条低成本高回报的技术路径。PCILeech是一款基于直接内存访问(DMA)技术的开源工具,它能够通过PCIe硬件设备直接读写目标系统内存,无需在目标系统上安装任何驱动程序。这种技术为安全研究人员、逆向工程师和数字取证专家提供了强大的内存分析能力,而USB3380硬件方案更是让这一切变得触手可及。 ## 🚀 快速上

gitblog_01058的博客 291

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【转】Windows平台内核级文件访问

1.背景    在windows平台下,应用程序通常使用API函数来进行文件访问,创建,打开,读写文件。从kernel32的CreateFile/ReadFile/WriteFile函数,到本地系统服务,再到FileSystem及其FilterDriver,经历了很多层次。在每个层次上,都存在着安全防护软件,病毒或者后门作监视或者过滤的机会。作为安全产品开发者,我们需要比别人走得更远,因此

723

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Windows 文件过滤驱动经验总结

by ai3000 看了 ChuKuangRen 的第二版《文件过滤驱动开发教程》后,颇有感触。我想,交流都是 建立在平等的基础上,在抱怨氛围和环境不好的同时应该先想一想自己究竟付出了多少? 只知索取不愿付出的人也就不用抱怨了,要怪也只能怪自己。发自己心得的人无非是两种 目的,一是引发一些讨论,好纠正自己错误的认识,以便从中获取更多的知识使自己进步 的更快。二是...

weixin_34410662的博客 372

windows文件读取 xxe_XXE漏洞学习

0x00 什么是XML1.定义XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。2.文档结构XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。 ]]]>DaveTom3.DTDXML文档结构包括XML声明、DTD文档类型定义(...

weixin_39768695的博客 430

使用IRP进行文件操作

一定要先感谢为技术的进步而付出辛勤汗水的人,感谢他们对技术的共享.一个通用IRP访问文件的十六进制编辑器(开源代码)     --   被诅咒的神(邪恶八进制信息安全团队)Windows平台内核级文件访问                               --   baiyuanfan (baiyuanfan@163.com)特别感谢被诅咒的神,他写的里面包含了非常多

2788

绕过文件系统过滤驱动和钩子

1对付文件系统过滤驱动 文件系统过滤驱动Attach在正常的文件系统之上,监视和过滤我们的文件访问。文件系统驱动栈就是由这一连串的Attach起来的过滤驱动组成。我们可以用IoGetRelatedDeviceObject这个函数来获得一个FileObject对应的最底层的那个功能驱动对象(FDO)。但是这样虽然绕过了那些过滤驱动,却同时也绕过了正常的FSD如Ntfs/Fastfat,因为正常

trents的专栏 3918

文件监控(教学版)

参考FileSpy写的文件监控程序,但比它的抽象多了。可能瑞星的文件驱动也是这样写的,否则它为什么老阻止我安装驱动呢。测试程序是一个命令行小程序,负责打开设备,开启监控和关闭监控,运行时开启和关闭两次。   在DebugView中查看输出信息,我只是想看看能不能达到目的,所以信息量很少。   在驱动程序中开启和关闭监控的代码:   VOID AttachedToDeviceByName...

weixin_34092370的博客 228

遍历驱动设备栈

参考 《windows 驱动开发技术详解》,部分关于对象的结构,请看上节

ShadowAssassin的专栏 2941

【文件7】所谓hardlink 所谓XCB大法

所谓hardlink 所谓XCB大法   前两天看到NTFS之HARDLINK攻防第二版,本来是讲hardlink,不过提到了个XCB大法,卖了个关子,出于好奇就逆了360FkAdv,本来逆的差不多了想替换的,结果发现驱动由DLL释放,DLL又由别的释放,懒得写会原程序了。。。上篇blog有点前置知识。。   链接中的文章展示了一种删除Hive硬链接占坑同时解锁文件的方法(解锁文件其实是副

Returns' Station 3357

入侵Windows服务器的流程

一般情况下,黑客往往喜欢通过文章的上所示的流程图对Windows服务器进行攻击,从而提高入侵服务器的效率。 ·通过端口139进入共享磁盘。139端口是为“NetBIOS Session Service”提供的,主要用于提供Windows文件和打印机共享。开启139端口虽然可以提供共享服务,但常常被攻击者所利用进行攻击,如使用流光、SuperScan等端口扫描工具可以扫描目标计算机的139端口,如

黑白程序的博客 6982

文件过滤驱动实现目录重定向(一)

By Fanxiushu  2015 转载或引用请注明原始作者 谈论这个问题前,先看看一个情况: 比如你上班的公司,可能有多个文件服务器,这些文件服务器通过FTP或者远程共享目录方式提供目录共享。 而你可能会经常性的从一个文件服务器切换到另一个文件服务器上去找资料。 而且如果是FTP的话,还得准备一个FTP客户端。 这么折腾也许觉得有点麻烦,也许就会想:有没有办法让所有这些文件服务器

fanxiushu的专栏 7035

IoGetDeviceObjectPointer和ObReferenceObjectByName得到设备对象指针

//IoGetDeviceObjectPointer得到设备对象指针 UNICODE_STRING DeviceName; RtlInitUnicodeString(&DeviceName,L"\\Device\\MyDDKDeviceA"); PDEVICE_OBJECT DeviceObject=NULL; PFILE_OBJECT FileObject=NULL; NTSTATUS ntS

125096 1354
上一篇: CSO们的困惑 网络管理还是安全管理
下一篇: 浏览器执行exe文件的探讨
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值