监控系统加载模块-猥琐流

内核编程之SSDTHook(3)Hook NtCreateSection监控所有可执行模块加载 本博文由优快云博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处:http://blog.youkuaiyun.com/zuishikonghuan/article/details/50924829 在上两篇博文中,我介绍了SSDTHook的原理,并给出了一个实例--通过Hook NtOpenProcess来实现进程保护:http://blog.youkuaiyun.com/ 阅读详情
代码:
#include <ntddk.h>
#include "nt_help.h"

DRIVER_INITIALIZE DriverEntry;

typedef struct _OBJECT_TYPE_INITIALIZER {
    USHORT Length;
    BOOLEAN UseDefaultObject;
    BOOLEAN CaseInsensitive;
#if WINVER>=0x0600
    ULONG ObjectTypeCode;
#endif
    ULONG InvalidAttributes;
    GENERIC_MAPPING GenericMapping;
    ULONG ValidAccessMask;
    BOOLEAN SecurityRequired;
    BOOLEAN MaintainHandleCount;
    BOOLEAN MaintainTypeList;
    POOL_TYPE PoolType;
    ULONG DefaultPagedPoolCharge;
    ULONG DefaultNonPagedPoolCharge;
    PVOID DumpProcedure;
    PVOID OpenProcedure;
    PVOID CloseProcedure;
    PVOID DeleteProcedure;
    PVOID ParseProcedure;
    PVOID SecurityProcedure;
    PVOID QueryNameProcedure;
    PVOID OkayToCloseProcedure;
} OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;

typedef struct _OBJECT_TYPE {
#if WINVER<0x0600
    ERESOURCE Mutex;
#endif
    LIST_ENTRY TypeList;
    UNICODE_STRING Name;            // Copy from object header for convenience
    PVOID DefaultObject;
    ULONG Index;
    ULONG TotalNumberOfObjects;
    ULONG TotalNumberOfHandles;
    ULONG HighWaterNumberOfObjects;
    ULONG HighWaterNumberOfHandles;
    OBJECT_TYPE_INITIALIZER TypeInfo;
} OBJECT_TYPE, *POBJECT_TYPE;

extern POBJECT_TYPE* MmSectionObjectType;
PVOID pNtCreateSection = NULL;
SYSTEM_MODULE_INFORMATION ntModInfo = {0};

#pragma alloc_text(INIT, DriverEntry)

NTSTATUS DevicePassthrough(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
        NTSTATUS status = STATUS_SUCCESS;
        PIO_STACK_LOCATION  irpSp;
        
        irpSp = IoGetCurrentIrpStackLocation(Irp);
        Irp->IoStatus.Status = status;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
        return status;
}

VOID DriverUnload (IN PDRIVER_OBJECT DriverObject)
{
        (*MmSectionObjectType)->TypeInfo.OpenProcedure = NULL;
        KdPrint(("DriverUnload Done!\n"));
}

#if WINVER>=0x0600
NTSTATUS HookSectionOpen(
    IN ULONG OpenReason,
    IN ULONG AccessMode,
    IN PEPROCESS Process OPTIONAL,
    IN PVOID Object,
    IN ACCESS_MASK* GrantedAccess,
    IN ULONG HandleCount
    )
#else
NTSTATUS HookSectionOpen(
    IN ULONG OpenReason,
    IN PEPROCESS Process OPTIONAL,
    IN PVOID Object,
    IN ACCESS_MASK GrantedAccess,
    IN ULONG HandleCount
    )
