驱动监控进程的创建

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

这是我在 http://www.codeproject.com .学习时看到的一个驱动程序,学习后对其整理的笔记

下面这个驱动程序的作用:监控准备运行的可执行文件。(由用户决定是不是让它运行)所以我们要做以下工作:

首先是修改(NtCreateSection)SSDT索引号,(索引号从用户程序中得到)HOOK NtCreateSection()这个函数,然后通过文件句柄获得文件名,判断它是不是可执行文件,检测其属性与判断用户是否允许它执行,如果允许就运行原来NtCreateSection这个函数,否则返回STATUS_ACCESS_DENIED。

如果我们截获一个NtCreateSection()的请求,该请求要求映射可执行文件作为SEC_IMAGE属性,通过结合页保护属性,我们能够知道进程将要执行了,因此我们在这个时候作出决定:是否让其执行。如果不想让它执行,EAX 返回值为STATUS_ACCESS_DENIED。

因为调用是从ntdll. dll 以一条 MOV EAX, ServiceIndex五字节指令开始的,第一个字节是MOV EAX,后四字节是索引号,所以我们可以得到索引号(后四字节)然后将它进行修改成我们自己的函数索引。当然在修改之前要将原服务函数地址保存在全局变量中。


if(loc->Parameters.DeviceIoControl.IoControlCode==1000)
{
buff=(UCHAR*)Irp->AssociatedIrp.SystemBuffer;

// hook service dispatch table
memmove(&Index,buff,4);//所有的调用都是从ntdll.dll以一条五字节指令MOV EAX, ServiceIndex开始,四字节是索引号
a=4*Index+(ULONG)KeServiceDescriptorTable->ServiceTable;//从用户程序中得到索引号,a指向服务函数地址

base=(ULONG)MmMapIoSpace(MmGetPhysicalAddress((void*)a),4,0);//将物理地址映射到非分页池,因此可以进行读写,减少读写服务表保护属性的麻烦
a=(ULONG)&Proxy;//a指向Proxy函数的地址

_asm
{
mov eax,base

mov ebx,dword ptr[eax]

mov RealCallee,ebx//将原服务函数地址保存在全局变量中
mov ebx,a

mov dword ptr[eax],ebx//Proxy函数地址写进服务函数表中
}

memmove(&a,&buff[4],4);
output=(char*)MmMapIoSpace(MmGetPhysicalAddress((void*)a),256,0);
}


下面是我们自己函数的实现:
//这个函数决定是否 NtCreateSection() 被成功调用
ULONG __stdcall check(PULONG arg)//获得指向服务参数指针
{

  HANDLE hand=0;PFILE_OBJECT file=0;

  POBJECT_HANDLE_INFORMATION info=0;ULONG a;char*buff;
  ANSI_STRING str; LARGE_INTEGER li;li.QuadPart=-10000;

if((arg[4]&0xf0)==0)return 1;//检测标志
if((arg[5]&0x01000000)==0)return 1;//检测属性


//通过文件句柄获得文件名
hand=(HANDLE)arg[6];//获得执行文件句柄

ObReferenceObjectByHandle(hand,0,0,KernelMode,&file,info);//&file获得对象体指针
if(!file)return 1;

RtlUnicodeStringToAnsiString(&str,&file->FileName,1);

a=str.Length;buff=str.Buffer;

while(1)//通过循环判断是不是有". "标志
{
  
if(buff[a]=='.')
{a++;break;}

  a--;

}
ObDereferenceObject(file);


if(_stricmp(&buff[a],"exe")){RtlFreeAnsiString(&str);return 1;}//判断是否为可执行文件


 
KeWaitForSingleObject(&event,Executive,KernelMode,0,0);//将当前线程置于等待状态知道信号态


strcpy(&output[8],buff);//将string复制进buff
RtlFreeAnsiString(&str);

a=1;//用户的决定通过a的制来反映
memmove(&output[0],&a,4);
while(1)
{
KeDelayExecutionThread(KernelMode,0,&li);//在一个固定时间间隔内当前线程处于等待状态
memmove(&a,&output[0],4);
if(!a)break;
}
memmove(&a,&output[4],4);

KeSetEvent(&event,0,0);

return a;
}



