PsSetCreateProcessNotifyRoutineEx 创建回调函数
转载自http://blog.csdn.net/yushiqiang1688/article/details/5209597
最近要做一个进程监控的程序,功能很简单,就是创建和退出进程的时候,能触发我们的事件。
首先的第一想法,是Hook ZwCreateProcess,结果调试的时候发现,很多创建进程的动作,并没有通过这个API执行,所以自然就是没办法监控进程的创建,于是回到本质,从创建进程的动作过程来分析,创建新的进程,其大致要经历以下步骤:
(1)打开可执行文件,以FILE_EXECUTE权限打开;
(2)将可执行文件加载到内存空间;
(3)进程的活动结构将被创建,如(EPROCESS,KPROCESS和PEB结构);
(4)为新创建的进程分配地址空间;
(5)为进程的主线程创建线程活动结构,如(ETHREAD,KTHREAD和TEB结构);
(6)主线程的栈将会被分配;
(7)进程的主线程的上下文将被创建;
(8)通知windows子系统;
以上总结下来,无非有下面几种办法获取进程创建的消息:
(1)HOOK ZeCreateSection,创建虚拟内存块的时候,根据传入的文件句柄,获取句柄对应的文件名是否为exe可执行文件;
(2)Hook NtReadVirtualMemory,为新创建的进程分配地址空间等操作时,需要读取进程空间,这样捕获,就能够获取进程的创建动作;
(3)通过windows提供的回调函数,注册回调事件;
方法对比:
(1)该方法能够准确的获取进程创建的操作,但是由于此时进程并没有创建完毕,一些进程的基本结构还没有创建,所以进程ID等信息无法获取;
(2)该方法能够获取进程的创建操作,但不准确。因为除了进程的创建会调用此操作外,人为的一些操作,例如某外部应用程序想读取另一个进程的内存空间,也会调用这个函数,这时候也会有事件响应,因此结果不准确;
(3)第三种方法更直观和简单。因为采用的回调事件,并不直接HOOK API,因此更稳定。
重点分析第三种回调方法。
注册回调事件,是通过PsSetCreateProcessNotifyRoutine来实现的,其函数原型如下:
NTSTATUS PsSetCreateProcessNotifyRoutine(
IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
IN BOOLEAN Remove
);
NotifyRoutine就是注册的回调函数,当有进程创建的时候,就会调用这个NotifyRoutine对应的函数,其函数定义原型如下:
VOID (*PCREATE_PROCESS_NOTIFY_ROUTINE) (
IN HANDLE ParentId,
IN HANDLE ProcessId,
IN BOOLEAN Create
);
其中,ParentId是父进程ID,ProcessId为子进程ID,而Create表示是创建进程还是结束进程,其中True表示创建进程,False表示结束进程。
通过这个函数,我们就能够完成进程创建和退出的监控,首先调用PsSetCreateProcessNotifyRoutine注册进程监控回调函数,然后在回调函数里面,判断Create参数,分别处理进程创建和退出操作。
其它类似的函数还有PsSetLoadImageNotifyRoutine,PsSetCreateThreadNotifyRoutine等。
PsSetCreateProcessNotifyRoutineEx 创建回调函数的更多相关文章
- emWin 之 WM_SetCallback 创建回调函数
@2018-7-11 [小记] emWin 通过函数 WM_SetCallback ( ) 自定义回调函数 > 下段代码就是通过 MESSAGEBOX 控件的 OK 按键实现删除信息框的对话框 ...
- jQuery使用():Callbacks回调函数列表之异步编程(含源码分析)
Callbacks的基本功能回调函数缓存与调用 特定需求模式的Callbacks Callbacks的模拟源码 一.Callbacks的基本功能回调函数缓存与调用 Callbacks即回调函数集合,在 ...
- [转发]将Delphi的对象方法设为回调函数
心血来潮,为了实现更好的通用性和封装性,需要把类方法作为回调函数,搜得一篇好文,节选转发.命名似乎应该是MethodToCallback才合适,可惜调试时总是报错,debugging. 原文地址:ht ...
- 将Delphi的对象方法设为回调函数
心血来潮,为了实现更好的通用性和封装性,需要把类方法作为回调函数,搜得一篇好文,节选转发.命名似乎应该是MethodToCallback才合适,可惜调试时总是报错,debugging. 原文地址:ht ...
- MSDN中回调函数的讲解及其C#例子:用委托实现回调函数
转自:http://blog.csdn.net/sizheng0320/article/details/1615777 ms-help://MS.MSDNQTR.2003FEB.2052/cpguid ...
- 【Cocos2d-x 3.0 基础系列一】 各类回调函数写法汇总
一.button回调 1. Lambda 表达式,C++11 Lambda 赋予了Cocos2d-x 3.0创建回调函数的灵活性. auto itemNor = Sprite::create(&quo ...
- OpenCV-Python setMouseCallback回调函数中图像变量img的传递方法解析
☞ ░ 前往老猿Python博文目录 ░ 一.使用全局变量进行变量传递 OpenCV-Python中可以使用setMouseCallback来设置鼠标事件的回调函数,我们来看个样例. 1.1.案例1代 ...
- CXF 入门:创建一个基于WS-Security标准的安全验证(CXF回调函数使用,)
http://jyao.iteye.com/blog/1346547 注意:以下客户端调用代码中获取服务端ws实例,都是通过CXF 入门: 远程接口调用方式实现 直入正题! 以下是服务端配置 ==== ...
- emwin之创建窗口与窗口回调函数的句柄是一致的
@2019-04-28 [小记] 由函数GUI_CreateDialogBox 创建的窗口所返回的句柄与回调函数形参中的窗口句柄参数是一样的
随机推荐
- Odoo ORM研究1 - BaseModel中的类属性的作用
概述 我们在写odoo项目的时候,经常继承model.Model来创建我们自己的ORM映射关系表. AbstractModel = BaseModel # 源码 class Model(Abstrac ...
- python_字典列表嵌套的排序问题
上一篇我们聊到python 字典和列表嵌套用法,这次我们聊聊字典和列表嵌套中的排序问题,这个在python基础中不会提到,但实际经常运用,面试中也喜欢问,我们娓娓道来. 在说组合排序之前,先来看看排序 ...
- sql-1-准备
一.准备工作 1.mysql安装和配环境 不要以exe文件安装,要下载压缩包安装 下载地址:https://dev.mysql.com/downloads/mysql 在系统path中加上bin目录 ...
- 2019 Mac下安装运行Homestead环境
为了能提高自己的价值,还是要坚持学习新东西才行.这不,从多学会一个PHP开发框架开始.在开始使用Laravel之前,很多"经验"告诉我要先安装Homestead,至于好处,大家可以 ...
- odoo源码学习之任务中的阶段字段stage_id
# 案例0004针对form表单 class Task(models.Model): _name = "project.task" _description = "对于项 ...
- Vue--启动后到加载第一个页面的过程
地址栏http://localhost:8088/#/填写密码登录后自动跳转到http://localhost:8088/#/home/msg/workerpush 一\ 得先跳转到login页面 { ...
- Tomcat 性能监控与优化
JMX JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架.JMX是一套标准的 代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现 ...
- djinn靶机
仅供个人娱乐 靶机信息 https://download.vulnhub.com/djinn/djinn.ova 一.主机探测 二.漏洞的查找和利用 21端口ftp 匿名登录 7331端口 命令执行 ...
- DNS反向解析,主从服务器,分离解析(内外网)
目录 实验一:DNS反向解析 1.安装bind 2.查找配置文件路径 3.配置/etc/named.conf主配置文件 4.修改/etc/named.rfc1912.zones区域配置文件(复制两个) ...
- 3、基于Python建立任意层数的深度神经网络
一.神经网络介绍: 神经网络算法参考人的神经元原理(轴突.树突.神经核),在很多神经元基础上构建神经网络模型,每个神经元可看作一个个学习单元.这些神经元采纳一定的特征作为输入,根据自身的模型得到输出. ...