#endif
{
        PVOID* esp = (PVOID*)&esp;
        PVOID* esp_end = (PVOID*)((((DWORD64)esp>>12) + 1)<<12);        //4k round up
        PVOID* p = esp;
        ULONG SectionPageProtection, AllocationAttributes;
        HANDLE FileHandle;
        NTSTATUS Status;

        /* 
         * do stack walk back to NtCreateSection function
         */
        while (p < esp_end && 
                (*p < pNtCreateSection || 
                 *p > (PVOID)((PBYTE)pNtCreateSection + 0x300)))
                p++;

        if (p >= esp_end){
                //KdPrint(("no found NtCreateSection %p -> %p\n", esp, esp_end));
                return STATUS_SUCCESS;
        }

        //KdPrint(("%p HookSectionOpen-Object:%p esp:%p %p\n", pNtCreateSection, Object, esp, *p));
#ifdef _WIN64
        /* 
         * esp layout look likes[2003 X64 DUMP]:
         fffff800`0104113d nt!KiSystemServiceCopyEnd+0x3 retaddr <-------call nt!NtCreateSection
         fffffadf`f662ec00  00000000`00000000 param1
         fffffadf`f662ec08  00000000`000f001f param2 DesiredAccess
         fffffadf`f662ec10  00000000`00000000
         fffffadf`f662ec18  00000000`00000000
         fffffadf`f662ec20  00000100`00000010 SectionPageProtection
         fffffadf`f662ec28  00000000`01000000 AllocationAttributes
         fffffadf`f662ec30  00000000`0000054c FileHandle
         * - ... 
         */
        p++;
        /*
         * search retaddr -> nt!KiSystemServiceCopyEnd
         */
        while (p < esp_end &&
                (*p < ntModInfo.ImageBase || 
                 *p > (PVOID)((PBYTE)ntModInfo.ImageBase + ntModInfo.ImageSize)))
                p++;

        if (p >= esp_end){
                //KdPrint(("no found nt!KiSystemxxxx %p -> %p\n", esp, esp_end));
                return STATUS_SUCCESS;
        }
#else
        /* stack DUMP from 2003/x86 
         * ebp = p - 1
         fa06f4d8  fa06f540
         fa06f4dc  80908715 nt!NtCreateSection+0x15c
         ...
         fa06f540  fa06f564
         fa06f544  808234cb nt!KiFastCallEntry+0xf8
         fa06f548  fa06f668 param1
         */
        p = (PVOID*)*(p - 1);
        p++;
#endif

        SectionPageProtection = (ULONG)*(p + 5);
        AllocationAttributes = (ULONG)*(p + 6);
        FileHandle = *(p + 7); 

        //KdPrint(("%x %x %p\n", SectionPageProtection, AllocationAttributes, FileHandle));

        if (FileHandle 
                && SectionPageProtection == PAGE_EXECUTE
                && (AllocationAttributes == SEC_IMAGE || AllocationAttributes == 0x100000)){
                /* windows7 AllocationAttributes = 0x100000 to LoadDriver */
                PFILE_OBJECT File;

                Status = ObReferenceObjectByHandle (FileHandle, 
                                0, 
                                NULL,
                                KernelMode,
                                (PVOID *)&File,
                                NULL);

                if (!NT_SUCCESS(Status)) {
                        return STATUS_SUCCESS;
                }
                KdPrint(("FileName:%wZ\n", &File->FileName));
                ObDereferenceObject(File);
        }

        return STATUS_SUCCESS;
}

BOOL GetNtImgBase(PSYSTEM_MODULE_INFORMATION modInfo)
{
        PSYSMODULELIST sysModuleList = NULL;
        ULONG size, i;

        NtQuerySystemInformation(SystemModuleInformation, &size, 0, &size);
        sysModuleList = ExAllocatePoolWithTag(PagedPool, size, 'hlpm');

        if (sysModuleList){
                NtQuerySystemInformation(SystemModuleInformation, sysModuleList, size, NULL);
                /* nt module should be the first one */
                *modInfo = *sysModuleList->Modules;
                ExFreePool(sysModuleList);
                return TRUE;
        }
        return FALSE;
}

NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
        DWORD i;
        UNICODE_STRING sFuncName;
        
        RtlInitUnicodeString(&sFuncName, L"NtCreateSection");
        pNtCreateSection = MmGetSystemRoutineAddress(&sFuncName);

        if (!GetNtImgBase(&ntModInfo)){
                KdPrint(("EnumSysModule nt base failed!\n"));
                return STATUS_UNSUCCESSFUL;
        }

        KdPrint(("nt:%p pNtCreateSection:%p\nMmSectionObjectType:%p %p %p\n", 
                                ntModInfo.ImageBase, 
                                pNtCreateSection, 
                                *MmSectionObjectType,
                                (*MmSectionObjectType)->TypeInfo.OpenProcedure,
                                (*MmSectionObjectType)->TypeInfo.DeleteProcedure));
        
        (*MmSectionObjectType)->TypeInfo.OpenProcedure = HookSectionOpen;

        for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
                DriverObject->MajorFunction[i] = DevicePassthrough;

        DriverObject->DriverUnload = DriverUnload;

        return STATUS_SUCCESS;
} 
可动态监控驱动、dll、exe加载,
多智能体LLM股票推荐系统:架构、挑战与实战解析 多智能体系统(Multi-Agent System)是一种分布式人工智能范式,通过多个自主智能体(Agent)的交互与协作,共同完成复杂任务。其核心原理在于将大问题分解为子问题,由专业化智能体并行处理,再通过协调机制整合结果,从而提升系统的鲁棒性、可扩展性与问题解决能力。在技术价值上,多智能体架构能有效克服单一模型的局限性,例如任务过载、专业领域知识不足与可解释性差等问题,特别适合处理信息维度爆炸、需要多角度分析的场景。在金融科技领域,结合大语言模型(LLM)的推理与自然语言处理能力,多智能体系统可被应用于 阅读详情

相关推荐