//保存执行文件上下文,调用check()函数
_declspec(naked) Proxy()
{

_asm{

pushfd
pushad
mov ebx,esp

add ebx,40
push ebx

call check

cmp eax,1//由check()的返回值判断是否让可执行文件继续执行
jne block


popad
popfd
jmp RealCallee//通过,调用ntcreatesection


block:popad
mov ebx, dword ptr[esp+8]

mov dword ptr[ebx],0
mov eax,0xC0000022L//不让其通过,返回STATUS_ACCESS_DENIED
popfd
ret 32

}
}

到此,驱动程序的工作基本完成,所以在用户程序中用到一个线程来等待驱动的判断结果。
 char*name=(char*)&outputbuff[8];

        for(x=0;x<stringcount;x++)

        {
            if(!stricmp(name,strings[x])){a=1;goto skip;}

        }
        strcpy(msgbuff, "Do you want to run ");
        strcat(msgbuff,&outputbuff[8]);

        
        if(IDYES==MessageBox(0, msgbuff,"WARNING",
           MB_YESNO|MB_ICONQUESTION|0x00200000L))

        {a=1; strings[stringcount]=_strdup(name);stringcount++;}
        else a=0;
    
        // write response to the buffer, and driver will get it
        skip:memmove(&outputbuff[4],&a,4);

        //让驱动继续
        a=0;
        memmove(&outputbuff[0],&a,4);
}}

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

相关推荐

监控系统所有进程的创建和销毁 (PsSetCreateProcessNotifyRoutine)

<br />使用驱动方式,在原来的ProcObsrv.c基础上进行了完善,所有进程的创建和销毁都不会丢失,能完全捕获到。<br /> <br />具体代码如下:<br /> <br />//---------------------------------------------------------------------------<br />//<br />// ProcObsrv.c<br />//<br />// SUBSYSTEM: <br />//    System monitor<br

快乐工作,精彩生活 2046

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

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

misterliwei的专栏 8547

驱动开发:内核监控进程与线程回调

系统中监控进程与线程可以使用微软提供给我们的两个新函数来实现,此类函数的原理是创建一个回调事件,当有进程或线程被创建或者注销时,系统会通过回调机制将该进程相关信息优先返回给我们自己的函数待处理结束后再转向系统层。那么会提示连接的设备没有发挥作用,我们则成功拦截了这次打开,当然如果在打开进程之前扫描其特征并根据特征拒绝进程打开,那么就可以实现一个简单的防恶意程序,进程监控在防恶意程序中也是用的最多的。如上,该函数只有两个参数,第一个参数是回调函数,第二个参数是是否注销,通常在驱动退出时可以传入。

m0_56069948的博客 805

windows进程间通信

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

liuyinghui523的专栏 3093

Win64 驱动内核编程-12.回调监控进线程创建和退出

