C#监控程序启动和关闭

C#监控程序启动和关闭,第1张

如下程序实现和你说的功能一下,我用过的是死循环监控进程,这样效率比较低,你可以用timer控件实现监听效果

using System

using System.Collections.Generic

using System.Text

using System.Diagnostics

using System.Threading

namespace ProcessListener

{

class Program

{

static void Main(string[] args)

{

for ()

{

bool isNotePadStart = false//标识记事本进程是否启动

bool isExplorerStart = false//标识explorer进程是否启动

Process[] processes = Process.GetProcesses()//获取所有进程信息

for (int i = 0i <processes.Lengthi++)

{

if (processes[i].ProcessName.ToLower() == "notepad")

{

Console.WriteLine("找到记事本进程!即将关闭explorer进程")

// Thread.Sleep(1000)

isNotePadStart = true

for (int j = 0j <processes.Lengthj++)

{

if (processes[j].ProcessName.ToLower() == "explorer")

{

try

{

processes[j].Kill()

}

catch (Exception)

{

Console.WriteLine("进程访问失败!")

}

Console.WriteLine("已关闭explorer.exe!")

}

}

}

if (processes[i].ProcessName.ToLower() == "explorer")

{

isExplorerStart = true

}

}

if (!isNotePadStart &&!isExplorerStart)

{

Process.Start("explorer.exe")

isNotePadStart = true

}

}

}

}

}

看你的意思,主要是不想让程序A被修改,那么以下情况给你参考吧:

1、在当前的win中,程序A被系统加载并运行后,会有一部分基本上是固定不变的,这主要是代码区,还有一部分是根据需要不停地变的,这是变量区,及其它缓冲区。

2、如果你想的是让代码区不被改动,这个要求很容易达到,因为它是固定的,你只要把这个区域的数据时行一下MD5码的计算,或是使用更快速的某种方法进行一次校验便可。但是基本上你要进行一次完全校验,占用的时间一定是不短的(至少1秒以上),这种做法能保护程序的应有功能不被乱改,但不能保证变量不变乱改。此外相当的低效,很少有人这么做。

3、监视程序的启动,一旦启动把自己的dll hook进去 并拦截teProcessMemory API 看起来是有理的,但存在这样几个问题,首先这种程序一定需要管理员权下才能正常运行,其次,程序X可不可以先对付程序B,再对付程序A呢? 另外,程序B一但起动,某些正常的程序也可能受影响,比如金山快译等。

4、最常见的做法是针对程序X的行为对关键部分的代码进行监控,这样监控的范围就能大大地减少,可以达到0.01秒内完成任务,使用户不会感觉到什么,但这样做的前提是知道程序X的行为具体是什么。

5、其它的通用的做法是针对程序X的特点在内存现运行的程序中进行查找,一但发现进行处理。

6、以上两个方法是最常用的做法。

7、破解与反破解始终是一对死冤家,在当前来说,似乎没有好的解决方法,只能说设法让破解的难度加大!

PS:“程序运行后如何md5效验,这不开玩笑吗?”不是开玩笑,MD5码校验并不专指对一个未运行的文件,MD5码校验是一种算法。将内存中的数据抓出来进行MD5码计算也并不是不可以的,当然,上面说过了,这种计算对机器要求过高,在实时运行中是不科学的,也是不可取的。

ps命令用于查看系统中的进程状态,格式为:“ps [参数]”,

当您第一次执行这个命令时估计要惊呆下,这么多输出值怎么看的过来?其实把ps命令与管道符技术搭配使用,用于来抓取到某个指定服务进程所对应的PID号码,常见的ps命令参数包括有:

-a    显示所有的进程(包括其他用户的)    

-u    用户以及其他详细信息  

-x    显示没有控制终端的进程  

Linux系统中时刻运行着许许多多的进程,如果能够合理的管理它们,绝对有益于对系统的性能优化,Linux系统中进程最常见的5种不同的状态是运行、中断、不可中断、僵死与停止,它们的含义分别是:

R(运行):正在运行或在运行队列中等待。

S(中断):休眠中, 在等待某个条件的形成或接收到信号。

D(不可中断):收到信号不唤醒和不可运行, 进程必须等待直到有中断发生。

Z:(僵死):进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放。

T:(停止):进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行。

当执行"ps aux"命令后通常会看到下面格式的进程状态,表格中只是列举了部分输出值,而且正常的输出值中不包括中文注释部分:

top命令用于动态的监视进程活动与系统负载等信息,格式为:“top”。

top命令可真的是太厉害了,它能够动态的查看系统运维状态,完全可以比喻成是“强化版的linuxprobediancom/chapter-02.html#23任务管理器”。

top命令前面的五行为系统整体的统计信息:

第1行:系统时间,运行时间,登录终端数,系统负载(分别为1分钟、5分钟、15分钟的平均值,数值越小意味着负载越低)。

第2行:进程总数,运行中的,睡眠中的,停止的,僵死的。

第3行:用户占用资源,系统内核占用资源,改变过优先级的进程,空闲的资源,等待输入输出的时间。

此行数据均为CPU数据并以百分比格式显示,例如"99.2 id"意味着有99.2%的CPU处理器资源正在空闲中。

第4行:物理内存总量,使用量,空闲量,作为内核缓存的内存量。

第5行:虚拟内存总量,使用量,空闲量,已被提前加载的内存数据。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11102741.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-13
下一篇2023-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存