下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、关于利用进程间通信实现程序自我保护论文摘要:本文从实例的角度出发,以模拟病毒特征为主线,详细地介绍了如何利用多进程实现程序的自我保护。 通过对进程及线程运行原理的分析, 重点研 究进程间通信技术,最终实现程序运行的稳定。论文关键词: 病毒 进程间通信 程序自我保护1. 引言在计算机和网络技术日益发展的今天,病毒这个字眼越来越多地出现在了媒 体和人们的言论中。计算机病毒的发展必然会促进计算机反病毒技术的发展,新型病毒的出现向以行为规则判定病毒的预防产品、以病毒特征为基础的检测产品,以及根据计算机病毒传染宿主程序的方法而消除病毒的产品提出了挑战,致使原有的反病毒技术和产品在新型的计算机病毒面前无能
2、为力。这样,势必使人们认识到现有反病毒产品在对抗新型的计算机病毒方面的局限性,迫使人们在反病毒 的技术和产品上进行新的更新和换代。 要打败对手,就要从了解对手开始,本文 从模拟病毒隐藏性和寄生性的角度出发,以进程通信、进程快照、多线程等技术基础,利用Visual C+的MFC窗口界面设计了一组程序自我保护软件,经过测 试实现了程序的稳定运行。2. 进程的概念当一个程序开始运行时,它就是一个进程,进程所指包括运行中的程序和程 序所使用到的内存和系统资源。因此定义进程(Process)是具有一定独立功能 的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个 独立单位。程序只是一组
3、指令的有序集合,它本身没有任何运行的含义,只是一 个静态实体。而进程则不同,它是程序在某个数据集上的执行,是一个动态实体。 它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态, 因完成 任务而被撤销,反映了一个程序在一定的数据集上运行的全部动态过程。进程由两个部分组成:(1)操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方。(2)地址空间。它包含所有可执行模块或 DLL模块的代码和数据。它还包 含动态内存分配的空间,如线程堆栈和堆分配空间。目前常用的操作系统都是并行的,就是多个进程可以同步运行,这时就会牵 扯到进程间通信这个概念。所谓进程通信,就是不
4、同进程之间进行一些“接触”, 这种接触有简单,也有复杂。机制不同,复杂度也不一样。通信是一个广义上的 意义,不仅仅指传递一些信息。举个例子来说明:比如说在使用IE上网时,你想将网页上的一段文字保存至你的电脑上, 这时有一种简单的方法,就是复制粘 贴。将你想保存的文字选中,然后将其复制,接下来将所复制的文字粘贴到.TXT 文档中,这时就形成了两个进程之间的通信,这里的通信媒介是剪贴板。3. 线程的概念为了对线程模式有一定的理解,我们可以将其想象为把一所屋子里的东西搬 到另一所屋子。如果采用单线程方法,则需要自己完成从打包到扛箱子再到拆包 的所有工作。如果使用单元线程模式,则表示邀请了好朋友来帮忙
5、。每个朋友在 一个单独的房间里工作,并且不能帮助在其他房间工作的人。 他们各自负责自己 的空间和空间内的物品搬运。如果采用自由线程方法,仍然邀请相同的朋友来帮 忙,但是所有朋友可以随时在任何一个房间工作,共同打包物品。与此类似,房 子就是运行所有线程的进程,每个朋友都是一个代码实例,搬运的物品为应用程 序的资源和变量。有了上面的例子,便能容易理解线程(Thread)是一个能独立于程序的其他 部分运行的作业,是进程的一个实体,是CPU调度和分派的基本单位。线程不能 够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 线程 是程序中的一个执行流,每个线程都有自己的专有寄存器 (栈指
6、针、程序计数器 等),但代码区是共享的,即不同的线程可以执行同样的函数。一个线程可以执 行应用程序代码的任一部分,包括正在由另一线程执行的代码。线程由两个部分组成:(1)线程的内核对象,操作系统用它来对线程实施管理。内核对象也是系 统用来存放线程统计信息的地方。(2)线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量。线程属于一个过程,操作系统为每一个运行线程安排一定的 CPU寸间一一时 间片,线程是操作系统分配CPU时间的基本单位。系统通过一种循环的方式为线 程提供时间片,线程在自己的时间内运行,因时间片相当短,因此,给用户的感 觉,就好像线程是同时运行的一样。如果计算机拥有多个
7、CPU线程就能真正意 义上同时运行了。4. 进程与线程的关系根据操作系统的定义,进程是系统资源管理的最小单位,线程是程序执行的 最小单位。进程是不活泼的,进程可以理解为是线程的容器。 若要使进程完成某 项操作,它必须拥有一个在它的环境中运行的线程, 此线程负责执行包含在进程 的地址空间中的代码。单个进程可能包含若干个线程,这些线程都“同时”执行 进程地址空间中的代码。每个进程至少拥有一个线程,来执行进程的地址空间中 的代码。当创建一个进程时,操作系统会自动创建这个进程的第一个线程,称为主线程。此后,该线程可以创建其他的线程。线程是属于进程的,它没有自己的独立的数据地址空间, 线程运行在进程空
8、间内,因此线程的切换速度比较快。同一进程所产生的线程共享同一内存空间, 而这些线程的执行由系统调度程序控制,调度程序决定哪个线程可执行以及什么 时候执行线程。线程有优先级别,优先权较低的线程必须等到优先权较高的线程 执行完后再执行。当进程退出时该进程所产生的线程都会被强制退出并清除。线程可与属于同一进程的其他线程共享虚地址空间、全局变量,以及该进程所拥有 的全部资源,包括打开的文件、信号标志及动态分配的内存等。 但是其本身基本 上不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组 寄存器和栈)。线程有点像进程身体内的细胞,我们通常听过多进程多线程,单进程多线程。 这就是说,一
9、个系统内有几个进程,如果进程是多个,就是多进程的,如果进程 内有多个线程,那就是多线程的,多进程多线程的系统比单进程多线程的系统速 度慢,但是可靠性高。5. 程序的设计与实现程序的自我保护是一个大的概念,其中有多种方式和手段来实现自身的保护。 比如隐藏、自我复制、注册为服务,等等。我们实现的程序自我保护实际上是一个相互监督的过程。其中包括了程序之间的监督和报警,监听程序的隐藏与保护。5.1监督所谓监督,是利用进程枚举的方法,让所有程序在运行同时不停地对进程列 表进行快照,并检查目标进程是否存在的过程。在Windows环境下可以通过调用ToolHelp API函数来达到枚举系统进程的 目的。微软
10、的WindowsNT开发小组因为不喜欢ToolHelp函数,所以没有将这些 函数添加给 WindowsNT,所以开发了自己的Process Status函数,就是PSAP。 但是后来微软已经将ToolHelp函数添加给了 Windows2000。ToolHelp32库函数 在KERNEL32.dll中,它们都是标准的 API函数。ToolHelp32库中有各种各样的函数可以用来枚举系统中的进程、线程,以 及获取内存和模块信息。其中枚举进程只需用如下三个的函数: CreateToolhelp32Snapshot ()、Process32First ()和 Process32Next ()。使用
11、ToolHelp32 函数的第一步是用 CreateToolhelp32S nap shot ()函数创 建系统信息“快照”。这个函数可让你选择存储在快照中的信息类型。如果你只 是对进程信息感兴趣,那么只要包含TH32CS_SNAPPROCESSfc即可。 CreateToolhelp32S napshot ()函数返回一个 HANDLE完成调用之后,必须将 此 HANDL传给 CloseHandle ()。接下来是调用一次Process32First函数,从快照中获取进程列表,然后重 复调用Process32Next,直到函数返回FALSE为止。这样将遍历快照中进程列表。 这两个函数都带两个
12、参数,它们分别是快照句柄和一个PROCESSENTRY结构。调用完 Process32First 或 Process32Next 之后,PROCESSENTRY中将包含 系统中某个进程的关键信息。它的具体内容如下:typedef struct tagPROCESSENTRY32DWORD dwSizeDWORD cntUsageDWORD th32ProcessIDDWORD th32DefaultHeaplDDWORD th32ModulelDDWORD cntThreadsDWORD th32Pare ntProcessIDLONG pcPriClassBase;DWORD dwFlags
13、TCHAR szExeFile;DWORD th32MemoryBa;eDWORD th32AccessKeyPROCESSENTR 丫32其中进程ID就存储在此结构的th32ProcesslD。此ID可以被传给Open Process () API以获得该进程的句柄。对应的可执行文件名及其存放路径 存放在szExeFile结构成员中。在该结构中还可以找到其他一些有用的信息。5.2报警这里的报警就涉及了进程间通信的概念。 本文中涉及的进程间通信是用剪贴 板的方法,剪贴板在我们实际应用中是用得比较多的,它实际上是系统维护管理的一个内存区域,当我们在一个程序中复制数据的时候,实际上是将这些数据放入
14、了内存,相反,当我们在另一个程序中粘贴数据时实际上是从内存取出数据。 下面介绍一下使用剪贴板时的主要函数:打开剪贴板OpenClipboard (),不管是对剪贴板的读还是写,都要首先调用此函数,以判断是否可以对剪贴板进行操 作。此函数是BOOL型的,如果调用成功就返回非零,否则返回零。清空剪贴板 EmptyClipborad (),每次对剪贴板的写入操作之前,都应该调用此函数,这个 函数的作用不仅是清空剪贴板,而且起到获得剪贴板的使用权的作用。同样,这个函数也是BOOL型的,如果调用成功就返回非零,否则返回零。对剪贴板写入 SetClipboardData ( UINT uFormat,HA
15、NDLEMerj),这个函数有两个参数,第一 个参数用来表示写入剪贴板数据的格式,第二个参数接收一个句柄值,在这里它接收一个指向内存对象的句柄,这个内存对象中存放着准备写入剪贴板的数据内 容。在调用 SetClipboardData ( UINT uFormat,HANDLE hMem之前还需要调用 GlobalAlloc (UINT uFlags,SIZE_T dwSytes)这样一个函数,它专门用来为将 要写入的数据分配一块内存空间。 这个函数接收两个参数,第一个参数表示如何 来分配内存空间,这里我们将它设置为GMEM_MOVEAB表示动态分配内存。第二个参数是表示分配内存空间的大小。Gl
16、obalAlloc ( UINT uFlags , SIZE_TdwSytes)返回一个句柄,我们无法使用句柄来间接的将数据放入内存,这时就 需要调用另一个函数GlobalLock (HGLOBAhMem,这个函数获得一个内存对象 的句柄,将这块内存加锁,返回一个指针,这时我们就可以给指针所指向的这块 内存写入数据了。这个函数使用一个内存计数,计数器基数为零,每调用一次计 数器加一,所以每调用一次的同时还需要调用另外一个函数GlobalU nlock(HGLOBAhMem来给计数器减一,相当于取消对这块内存的锁定。本文设计的 程序实现报警功能就是在枚举进程之后发现目标进程被终止,从而在剪贴板中写入信息的过程。5.3监听所谓监听,就是报警的反方向,即从剪贴板中读出信息。从剪贴板读取数据 的函数GetClipboardData (UINT uFormat)。这个函数只接收一个参数,参数指 定读取的格式。读取信息之后,我们还要对信息进行 if判断,如果信息是我们 预留的某个进程被结束的话,我们就启动保护措施。5.4保护和隐
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 六盘水师范学院《农民画综合材料创作》2023-2024学年第一学期期末试卷
- 焦作师范高等专科学校《美术课程设计与开发》2023-2024学年第一学期期末试卷
- 新苏教版一年级下册数学第1单元第1课时《9加几》作业
- 华中师范大学《网球(2)》2023-2024学年第一学期期末试卷
- 【物理】第八章 运动和力+2024-2025学年人教版(2024)物理八年级下册
- 河套学院《环境健康密码》2023-2024学年第一学期期末试卷
- 重庆轻工职业学院《计算机组成及系统结构》2023-2024学年第一学期期末试卷
- 驻马店职业技术学院《制冷与空调》2023-2024学年第一学期期末试卷
- 浙江药科职业大学《数值模拟技术》2023-2024学年第一学期期末试卷
- 浙江工商大学《多媒体数据分析与检索》2023-2024学年第一学期期末试卷
- 绵阳市高中2022级(2025届)高三第二次诊断性考试(二诊)历史试卷(含答案)
- 《视频压缩基础》课件
- 四年级数学(上)计算题专项练习及答案
- 军事理论(2024年版)学习通超星期末考试答案章节答案2024年
- GB/T 6672-2001塑料薄膜和薄片厚度测定机械测量法
- 写人事物景作文课件
- 厂级安全培训资料
- 中国药科大学《药物化学》教学日历
- 露天矿山课件
- 经济效益证明(模板)
- 果树蔬菜病害:第一章 蔬菜害虫
评论
0/150
提交评论