回调监控进线程创建和退出     两个注册回调的函数:PsSetCreateProcessNotifyRoutine   进程回调PsSetCreateThreadNotifyRoutine    线程回调分别对应的回调函数类型: VOID MyCreateProcessNotify ( IN HANDLE ParentId, IN HANDLE ProcessId, IN BOOLEA

天使也掉毛 4320

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

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

weixin_35972981的博客 527

4.4 Windows驱动开发:内核监控进程与线程创建

在 PsSetCreateThreadNotifyRoutine 函数中注册的回调函数应该符合这个函数指针的定义,以便在新线程被创建或销毁时被调用。和进程ID作为参数传递给回调函数。来删除已注册的回调函数,目前该函数只需要一个参数,只需要传入注册时的函数指针即可;来说,它指向一个回调函数,用于通知进程中新线程的创建。当一个新的线程被创建时,操作系统会调用所有已注册的回调函数,并将新线程的。是一个指向回调函数的指针,该函数将在新进程创建或退出时被调用。回调函数,该回调函数将在每个进程的创建和退出时被调用。

微软技术分享 1万+

机器人学习-matlab四足机器人控制仿真

《机器人学,机器视觉与控制》学习笔记 使用工具箱版本9.10 题目与解决思路: 【1】. 通过减少复位期间的抬腿高度来缩短复位的轨迹 Z轴向下,为了减小复位器件的抬腿高度,应当缩小△Z,故可以将示例程序中zu值调大。 【2】. 增加腿的步幅 腿的步幅可由改变x方向上腿前进和后退运动的极限来达到,令xf = 7; xb = -xf;即可。 ...

weixin_44609769的博客 5540

驱动开发:内核监控进程与线程创建

监控进程的启动与退出可以使用 `PsSetCreateProcessNotifyRoutineEx` 来创建回调,当新进程产生时,回调函数会被率先执行,然后执行我们自己的`MyCreateProcessNotifyEx`函数,并在内部进行打印输出。而检测线程操作与检测进程差不多,检测线程需要调用`PsSetCreateThreadNotifyRoutine` 创建回调函数,然后就可以检测线程的创建了。

微软技术分享 1万+

Windows10 Qt下用MINGW 编译VTK-8.1.0

1. 材料准备(1) 下载VTK-8.1.0: https://www.vtk.org/download/(2) 下载TIFF库: http://gnuwin32.sourceforge.net/packages/tiff.htm(直接安装即可,注意选择路径不包含中文字符)2. 安装: (1) cmake配置: a. Module下配置:勾选下图所示的六项 b. Build 配置:勾选这里能够在b...

hit1524468的专栏 3893

如何构建智能聊天系统

聊天分为听、思考、读,简单的通过ASR、LLM、TTS三类模型的组合可以实现,最近openai推出支持多模态的GPT-4o模型,可以把三个模型真正融合成在一起。现在市面上的模型百花齐放,各有所长。要实现可落地的方案,需要结合业务,验证模型效果,同时也要考虑方案的可行性,有些模型在国内能用,有些在国内不能用。

xsgnzb的专栏 2109

进程监控和线程监控

方式1 #include <ntifs.h> #include<ntddk.h> NTKERNELAPI PUCHAR PsGetProcessImageFileName( IN PEPROCESS Process ); VOID ProcessNotifyRoutine( _In_ HANDLE ParentId, _In_ HANDLE ProcessId, _In_ BOOLEAN Create ) { if (Create==TRUE) { //创建进程回调

qq_41490873的博客 658

【加密社】私钥碰撞器,秒杀市面上的碰撞器

基于上述的逻辑和代码,开发了ETH挖掘器(图1.1)这里有个亮点是:1.很多开发者在判断地址是否有效的环节上,用的是查询余额,其实这是不对的,查询余额你可能只能查询对应代币的余额,例如usdt,eth等但是如果用查询交易次数就不一样了,你只要是交易过,我就认为是有效钱包,这样的速度比查询余额要快,也要更准确。2.rpc节点可配置。

加密社的博客 1582

驱动开发,进程创建及 销毁的监视

The PsSetCreateProcessNotifyRoutine routine adds a driver-supplied callback routine to, or removes it from, a list of routines to be called whenever a process is created or deleted. NTSTATUS PsSetCr...

xmmdbk的博客 399

CSR-DCF视频目标跟踪源码运行笔记

论文基本信息 论文标题:Discriminative Correlation Filter with Channel and Spatial Reliability 论文作者:Alan Lukezic等 论文出处:CVPR 2017 文章链接:https://arxiv.org/abs/1611.08461 补充材料:https://www.semanticscholar.org/paper/D...

越野者的博客 3401

国内合规开通ChatGPT Plus实操指南:银行卡绑卡与支付全解析

ChatGPT Plus 是 OpenAI 官方推出的高级订阅服务,基于 GPT-4o 多模态大模型提供语音交互、图像理解与长上下文处理能力。其核心使用前提在于完成合规的国际支付绑定,而非网络接入方式。技术原理上,OpenAI 采用 Stripe 支付网关进行风控校验,重点匹配银行跨境权限、卡片类型(仅支持 Visa/Mastercard/Amex 信用卡)、BIN 号段及地理位置一致性。该机制决定了95%的绑卡失败源于银行端配置缺失或卡片不兼容,而非网络问题。实际应用中,PayPal 作为中间支付层可显著

chuannaoxuan4674的博客 2012

基于visual c++之windows核心编程代码分析(57)监控系统的每一个进程的创建

在监控病毒的时候,我们经常需要监控病毒创建的每一个进程,监控进程是如何实现的呢, 我们来见代码分析,实现监控系统的每一个进程的创建, #include "stdafx.h" #include "resource.h" #define MAX_LOADSTRING 100 /...

chengyixian7877的博客 131

【AI智能体】Claude Code 核心记忆文件 CLAUDE.md实战操作详解

Claude Code 核心记忆文件 CLAUDE.md实战操作详解

congge 5459

7.1 Windows驱动开发:内核监控进程与线程回调

系统中监控进程与线程可以使用微软提供给我们的两个新函数来实现,此类函数的原理是创建一个回调事件,当有进程或线程被创建或者注销时,系统会通过回调机制将该进程相关信息优先返回给我们自己的函数待处理结束后再转向系统层。那么会提示连接的设备没有发挥作用,我们则成功拦截了这次打开,当然如果在打开进程之前扫描其特征并根据特征拒绝进程打开,那么就可以实现一个简单的防恶意程序,进程监控在防恶意程序中也是用的最多的。一直在重复的实现对系统底层模块的枚举,今天我们将展开一个新的话题,内核监控,我们以。

微软技术分享 6130

9篇3章7节:基于 R 语言的 FAERS 数据提取与合并

本文主要探讨了 FAERS 数据提取与合并的操作流程。首先,通过程序化方法从本地存储的 FAERS ASCII 文件中提取指定季度或范围内的单药报告数据,并可通过参数设置控制数据存储位置、处理方式、计算资源分配以及报告者职业类别等。随后,通过批量读取的方式对多个季度的 DRUG 文件进行循环处理,并将其合并为一个综合数据框。

MD Code 1269

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

监视系统中进程的创建和终止

//write by jingzhongrong最近在论坛上看到很多人都在问这个问题,花了一些时间写了这个程序,原理很简单,主要功能通过一个内核驱动中使用PsSetCreateProcessNotifyRoutine 函数来实现。效果也不错首先新建一个驱动程序工程,在DriverEntry例程中调用PsSetCreateProcessNotifyRoutine函数向系统添加一个回调函数,并

jingzhongrong 2737

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Windows 驱动开发 新手入门(二)

Windows 驱动开发 新手入门(二)引言创建NT式驱动关于提示无法找到证书代码分解DEVICE_EXTENSIONPsSetCreateProcessNotifyRoutineIRP_MJ_DEVICE_CONTROL派遣函数IO控制码 IoControlCode创建加载驱动程序 引言 之前的文章大概了解的驱动程序的结构和一些主要的函数,本篇我们写一个NT式驱动,用来监控进程的创建与销毁。 创建NT式驱动 由于VS2019中无法帮我们快速创建NT式驱动,我们使用上一篇文章的项目改造一下即可,删除cpp文

Doub1's Blog 4190

数学建模模型总结

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

Windows10 x64 Ring0实现进程创建监控

win10 x64 亲测可用

zcy5157912的博客 431
上一篇: 修改QQ执行顺序,获取QQ2008最新版密
下一篇: DKOM Benefits and Drawbacks
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值