多进程环境下程序自我防护病毒的实现

点赞:23899 浏览:107306 近期更新时间:2024-03-29 作者:网友分享原创网站原创

摘 要 :本文对进程及线程运行原理上的分析,通过模拟病毒的隐藏性和寄生性,运用进程通信、进程快照、多线程等技术基础,从实例分析角度来模拟病毒特征,介绍了如何利用多进程实现程序的自我防护,最终实现程序运行的可靠性和安全性.

关 键 词 : 病毒;进程与线程;自我防护;程序

中图分类号:G4

引言

一、计算机进程与线程

进程是程序在计算机上的一次执行活动 ,在Windows下,进程又被细化为线程,也就是一个进程下有多个能独立运行的更小的单位.在同一个时间里,同一个计算机系统中如果允许两个或两个以上的进程处于运行状态,这便是多任务.现代的操作系统几乎都是多任务操作系统,能够同时管理多个进程的运行.我们通常使用的计算机中只有一个CPU,也就是说只有一颗心,要让它一心多用,同时运行多个进程,就必须使用并发技术.实现并发技术相当复杂,最容易理解的是“时间片轮转进程调度算法”,它的思想简单介绍如下:在操作系统的管理下,所有正在运行的进程轮流使用CPU,每个进程允许占用CPU的时间非常短(比如10毫秒),这样用户根本感觉不出来CPU是在轮流为多个进程怎么写作,就好象所有的进程都在不间断地运行一样.

在Windows中,进行CPU分配是以线程为单位的,一个进程可能由多个线程组成,这时情况更加复杂,但简单地说,有如下关系:

总线程数<= CPU数量:并行运行

总线程数> CPU数量:并发运行

并行运行的效率显然高于并发运行,所以在多CPU的计算机中,多任务的效率比较高.但是,如果在多CPU计算机中只运行一个进程(线程),就不能发挥多CPU的优势.

这里涉及到多任务操作系统的问题,多任务操作系统(如Windows)的基本原理是:操作系统将CPU的时间片分配给多个线程,每个线程在操作系统指定的时间片内完成.操作系统不断的从一个线程的执行切换到另一个线程的执行,如此往复,宏观上看来,就好像是多个线程在一起执行.由于这多个线程分属于不同的进程,因此在我们看来.就好像是多个进程在同时执行,这样就实现了多任务.

二、程序的设计与实现

1.监督过程的实现

监督是指利用进程枚举的方法,让所有程序在运行同时不停地对进程列表进行快照,并检查目标进程是否存在的过程. 在Windows环境下通过调用ToolHelp API函数来达到枚举系统进程的目的.ToolHelp32库函数在KERNEL32.dll中,它们都是标准的API函数.

ToolHelp32库中有各种各样的函数可以用来枚举系统中的进程、线程,以及获取内存和模块信息.其中枚举进程只需用如下三个的函数:CreateToolhelp32Snapshot()、Process32First()和Process32Next(). 使用ToolHelp32函数的第一步是用CreateToolhelp32Snapshot()函数创建系统信息“快照”.这个函数可让你选择存储在快照中的信息类型.如果你只是对进程信息感兴趣,那么只要包含TH32CS_SNAPPROCESS标志即可.CreateToolhelp32Snapshot()函数返回一个HANDLE,完成调用之后,必须将此HANDLE传给CloseHandle().接下来是调用一次Process32First函数,从快照中获取进程列表,然后重复调用Process32Next,直到函数返回FALSE为止.这样将遍历快照中进程列表.这两个函数都带两个参数,它们分别是快照句柄和一个PROCESSENTRY32结构.

多进程环境下程序自我防护病毒的实现参考属性评定
有关论文范文主题研究: 关于操作系统的论文范文数据库 大学生适用: 专升本论文、在职研究生论文
相关参考文献下载数量: 25 写作解决问题: 毕业论文怎么写
毕业论文开题报告: 论文模板、论文前言 职称论文适用: 杂志投稿、中级职称
所属大学生专业类别: 毕业论文怎么写 论文题目推荐度: 经典题目

2.报警进程的实现

一个程序中复制数据的时候,实际上是将这些数据放入了内存,相反,在另一个程序中粘贴数据时实际上是从内存取出数据,这些都是通过使用剪贴板来实现的.使用剪贴板的主要函数有:打开剪贴板OpenClipboard(),不管是对剪贴板的读还是写,都要首先调用此函数,以判断是否可以对剪贴板进行操作.此函数是BOOL型的,如果调用成功就返回非零,否则返回零.清空剪贴板EmptyClipborad(),每次对剪贴板的写入操作之前,都应该调用此函数,这个函数的作用不仅是清空剪贴板,而且起到获得剪贴板的使用权的作用.同样,这个函数也是BOOL型的,如果调用成功就返回非零,否则返回零.对剪贴板写入SetClipboardData(UINT uFormat,HANDLE hMem),这个函数有两个参数,第一个参数用来表示写入剪贴板数据的格式,第二个参数接收一个句柄值,在这里它接收一个指向内存对象的句柄,这个内存对象中存放着准备写入剪贴板的数据内容.在调用SetClipboardData(UINT uFormat,HANDLE hMem)之前还需要调用GlobalAlloc(UINT uFlags,SIZE_T dwSytes)这样一个函数,它专门用来为将要写入的数据分配一块内存空间.这个函数接收两个参数,第一个参数表示如何来分配内存空间,这里我们将它设置为GMEM_MOVEABLE,表示动态分配内存.第二个参数是表示分配内存空间的大小.GlobalAlloc(UINT uFlags,SIZE_T dwSytes)返回一个句柄,我们无法使用句柄来间接的将数据放入内存,这时就需要调用另一个函数GlobalLock(HGLOBAL hMem),这个函数获得一个内存对象的句柄,将这块内存加锁,返回一个指针,这时我们就可以给指针所指向的这块内存写入数据了.这个函数使用一个内存计数,计数器基数为零,每调用一次计数器加一,所以每调用一次的同时还需要调用另外一个函数GlobalUnlock(HGLOBAL hMem)来给计数器减一,相当于取消对这块内存的锁定.程序实现报警功能就是在枚举进程之后发现目标进程被终止,从而在剪贴板中写入信息的过程.

3.监听进程的实现

所谓监听,就是报警的反方向,即从剪贴板中读出信息.从剪贴板读取数据的函数GetClipboardData(UINT uFormat).这个函数只接收一个参数,参数指定读取的格式.读取信息之后,我们还要对信息进行if判断,如果信息是我们预留的某个进程被结束的话,我们就启动保护措施.

4.防护和隐藏进程的实现

这里的保护是指监听程序对其他程序的保护,方法非常简单,只需要利用WinExec函数来实现目标进程的启动就可以.而隐藏是指监听程序自身的隐藏,只要在OnPaint()函数里调用ShowWindow(SW_HIDE)函数就可以了,同时将监听程序命名为ss,就可以避免其被强行终止.


三、结束语

由于网络及信息资源的特殊性质,决定了信息安全问题的客观存在.本程序的设计是模仿病毒的一些特性实现.它体现了程序的隐藏、保证了程序的安全运行,利用系统的漏洞实现不被其他进程终止.对一般程序自我保护的设计有很好的借鉴参考意义.