【推荐下载】利用进程间通信实现程序自我保护分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

利用进程间通信实现程序自我保护分析
 利用进程间通信实现程序自我保护,重点研究进程间通信技术,最终实现程序运行的稳定。

 1.引言
 在计算机和网络技术日益发展的今天,病毒这个字眼越来越多地出现在了媒体和人们的言论中。

计算机病毒的发展必然会促进计算机反病毒技术的发展,新型病毒的出现向以行为规则判定病毒的预防产品、以病毒特征为基础的检测产品,以及根据计算机病毒传染宿主程序的方法而消除病毒的产品提出了挑战,致使原有的反病毒技术和产品在新型的计算机病毒面前无能为力。

这样,势必使人们认识到现有反病毒产品在对抗新型的计算机病毒方面的局限性,迫使人们在反病毒的技术和产品上进行新的更新和换代。

要打败对手,就要从了解对手开始,本文从模拟病毒隐藏性和寄生性的角度出发,以进程通信、进程快照、多线程等技术基础,利用Visual C++的MFC窗口界面设计了一组程序自我保护软件,经过测试实现了程序的稳定运行。

 2.进程的概念
 当一个程序开始运行时,它就是一个进程,进程所指包括运行中的程序和程序所使用到的内存和系统资源。

因此定义进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。

程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体。

而进程则不同,它是程序在某个数据集上的执行,是一个动态实体。

它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤销,反映了一个程序在一定的数据集上运行的全部动态过程。

 进程由两个部分组成:
 (1)操作系统用来管理进程的内核对象。

内核对象也是系统用来存放关于进程的统计信息的地方。

 (2)地址空间。

它包含所有可执行模块或DLL模块的代码和数据。

它还包含动态内存分配的空间,如线程堆栈和堆分配空间。

 目前常用的操作系统都是并行的,就是多个进程可以同步运行,这时就会牵扯到进程间通信这个概念。

所谓进程通信,就是不同进程之间进行一些接触,这种接触有
简单,也有复杂。

机制不同,复杂度也不一样。

通信是一个广义上的意义,不仅仅指传递一些信息。

举个例子来说明:比如说在使用IE上网时,你想将网页上的一段文字保存至你的电脑上,这时有一种简单的方法,就是复制粘贴。

将你想保存的文字选中,然后将其复制,接下来将所复制的文字粘贴到.TXT文档中,这时就形成了两个进程之间的通信,这里的通信媒介是剪贴板。

 3.线程的概念
 为了对线程模式有一定的理解,我们可以将其想象为把一所屋子里的东西搬到另一所屋子。

如果采用单线程方法,则需要自己完成从打包到扛箱子再到拆包的所有工作。

如果使用单元线程模式,则表示邀请了好朋友来帮忙。

每个朋友在一个单独的房间里工作,并且不能帮助在其他房间工作的人。

他们各自负责自己的空间和空间内的物品搬运。

如果采用自由线程方法,仍然邀请相同的朋友来帮忙,但是所有朋友可以随时在任何一个房间工作,共同打包物品。

与此类似,房子就是运行所有线程的进程,每个朋友都是一个代码实例,搬运的物品为应用程序的资源和变量。

 有了上面的例子,便能容易理解线程(Thread)是一个能独立于程序的其他部分运行的作业,是进程的一个实体,是CPU调度和分派的基本单位。

线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。

一个线程可以执行应用程序代码的任一部分,包括正在由另一线程执行的代码。

 线程由两个部分组成:
 (1)线程的内核对象,操作系统用它来对线程实施管理。

内核对象也是系统用来存放线程统计信息的地方。

 (2)线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量。

 线程属于一个过程,操作系统为每一个运行线程安排一定的CPU时间时间片,线程是操作系统分配CPU时间的基本单位。

系统通过一种循环的方式为线程提供时间片,线程在自己的时间内运行,因时间片相当短,因此,给用户的感觉,就好像线程是同时运行的一样。

如果计算机拥有多个CPU,线程就能真正意义上同时运行了。

 4.进程与线程的关系
 tips:感谢大家的阅读,本文由我司收集整编。

