摘 要 随着互联网的迅速普及和应用的不断发展,各种黑客工具和网络攻击手段也层出不穷,网络攻击导致用户利益受到损害,其中木马(Trojan Horse)攻击以其攻击范围广、隐蔽性、危害大等特点成为常见的网络攻击技术之一,对网络安全造成了极大的威胁。系统实现了一个线程插入木马,在Windows XP中,木马被注入EXPLORER进程,然后它打开一个线程在2048端口监听,使其不被发现。木马运行后将自动将自身复制到系统目录下,并且将其命名为一个类似系统文件的名字,使得管理员在众多的系统文件中,不敢轻易删除文件。防止杀毒软件和防火墙报警,并且尽量避免被系统管理员的察觉,减少被发现的概率。论文介绍了木马的定义、原理、分类及其发展趋势。介绍了线程插入,自动运行等技术及其应用。讨论了在WINDOWS系统平台下自动运行的方法,并且给出了部分实现代码。重点描述了一个木马的设计及Visual C++的实现。本文在木马隐藏部分做了研究。
关键词:木马;线程插入;隐藏;**
Design and implement of thread inject Trojan horse Abstract With the rapid popularization of the Internet and the 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 attack, 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 after 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 wall’s alarm, the perception of the system manager and decrease probability of 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-running 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 of Trojan horse hiding.
Key words: Trojan horse;Thread inject;Hide; Back door
木马病毒发展史 第一代木马 :伪装型病毒 这种病毒通过伪装成一个合法性程序诱骗用户上当。世界上第一个计算机木马是出现在1986年的PC-Write木马。它伪装成共享软件PC-Write的 2.72版本(事实上,编写PC-Write的Quicksoft公司从未发行过2.72版本),一旦用户信以为真运行该木马程序,那么他的下场就是硬盘被格式化。此时的第一代木马还不具备传染特征。 第二代木马 :AIDS型木马 继PC -Write之后,1989年出现了AIDS木马。由于当时很少有人使用电子邮件,所以AIDS的作者就利用现实生活中的邮件进行散播:给其他人寄去一封封含有木马程序软盘的邮件。之所以叫这个名称是因为软盘中包含有AIDS和HIV疾病的药品,价格,预防措施等相关信息。软盘中的木马程序在运行后,虽然不会破坏数据,但是他将硬盘加密锁死,然后提示受感染用户花钱消灾。可以说第二代木马已具备了传播特征(尽管通过传统的邮递方式)。 第三代木马:网络传播性木马 随着Internet的普及,这一代木马兼备伪装和传播两种特征并结合TCP/IP网络技术四处泛滥。信息传输方式有所突破,采用ICMP协议,增加了查杀的难度。同时他还有新的特征: 第一.添加了“**”功能。所谓**就是一种可以为计算机系统秘密开启访问入口的程序。一旦被安装,这些程序就能够使攻击者绕过安全程序进入系统。该功能的目的就是收集系统中的重要信息,例如,财务报告、口令及信用卡号。此外,攻击者还可以利用**控制系统,使之成为攻击其它计算机的帮凶。由于**是隐藏在系统背后运行的,因此很难被检测到。它们不像病毒和蠕虫那样通过消耗内存而引起注意。 添加了击键记录功能。从名称上就可以知道,该功能主要是记录用户所有的击键内容然后形成击键记录的日志文件发送给恶意用户。恶意用户可以从中找到用户名、口令以及信用卡号等用户信息。这一代木马比较有名的有国外的BO2000(Back Orifice)和国内的冰河木马。它们有如下共同特点:基于网络的客户端/服务器应用程序。具有搜集信息、 执行系统命令、重新设置机器、重新定向等功能。 当木马程序攻击得手后,计算机就完全在黑客控制的傀儡主机,黑客成了超级用户,用户的所有计算机操作不但没有任何秘密而言,而且黑客可以远程控制 傀儡主机对别的主机发动攻击,这时候背俘获的傀儡主机成了黑客进行进一步攻击的挡箭牌和跳板。 第四代木马 在进程隐藏方面获得了重大突破,采用插入内核的嵌入方式、利用远程插入线程技术、嵌入DLL线程、或挂接PSAPI等,实现木马程序的隐藏,利用反弹端口技术突破防火墙限制,在Windows NT/2000下取得了良好的隐藏效果。 第五代木马 与病毒紧密结合,利用操作系统漏洞,直接实现感染传播的目的,而不必象以前的木马那样需要欺骗用户主动激活。
木马未来的发展方向 (1) 传统的TCP 端对端连接会被抛弃, 未来木马要么采用非TCP/UDP 的IP 族数据包, 如ICMP 方式, 增加了查杀的难度, 它们十分隐蔽, 如果不对数据包详细分析, 很难查出木马入侵; 要么采用寄生TCP端口(例如: 我们进行TCP操作时打开21号端口, 当我们进行FTP操作时, 木马也可同时通过21 号端口与服务端进行连接) , 这样木马传输的数据包和正常的数据包很难区分开来。 (2) 在传播方式上, 未来木马会和病毒一样,采用交叉式迅速大规模扩散, 并且运行方式越来越隐蔽。 (3) 将更注重底层的通讯编程, 如针对网卡和Modem 的通讯编程, 这样可以避开防火墙的监视和过滤。 (4)采取虚拟设备驱动程序(VXD) 及动态链接库(DLL) 技术, 伪装隐藏方式更隐蔽。据悉, 目前已有采用此种方式编写的木马。采用这种方式编写的木马与一般的木马不同, 它基本上摆脱了原有的木马模式, 而采用DLL 动态嵌入远程线程技术。这样做的结果是: 系统中没有增加新的文件, 不需要打开新的端口, 没有新的进程。在正常运行时木马几乎没有任何的症状,而一旦木马的控制端向被控端发出特定的信息后, 隐蔽的程序就立即开始动作。
关键技术 远程线程插入 更好的隐藏方式是使木马程序不以进程和服务的方式存在,而是完全溶入系统内核。因此,在设计时,我们不应把它做成一个应用程序,而是做成一个可以注入应用程序地址空间的线程。该应用程序必须确保绝对安全,这样才能达到彻底隐藏的效果,增加查杀的难度。线程注入式木马采用动态嵌入技术将自己的代码嵌入正在运行的进程中。 Windows中每个进程都有自己的私有内存空间,其他进程不得对该私有空间进行操作,但实际上,有很多方法可操作私有空间。动态嵌入技术很多,如窗口Hook、挂接API、远程线程等。 (1) 远程线程插入技术。远程线程技术指的是通过在一个远程进程中创建远程线程的方法进入该进程的内存地址空间。可以通过CreateRemoteThread函数在一个远程进程内创建远程线程,被创建的远程线程可以共享远程进程的地址空间,这样就可以通过该线程进入远程进程的内存地址空间,从而拥有了远程进程相当的权限,如在远程进程内部启动一个DLL木马,甚至可以随意篡改其中的数据。远程线程技术的关键在于要将线程函数执行体及其参数复制到远程进程空间中,否则远程线程会在执行时因找不到参数而报错。 在实现上,这个技术比较复杂,因为这个线程在目标进程中的寻址会出现问题,必须要进行地址的重定位。为了实现地址的重定位,需要将许多要用到的使用地址进行访问的函数和变量的地址保存下来,然后将这些函数和变量的名城字符串插入到目标进程中去。需要插入到目标进程中的内容包括线程的过程体,线程中要用到的所有的API函数,所有自己定义的函数,所有的全局变量,所有的字符串。也就是说,在编程实现中,需要用到上述的任何东西,都要再次在启动进程中分配存储空间,并要插入到目标进程中去,这种方法对于实现较少功能的程序来说,还可以忍受,但是,一旦程序实现的功能较多,其编程的复杂性会非常高,其不符合常规程序设计的特点也会突现,最终可能导致程序的崩溃。从总体上来分析发现,这种技术不适合功能比较多的**控制程序的编写。 (2)动态链接库插入技术。将**程序做成一个动态链接库文件,然后仍然使用远程线程插入技术,将此动态链接库的加载语句插入到目标进程中去,并将调用动态链接库函数的语句插入到目标进程,这个函数类似于普通程序中的入口程序。这里需要提及的就是,在现有公布的文档中,似乎大家都觉得应该将实现**功能的入口程序放在DLL_PROCESS_ATTACH或者分支语句处DLL_THREAD_ATTACH。但是在实验中发现,这样做会引出诸多的问题,每个进程在调用自己需要的动态链接库的时候都会调用入口函数,这样就会出现一些多次加载的错误。对于这一点,微软的文档中没有做明确的说明。 远程线程函数插入到目标进程中的程序,不能使用目标程序的消息循环,所以,对于既要使用进程隐藏,又要使用交互式程序界面的程序是不能实现的。目前使用这种方法进行隐藏的**软件主要有PortLess BackDoor、BITS.dll、NOIR-QUEEN。 启动DLL**的载体EXE是不可缺少的,也是非常重要的,它被称为:Loader。如果没有Loader,那我们的DLL**如何启动呢?因此,一个好的DLL**会尽力保护自己的Loader不被查杀。Loader的方式有很多,可以是为我们的DLL**而专门编写的一个EXE文件;也可以是系统自带的Rundll32.exe,即使停止了Rundll32.exe,DLL**的主体还是存在的。3721网络实名就是一个例子,虽然它并不是“真正”的**。 (3) Hooking API。这是比较经典的技术,这里使用“Hooking API”这个术语表示对API的完全修改,就是通过修改API函数的入口地址的方法来欺骗试图列举本地所有进程的程序。因为能够列举本地进程的API函数也就是那几个,所以,为了能够欺骗列进程程序,就要修改列进程API函数的入口地址,使别的程序在调用这些函数的时候,首先转向我们的程序,我们的程序中需要做的工作就是在列表中将自己的进程信息去掉,从而达到进程的隐藏,这种方法的实现难度更大,要求程序设计者要精通Windows下的进程、汇编器、PE文件结构和一些API函数。 首先来看运行前挂钩。这里修改我们想要修改函数来自的物理模块(大多数时候是.exe或.dll)。在这里我们至少有3种可能的做法。 第一种可能是找到函数的入口点然后重写它的代码。这会因为函数的大小而受限制,但我们能动态加载其它一些模块(API LoadLibrary),所以应该足够了。内核函数(kernel32.dll)是通用的,因为Windows中每个进程都有这个模块的拷贝。另一个好处是如果我们知道哪些模块在某版本中会修改,我们可以在一些API如LoadLibraryA中使用直接的指针。这是因为Kernel模块在内存中地址在相同Windows版本中是固定的。我们同样也能用动态加载的模块的作用。在这里它的初始化部分在加载进内存后立刻就运行,在新模块的初始化部分我们不受限制。 第二种可能是在模块中被代替的函数只是原函数的扩展,然后我们选择要么修改开始的5个字节为跳转指令或者改写IAT。如果改为跳转指令,那么将会改变指令执行流程转为执行我们的代码。如果调用了IAT记录被修改的函数,我们的代码能在调用结束后被执行,但模块的扩展没那么容易,因为我们必须注意DLL首部。 第三种是修改整个模块。这意味着我们创建自己的模块版本,它能够加载原始的模块并调用原始的函数,当然我们对这个不感兴趣,但重要的函数都是被更新的。这种方法对于有的模块过大的和拥有几百个导出函数的很不方便。 接下来看一下运行时挂钩的技术。在运行前挂钩通常都非常特殊,并且是在内部面向具体的应用程序(或模块)。如果我们更换了Kernel32.dll或Ntdll.dll里的函数,我们就能完美地做到在所有将要运行的进程中替换这个函数,但说来容易做起来却非常难,因为我们不但得考虑精确性和需要编写比较完善的新函数或新模块,但主要问题是只有将要运行的进程才能被挂钩(要挂钩所有进程只能重启电脑)。另一个问题是如何进入这些文件,因为操作系统保护了它们。比较好的解决方法在进程正在运行时挂钩。这需要更多的有关知识,但最后的结果相当不错。在运行中挂钩只对能够写入它们的内存的进程能成功。为了能写入它自己我们使用API函数WriteProcessMemory。使用“Hooking API”技术的例子有LINUX下RootKit,Windows2000下的NTrootkit和Hxdef等,另外病毒里的反杀毒软件的技术也经常采用。
任务目标概述 1. 木马的基本功能 主要实现木马的基本功能,如感染,控制主机等。 2. 线程插入 通过远程线程插入来感染宿主文件,以便躲过躲过杀毒软件的查杀,实现真隐藏。 3. 木马所应具有的的其他特点 ①隐秘性 木马被引入了主机(这个过程称为 ”植入”),那么它首先要找到一个地方来隐藏起来,等待时机发作,在被植入的主机看起来就好像什么事情都没有。 ②自动运行性 一个好的木马绝对不可能奢望对方来点击运行,也不能只执行一次,然后随着系统的关机而不再运行,这样的只发作一次的木马是没有什么作用的。木马往往具有自动运行性,也就是说要么随机子的启动运行而发作,要么等某个条件来触发,而这个触发条件应该是很常用的。 ③危害性 如果一个木马没有什么危害,那么它也就失去了入侵的目的,一个木马的危害性主要表现在控制性上,木马的制作者通过植入木马,然后非法获取系统的较高控制权,达到最终控制对方机子的目的。
对功能的规定 首先,伪装过的木马要在用户毫无察觉的时候感染用户计算机,并自动开始运行,改写注册表启动项,使之能都够开机自动运行。在服务端感染宿主计算机后,建立一个线程在2048端口监听。用户将telnet作为客户端连接服务端,通过telnet向服务端发布命令以控制或破坏服务端计算机。结束后使用命令退出连接,服务端不关闭,还可再次连接。
目 录 论文总页数: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 任务目标概述 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.2 EXCUTEDLLTEST.EXE的实现 12 4.2.1 远程线程插入模块的实现 12 4.2.2 自启动模块 14 4.2.3 提升权限模块 15 4.2.4 进程名转化为PID 15 4.3 DLLTEST.DLL的实现 17 4.3.1 向客户端提供立一个命令行shell 17 4.3.2 查看当前所有进程 18 4.3.3 杀死进程 19 4.3.4 **模块 19 4.4 木马的捆绑 21 5 测试 21 结 论 22 参考文献 23 致 谢 24 声 明 25 |