开机启动及隐藏进程基本原理.doc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 开机 启动 隐藏 进程 基本原理
- 资源描述:
-
开机启动和隐藏进程的基本原理 摘要 开机启动和隐藏进程作为两种程序设计基本技术为病毒程序广泛使用,本文在开机启动和隐藏进程代码实现的基础上对实现所用到的相关技术原理进行介绍。具体涉及到的相关技术包括服务的创建,进程快照的获取,以及进程的注入。本文采用VC6.0为编译环境,通过代码和说明相结合的方式对三种技术进行阐述。 关键词: 服务 进程快照 进程注入 1 用C语言编写windows服务实现开机启动 开机启动的方法有很多种,包括写注册表,写入启动配置文件,复制到启动目录,写成驱动程序,注册服务等,笔者的程序采用windows服务实现开机启动。服务的编写有多种方式,包括用C语言编写,用atl模板编写,以及用托管C++进行编写。为了更好地理解服务创建的基本原理,笔者采用了C语言编写服务。下面具体阐述C语言编写服务的4个步骤。 1.1 主函数的创建 主函数的创建很简单,具体代码如下: void main() { SERVICE_TABLE_ENTRY ServiceTable[2]; ServiceTable[0].lpServiceName = "MemoryStatus"; ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain; ServiceTable[1].lpServiceName = NULL; ServiceTable[1].lpServiceProc = NULL; StartServiceCtrlDispatcher(ServiceTable); } 由于每个程序可能包含多个服务,因此需要有一个服务列表保存程序所用到得服务信息,SERVICE_TABLE_ENTRY就是这样一个列表,每一个列表项包含了服务名称(lpServiceName)和服务入口函数(lpServiceProc)两个属性。服务列表的最后一项的两个属性必须设置成NULL。在这里我们引入一个新的概念,即服务控制管理器(SCM),作为一个管理系统服务的进程。SCM等待某个进程的主线程调用StartServiceCtrlDispatcher函数,将分派表传递给ServiceCtrlDispatcher。该分派器启动一个新的线程,此线程运行每个服务所注册的服务函数(为lpServiceProc属性所指定),同时还负责监视所有服务的执行情况,将控制请求(外部对服务的启动,关闭等控制信息)传递给服务。当分派表中的所有服务执行完以后,startservicectrldispatcher调用返回,然后主线程终止。 1.2 创建ServiceMain函数 Servicemain函数是main函数中服务列表每项所注册的服务函数,该函数是服务的入口点,在这里完成控制处理器的注册(通过RegisterServiceCtrlHandler函数实现,具体代码在笔者的程序中),RegisterServiceCtrlHandler接收两个参数:服务名和指向控制分派器调用函数的指针。控制分派器是一个函数,在创建服务的第三个步骤中给予说明。在此之后通过调用SetServiceStatus函数项SCM报告服务的状态。SetServiceStatus接收ServiceStatus结构体,此结构体给出服务的当前状态,服务处理的请求类型(如开启和关闭服务等)。 1.3 处理控制请求 在ServiceMain函数中注册了控制处理器函数,此函数类似于Windows消息的窗口回调函数,检查SCM发送了何种请求,并针对每个不同请求采用不同的行为。如SERVICE_STOPPED请求对应于用户停止服务时产生的行为。在响应请求后需要调用SetServiceStatus向SCM报告服务状态。 1.4 安装和配置服务 进入命令行运行sc create 服务名 binpath= 服务路径,即注册服务,运行sc delete 服务名即完成了服务删除,运行 sc config 服务名start= auto/demand 即完成服务类型的选择。 1.5 采用C语言编写的本程序框架说明 本程序在main函数中实现了服务的安装,为了实现程序的开机启动,需要把服务类型设置为自动启动,此命令需要调用dos指令 sc config 服务名start=auto 执行。笔者在程序中通过调用shellexecute方法执行sc.exe进程实现了服务的安装和自动运行。不需要在cmd下对服务进行配置。 2 进程的注入 在上面的篇幅中介绍了服务的创建,创建服务并设置类型为自动启动后可以实现程序的开机启动,但是并不能完成进程功能的隐藏。那么应该如何实现进程功能隐藏呢?笔者在这里采用了进程注入的方式实现进程隐藏,此方式将程序的功能模块注入到某个必要的系统进程中,作为此系统进程的一个线程独立运行。这样人们并不能通过任务管理器找到实现此功能的源进程。 注入进程采用创建远程线程的方式实现,即获得被注入进程的句柄后,通过该句柄在被注入进程中创建一个线程。CreateRemoteThread就是完成这样一个功能的函数,该函数中有三个重要的参数,即被注入进程的句柄,注入的线程函数地址,以及注入线程所接收的参数。笔者在这里利用了动态链接库中的dllmain函数,在dllmain函数中实现注入线程所要实现的功能(调用shellexecute方法启动记事本程序),该函数在动态链接库加载时自动运行。因此我们创建的远程线程需要接收的注入的线程函数地址就变成loadlibrary函数的地址,注入线程所要接收的参数就变成了dll文件所在的路径。但是新的问题来了,每个进程都有自己独立的地址空间,loadlibrary应该隶属于被注入进程的那一块地址呢?我们知道,windows98后windows操作系统对进程访问做了很多限制,不同的进程不能互相访问彼此的地址空间。但是,loadlibrary函数在每个用户进程中都要被加载,且加载地址都相同,这样可以方便进程对系统公用dll进行共享Loadlibrary属于kernel32.dll,因此我们只需调用getprocaddress方法获得kernel32.dll中的loadlibrary地址,并将此地址作为参数传递给远程线程即可。但是这里又有了新的问题,远程线程中传入函数地址的同时要传入该函数对应的参数,如果参数是简单的数值类型可以直接传入,但是我们在这里要传入loadlibrary所对应的dll的地址,该地址类型是char*类型,即进程的逻辑地址,因此将它直接作为远程线程函数的参数是不行的。我们需要采用新的方法来解决此问题。笔者在这里首先利用被注入进程的句柄为注入进程分配一块新的内存空间,然后将dll地址拷贝到此空间中。调用virtualallocex函数可以分配新的内存空间,调用writeprocessmemory将dll的地址拷贝到此片空间,这样就完成了进程的注入功能。该线程随着被注入进程的结束而结束。至此进程的注入就完成了,但是我们前面提到过需要获得被注入进程的句柄,该句柄如何获取呢?这就涉及到了进程快照的获取问题。 3 进程快照的获取 进程快照的获取通过调用CreateToolhelp32Snapshot函数完成, 此函数返回进程快照的句柄。在获得快照的同时我们需要对该快照进行遍历以查找我们要注入的进程的id号,只有通过此id号才可以获得进程的句柄。遍历通过::Process32First和::Process32Next函数来完成,::Process32First返回快照的第一个进程信息,该信息中包含了进程的名称和进程的id,因此我们可以得到指定名称进程的id。得到了进程id后通过openprocess函数就可以获得进程的句柄。笔者在程序中选择了explorer.exe进程进行注入。结合上一步的进程创建远程线程注入进程的方法就完成了整个进程的注入,然后将这个进程注入代码嵌入到服务代码中的servicemain函数中就实现了开机启动和隐藏进程。但是我们在运行程序的时候会发现服务创建的时候在对应的任务管理器中也会出现服务所调用的exe程序名称。这样人们会很快通过该exe程序名称锁定服务程序地址。如何在服务启动后完成注入并关闭进程呢?关闭进程后远程线程还会起到相关作用吗?笔者在最后对这两个问题的解决方法进行说明。 4 两个问题的解决 首先是第一个问题,进程在关闭后远程线程是否还可以继续运行,答案是肯定的,因为远程线程被注入后就作为独立的线程被附加到被注入进程中,所以不会随着原进程结束而结束。然后就是第二个问题,如何在注入服务启动后关闭注入服务,笔者在此利用了dos命令(taskkill /im 进程名 /f)在服务启动后关闭该服务。但是直接在服务中调用shellexecute方法执行此命令系统会报出服务异常终止的错误。为了避免此情况的出现,笔者在另外一个程序中实现此功能,并在服务启动前调用此函数。值得注意的是,笔者在另外一个进程的main函数中首先让该进程睡眠10秒钟,如果不这样做系统同样会报出服务会异常关闭的错误。 结论 到此为止,整个进程开机启动和进程隐藏的方法就介绍完毕。程序代码和该文档放在了同一个打包文件中以供参考,7个实验都附带有相关文档和注释进行说明。代码包括了服务的创建,进程快照的获取和进程注入的实现。在做此项目和7个实验的过程中。笔者的c++水平从刚刚起步步入到可以利用c++编写简单项目阶段,懂得了动态链接库的静态包含和动态加载,利用关键代码实现线程的同步,利用共享内存进行进程通信,利用socket实现文件传输,利用activatemovie控件进行视频控制,菜单的控制以及聊天程序的创建和托盘的实现等。进程开机启动和进程隐藏是对7个实验的一次综合利用,涉及到了7个实验中的文件操作,虚拟内存实现进程通信,动态链接库的动态加载等。 本文来自CSDN博客,转载请标明出处:展开阅读全文
咨信网温馨提示:1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。




开机启动及隐藏进程基本原理.doc



实名认证













自信AI助手
















微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/7849455.html