树莓派 + YOLOv8:我给自己做了一个“防摸鱼”监控系统,老板来了自动切屏!

作为一名程序员,工作之余偶尔“带薪放松”一下是合情合理的。当你正打开 Steam 或者 B 站时,老板悄无声息地出现在了你身后。靠后视镜?太 low。靠听脚步声?太累。我们要用技术解决问题!今天,我将手把手教你用树莓派 (Raspberry Pi)加上YOLOv8视觉模型,打造一个全自动防摸鱼防御塔。摄像头 24 小时监控门口,一旦识别到“老板”或者“人脸”,立刻向你的电脑发送指令,瞬间切换回 VS Code 代码界面!通过这个项目,你不仅学会了YOLOv8的训练与部署,还掌握了。

BUG猿的博客 949

MiniFilter文件系统学习

Minfilter与legacy filter区别 比sfilter加载顺序更易控制. altitude被绑定到合适的位置。  Minfilter在注册表服务项中有一项Altitude值 此值越高位置越靠前 (待考证 每一个minifilter驱动必须有一个叫做altitude的唯一标识符.一个minifilter驱动的altitude定义了它加载时在I/O栈中相对其他minifi

zhuhuibeishadiao 1万+

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

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

weixin_35972981的博客 527

动态监控驱动、dll、exe加载

1 /* 2 windows2003 x86/x64 window7 x86 windows2008 R2 x64测试通过 3 */ 4 5 #include <ntddk.h> 6 #include "nt_help.h" 7 DRIVER_INITIALIZE DriverEntry; 8 9 typedef struct...

weixin_30765577的博客 318

Hook NtCreateSection的SSDT实现

这个我学习天书夜读后的大作业。尽管SSDT没有前途了,不过还是可以玩玩的

2. Netty使用JSerialComm进行串口读取(二)

现在开始处理这些问题 第一个问题:串口读取超时异常一路传播到最后也没有处理。 ​ 第二个问题:即使处理了该异常,程序仍然退出,这不能满足一些实际使用要求需求。该问题与设置很长的读取超时时间没关系,无论多长到时间后总会退出。

s3c2410的博客 2463

通过挂钩NtCreateSection监控可执行模块

  Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <! /* Sty

misterliwei的专栏 8547

Seurat 单细胞转录组测序数据分析教程(三)——python(scanpy)

文章参考至,做了一个更详细的解读。本教程探讨了 scanpy 的可视化可能性,分为三个部分:嵌入的散点图(例如 UMAP、t-SNE)使用已知标记基因鉴定簇差异表达基因的可视化在本教程中,我们将使用来自 10x 的数据集,其中包含来自PBMC的 68k 个细胞。Scanpy 在其分布中包括该数据集的简化样本,该数据集仅包含 700 个细胞和 765 个高度可变的基因。该数据集已经过预处理和 UMAP 计算。在本教程中,我们还将使用以下文献标记:B细胞:CD79A、MS4A1。

coffeeii的博客 5829

动态监控驱动sys、动态链接库dll、可执行文件exe加载

/* windows2003 x86/x64 window7 x86 windows2008 R2 x64测试通过 */ #include #include "nt_help.h" DRIVER_INITIALIZE DriverEntry; typedef struct _OBJECT_TYPE_INITIALIZER { USHORT Length; BOOLEAN Us

关注互联网安全的小虾米一枚 5695

Wordpress实战之第二章安装wordpress 软件需要的软件

使用下载并安装phpstudy面版工具 wget -O install.sh?https://notdocker.xp.cn/install.sh?&& sudo bash install.sh 2.安装成功如下 ==============运行状态========================= webpanel stop phpstudy running =================...

安全参透之旅 612

网络安全隔离技术解析:单向网闸与双向网闸的核心差异与应用场景

本文深入解析网络安全隔离技术中的单向网闸与双向网闸,详细比较两者的核心差异与应用场景。单向网闸通过物理隔离确保数据单向流动,适用于金融交易等高风险场景;双向网闸则支持严格安检的双向数据交互,常见于医疗、政务等领域。文章还提供了选型建议和技术发展趋势,帮助读者根据安全需求和业务场景选择最适合的网闸解决方案。

weixin_29323365的博客 529

监控进程创建,全部阻止的demo(使用MiniFilter)

使用wdk7600例子passthrough改写,监控IRPIRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION在 Data->Iopb->Parameters.AcquireForSectionSynchronization.PageProtection == PAGE_EXECUTE(等于这个就是创建进程) 在x64可以用这个监控进程 ,不会触发pa...

kernweak的博客 2777

详解Nacos集群搭建

在我们日常的开发当中,用的都是单点Nacos,这种模式,我们自己开发测试玩一玩还可以,但是到了企业的生产环境之下,你还这么玩的话,那肯定是要出大问题了。因为在企业当中,我们更加强调的是高可用,所以在企业的生产环境下,Nacos一定要做成个集群。

博客 1万+

驱动中使用加载回调来监控进程加载 或者DLL加载 驱动加载

 #include "ntddk.h" //#include "Ntifs.h" //PVOID NTSTATUS PsSetLoadImageNotifyRoutine(  PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); NTSTATUS PsRemoveLoadImageNotifyRoutine( __in PLOAD_IMAG

落笔飞花笑百生的博客 1863

ADS与MATLAB数据互通全指南:从Snp文件导入到TXT导出完整流程

本文详细介绍了在射频与微波工程中,实现ADS与MATLAB高效数据互通的完整流程。核心内容包括利用SPOutput控件、数据显示窗口及测量方程等多种方法,将ADS仿真数据(如S参数)导出为Touchstone或TXT格式,并导入MATLAB进行深度分析与可视化;同时指导如何将MATLAB处理后的数据回灌至ADS,用于模型验证与协同仿真,旨在构建自动化、无损的数据交换工作流,提升工程师的工作效率。

pluto的博客 394

基于DE2-115红外解码实验

基于DE2-115红外解码实验   一、   功能描述 在同一个遥控电路中通常要使用实现不同的遥控功能或区分不同的机器类型, 这样就要求信号按一定的编码传送,编码则会由编码芯片或电路完成。对应于编码芯片通常会有相配对的解码芯片或包含解码模块的应用芯片。在实际的产品设计或业余电子制作中,编码芯片并一定能完成我们要求的功能,这时我们就需要了解所使用的编码芯片到底是如何编码的。只有知道编码方式,我...

乘风的博客 2516

极虎病毒:虎年第一猛毒详解

下周就是春节,对于我这个从事反病毒工作多年的人来说,这个春节和以往大不相同。安全圈子里,一个口水接着一个口水,你说他的软件有洞,他说你的软件带孔,还要闹到法庭打官司,这大过年的,律师和公证都快被烦死了。相对于安全圈里天天你的鼻子我的眼睛,那些靠造病毒发财的人却很和谐——各种各样***的教程继续被传播,***代码被分享。春节前,金山安全实验室就监测到一个明显的异常——查询rar...

weixin_33671935的博客 456

个人量化系统的策略集合与赚钱之道:全栈深度解析 + 与主流开源框架对比

前三篇把系统的"骨架"拆完了——架构、工程化、部署。本篇回答最关键的问题:一句话:别人的系统是"程序员的系统"(写代码才能加策略),daily_stock_analysis 是"股民的 YAML"(写中文就能加策略)。这个差异决定了它能在多大程度上真的帮你赚钱。如果你用过 、、,加一个策略的流程是: 问题在哪?在 daily_stock_analysis 里,“策略” = 一个文件。每个 YAML 是一个自然语言描述的交易策略,包括: 看到没? ——整个策略就是一段中文,零代码。任何会写字的人都能加新策略

shiter编写程序的艺术 159

hook方式进程创建监控,进程保护

关于进程创建, xp系统:CreatProcessW->CreateProcessInternalW->NtCreateProcessEx->NtCreatSection Vista以上:CCreatProcessW->CreateProcessInternalW->NtCreateUserProcess->NtCreateSection 所以我们要Hoo...

kernweak的博客 3347

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

拦截LPC监控服务加载和启动

SSDT上hook NtSetSystemInformation NtLoadDriver,可以拦截应用层装载驱动的操作.如果怕不保险,还可以PsSetLoadImageNotifyRoutine或者hook NtCreateSection。但是常规通过服务API加载驱动时却不能找到加载驱动的源程序,PsGetCurrentProcess程序已经是services.exe了.

Returns' Station 5412

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

驱动监控进程的创建

作 者: hljleo时 间: 2008-05-31,12:32链 接: http://bbs.pediy.com/showthread.php?t=65772这是我在http://www.codeproject.com .学习时看到的一个驱动程序,学习后对其整理的笔记下面这个驱动程序的作用:监控准备运行的可执行文件。(由用户决定是不是让它运行)所以我们要做以下工作:首先是修改(NtCreateS

2017

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

windows进程间通信

摘 要: 随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求。编写多进程/多线程程序成为现代程序设计的一个重要特点,在多进程程序设计中,进程间的通信是不可避免的。Microsoft Win32 API提供了多种进程间通信的方法,全面地阐述了这些方法的特点,并加以比较和分析,希望能给读者选择通信方法提供参考。 关键词 进程 进程通信 IPC Win32 API 

liuyinghui523的专栏 3093
上一篇: 挺好的话
下一篇: 无进程无启动项无硬盘文件运行程序的研究
M-先生
博客等级 码龄17年 60粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值