php 记录程序运行时间,监视程序的运行时间

实现原理

对于具有GUI的特性的程序,可以使用IShellExecuteHook进行监控(注意,不是监视,是监控),具体原理及实现可以参考我的另一篇文章,"利用IShellExecuteHook接口对程序监控",链接的url为

链接的url中已附有实现的源码.

虽然利用这个IShellExecuteHook可以对GUI的程序进行监控,但是这个技术有两个问题,第一,不能实现对CUI的程序进程监控,第二,不能对使用CreateProcess这类API起动的程序进行监控,例如在自动化的测试程序很多都是不具GUI的脚本,如Python,Ruby等,其次程序都是利用CreateProcess进行被测程序的启动和关闭.所以这个

COM接口不能实现我们所需要的效果.对于"冰刃"这个软件,还有360这类的软件,它们都具有进程创建监视的功能,它们都是利用内核模式实现的,同样,我们也可以在用户模式利用API HOOK这种技术进行监视,但是程序员的经验告诉我,"简单的事情要用简单的方法解决",通过查阅资料,MS早已提供了相应的API实现对程序创建的监视.这个API是PsSetCreateProcessNotifyRoutine.在DDK的帮助文档中我们可以找到以下对这个API的描述.

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.

正是我们需要的功能.

程序实现

通过对PsSetCreateProcessNotifyRoutine文档的描述,我们只需要对程序提供一个回调函数.

101015174102.jpg

当程序在创建和退出的时候,都会自动地调用这个回调函数.如下面的代码所示!

101015174136.jpg

其中参数bCreate的值为TRUE的时候,表示是进程创建,FALSE的时候表示为进程退出.

因为PsSetCreateProcessNotifyRoutine这个是内核的函数,应用层的程序是不能直接访问内核函数的数据的,这就涉及了内核R0与R3的通信了,当然不能直接访问,利用事件信号进行数据的通知,在应用层则侦听事件信号,

101015174212.jpg

利用DeviceIoControl获得内核的数据,如下面代码所示:

101015174228.jpg

完整的程序分为两部份.内核层源码及上层应用层代码!编译时需要Windows DDK(可以是Windows sp2或windows 2003 DDK),编译后将程序作为系统服务,再运行应用层程序,即可看到演示程序效果,以下为代码运行截图!

101015174251.jpg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值