仅供参阅!
 广播电视信息传输系统的维护措施,本文结合实际,详细阐述了广播电视传输系统的日常维护与SDH设备的重点维护措施。

 广播电视节目的优质传输,最终目的是要带给观众精神上和视觉上的双重享受,因此广播电视节目的技术质量就相当于是每个电视台的生命线,制作出高技术质量的广播电视节目固然不易,但是如果节目的传输质量不高,再好的节目也会大打折扣,严重影响节目的收看效果。

以下从广播电视传输系统的日常维护与SDH设备的维护两方面阐述如何加强广播电视信息传输方面的管理。

 1传输系统的日常维护措施
 1.1 传输设备日常维护的特点
 1.1.1先导性
 宜防微杜渐,毋亡羊补牢。

把事故消灭在萌芽状态,防患于未然。

 1.1.2在线安全性
 传输设备都是在线设备,而各电视台的播出时间越来越长,很少有维修、维护时间。

这就要求在日常维护、维修前要做好周详的计划,考虑好应急措施,这样才能对在线设备进行维护,以确保安全传输。

 1.1.3群众性
 调动每一个技术人员的积极性,群策群力,提高预防意识,补漏拾遗。

 1.1.4平凡性
 日常的技术维护工作无名无利,琐碎、繁杂,往往感到麻烦、生厌,这就要求工作人员把个人名利置之度外,默默无闻地做好日常技术维护工作,细微之处见精神,平凡小事寓于伟大精神。

 1.2 加强日常技术维护,以确保系统运行在最佳状态
 日常管理中,要坚持开好每周一次部门安全传输例会,对上一周安全传输情况通报及点评,其中对故障处理的方式进行详细的点评及总结,不断改进应急预案。

同时,为确保系统运行在最佳状态,各部门要制定技术维护检修规程,并提出要求如下:
 a)维护检修工作实行日常值班巡检与定期专业检修维护相结合的方式。

 b)技术维护人员应熟练掌握系统框图及信号流程,遇到问题能迅速查出故障点,进行维护检修。

 c)在检修中如需要调整设备,改动线路,应由分管同志仔细确认,并做好详细记录。

 d)维护检修完毕在机房工作日志上做好详细记录。

 e)机房维护检修工作实行日巡检、周检、月检、季检、年检制度。

 f)每逢节假日或重大播出时间,需提前做好系统和设备的维护检修,确保系统和设备处于良好的运行状态。

 g)检修配电机柜等电源时,一定要至少两个人配合进行,确保人身设备安全。

 机房根据其工作特点制定有关专门的维护检修规程,都有具体的日巡检、周检、月检、季检、年检内容。

按照维护检修规程,机房认真做好传输系统设备的日常维护、保养及系统指标的测试,及时掌握系统信号通道情况,确保通道指标在规定范围内,使系统运行在最佳状态,以确保传输质量。

不断总结完善数字传输的维护检修规程、应急防范措施,从而加强维护检修工作的条理性、规范性和可操作性。

 1.3 完善的设备维护工作是安全传输和高质量技术指标的保障
 tips:感谢大家的阅读,本文由我司收集整编。

仅供参阅!根据操作系统的定义,进程是系统资源管理的最小单位,线程是程序执行的最小单位。

进程是不活泼的,进程可以理解为是线程的容器。

若要使进程完成某项操作,它必须拥有一个在它的环境中运行的线程,此线程负责执行包含在进程的地址空间中的代码。

单个进程可能包含若干个线程,这些线程都同时执行进程地址空间中的代码。

每个进程至少拥有一个线程,来执行进程的地址空间中的代码。

当创建一个进程时,操作系统会自动创建这个进程的第一个线程,称为主线程。

此后,该线程可以创建其他的线程。

 线程是属于进程的,它没有自己的独立的数据地址空间,线程运行在进程空间内,
因此线程的切换速度比较快。

同一进程所产生的线程共享同一内存空间,而这些线程的执行由系统调度程序控制,调度程序决定哪个线程可执行以及什么时候执行线程。

线程有优先级别,优先权较低的线程必须等到优先权较高的线程执行完后再执行。

当进程退出时该进程所产生的线程都会被强制退出并清除。

线程可与属于同一进程的其他线程共享虚地址空间、全局变量,以及该进程所拥有的全部资源,包括打开的文件、信号标志及动态分配的内存等。

