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 创建的窗口所返回的句柄与回调函数形参中的窗口句柄参数是一样的
随机推荐
- clickhouse分布式集群
一.环境准备: 主机 系统 应用 ip ckh-01 centos 8 jdk,zookeeper,clickhouse 192.168.205.190 ckh-02 centos 8 jdk,zoo ...
- 【每日算法】存在重复元素 III
题目描述 这是 LeetCode 上的 220. 存在重复元素 III, 难度为 [中等] 给你一个整数数组 nums 和两个整数 k 和 t .请你判断是否存在 两个不同下标 i 和 j,使得 ab ...
- VM安装kali操作系统
工具:VMware Workstation 15 Pro(15.5.6 build-16341506),kali-linux-2020.2-installer-amd64.iso vm15下载链接:h ...
- Java基础——ArrayList方法全解(字典版)
引言 在使用集合 ArrayList 的时候,经常使用add.remove等,其他的没用过,甚至没听说过的还有很多.现在在这个教程中,简单的了解一下,不要求全都记下.相当于在你脑袋里建一个索引,就是有 ...
- jquery : 菜单根据url变颜色
//菜单根据url变颜色$(document).ready(function(){ $('#nav li a').each(function(){ if($($(this))[0].href==Str ...
- 深度强化学习中稀疏奖励问题Sparse Reward
Sparse Reward 推荐资料 <深度强化学习中稀疏奖励问题研究综述>1 李宏毅深度强化学习Sparse Reward4 强化学习算法在被引入深度神经网络后,对大量样本的需求更加 ...
- tensorflow踩坑合集2. TF Serving & gRPC 踩坑
这一章我们借着之前的NER的模型聊聊tensorflow serving,以及gRPC调用要注意的点.以下代码为了方便理解做了简化,完整代码详见Github-ChineseNER ,里面提供了训练好的 ...
- CTF_论剑场-web26
is_numeric() 函数用于检测变量是否为数字或数字字符串.如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE isset() - 检测变量是否设置. $str进行正则表达式 ...
- 三年Android开发,月薪一万二,不敢跳槽,每天都很焦虑
在我们的身边,存在一个普遍现象:很多人从事Android开发工作多年,走过的弯和坎,不计其数,经历的心酸难与外人道也.可是技术确难以提升.止步不前,薪资也只能看着别人水涨船高,自己却没有什么起色. 虽 ...
- 浅谈C#取消令牌CancellationTokenSource
前言 相信大家在使用C#进行开发的时候,特别是使用异步的场景,多多少少会接触到CancellationTokenSource.看名字就知道它和取消异步任务相关的,而且一看便知大名鼎鼎的Cancella ...