但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈)。

 线程有点像进程身体内的细胞,我们通常听过多进程多线程,单进程多线程。

这就是说,一个系统内有几个进程,如果进程是多个,就是多进程的,如果进程内有多个线程,那就是多线程的,多进程多线程的系统比单进程多线程的系统速度慢,但是可靠性高。

 5.程序的设计与实现
 程序的自我保护是一个大的概念,其中有多种方式和手段来实现自身的保护。

比如隐藏、自我复制、注册为服务,等等。

我们实现的程序自我保护实际上是一个相互监督的过程。

其中包括了程序之间的监督和报警,监听程序的隐藏与保护。

 5.1监督
 所谓监督,是利用进程枚举的方法,让所有程序在运行同时不停地对进程列表进行快照,并检查目标进程是否存在的过程。

 在Windows环境下可以通过调用ToolHelp API函数来达到枚举系统进程的目的。

微软的Windows NT开发小组因为不喜欢ToolHelp函数,所以没有将这些函数添加给Windows NT,所以开发了自己的Process Status函数,就是PSAPI。

但是后来微软已经将ToolHelp函数添加给了Windows 2000。

ToolHelp32库函数在KERNEL32.dll中,它们都是标准的API函数。

 ToolHelp32库中有各种各样的函数可以用来枚举系统中的进程、线程,以及获取内存和模块信息。

其中枚举进程只需用如下三个的函数:CreateToolhelp32Snapshot()、Process32First()和Process32Next()。

 使用ToolHelp32函数的第一步是用CreateToolhelp32Snapshot()函数创建系统信息快照。

这个函数可让你选择存储在快照中的信息类型。

如果你只是对进程信息感兴趣,那么只要包含TH32CS_SNAPPROCESS标志即可。

CreateToolhelp32Snapshot()函数返回一个HANDLE,完成调用之后,必须将此HANDLE传给CloseHandle()。

 接下来是调用一次Process32First函数,从快照中获取进程列表,然后重复调用Process32Next,直到函数返回FALSE为止。

这样将遍历快照中进程列表。

这两个函数
都带两个参数,它们分别是快照句柄和一个PROCESSENTRY32结构。

 调用完Process32First或Process32Next之后,PROCESSENTRY32中将包含系统中某个进程的关键信息。

它的具体内容如下:
 typedef struct tagPROCESSENTRY32{
 DWORD dwSize;
 DWORD cntUsage;
 DWORD th32ProcessID;
 tips:感谢大家的阅读,本文由我司收集整编。

仅供参阅!}PROCESSENTRY32;
 其中进程ID就存储在此结构的th32ProcessID。

此ID可以被传给OpenProcess()API
以获得该进程的句柄。

对应的可执行文件名及其存放路径存放在szExeFile结构成员中。

在该结构中还可以找到其他一些有用的信息。

 5.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)来给计数器减一,相当于取消对这块内存的锁定。

本文设计的程序实现报警功能就是在枚举进程之后发现目标进程被终止,从而在剪贴板中写入信息的过程。

 tips:感谢大家的阅读,本文由我司收集整编。

仅供参阅!5.3监听
 所谓监听,就是报警的反方向,即从剪贴板中读出信息。

从剪贴板读取数据的函数GetClipboardData(UINT uFormat)。

这个函数只接收一个参数,参数指定读取的格式。

读取信息之后,我们还要对信息进行if判断,如果信息是我们预留的某个进程被结束的话,我们就启动保护措施。

 5.4保护和隐藏
 这里的保护是指监听程序对其他程序的保护,方法非常简单,利用进程间通信实现程序自我保护只需要利用WinExec函数来实现目标进程的启动就可以。

而隐藏是指监听程序自身的隐藏,只要在OnPaint()函数里调用ShowWindow(SW_HIDE)函数就可以
了,同时将监听程序命名为smss,就可以避免其被强行终止。

 6.结语
 本文中程序的设计是模仿病毒的一些特性而做成的。

它实现了程序的隐藏,并且利用了系统的漏洞实现了不被终止。

对我们了解病毒的特征提供了良好平台,同时对一般程序自我保护的设计有很好的现实意义。

 tips:感谢大家的阅读,本文由我司收集整编。

仅供参阅!。

相关文档
最新文档