论文无忧网提供:计算机毕业论文范文|计算机毕业设计|计算机毕业论文
栏目导航 ASP Java Web .NET VB6.0 JAVA VC VF DELPHI PB 计算机网络 计算机科学与技术 PHP 安卓APP 其他 C# 代写论文
当前位置: > 计算机 > 计算机科学与技术 >

基于进程和通信隐藏的木马设计与实现(论文+程序)

通信隐藏常见的办法有以下几种:

(1)使用TCP协议通信 内容来自www.paper51.com

客户端侦听,服务端连接。这就是所谓的反向连接技术了。为了克服服务端在某一端口上侦听易被发现这一缺点,现在服务端不再侦听端口,而是去连接客户端在侦听的某一端口。这样用一般的port scanner或者fport就发现不了服务端了。而为了更好的麻痹宿主机,客户端侦听的端口一般是21,80,23这种任何人都要访问的端口。虽然在安装了防火墙的机器上,服务端去连接客户端还是要引起防火墙报警,但是一个粗心的用户很可能会忽略“应用程序xxxxx试图访问xxx.xxx.xxx.xxx通过端口80”这样的警告。

内容来自www.paper51.com

这种反向连接技术要解决的一个问题是,服务端如何找到客户端。由于一般客户端都是拨号上网的,没有一个固定的IP,所以客户端IP不可能硬编码在服务端程序中。当然由于拨号上网用户的IP一般都是处于一个固定的IP地址范围内,服务端也可以扫描这个范围,然后根据被扫描主机的反馈来确定是否是自己的客户端,但是服务端扫描一个IP地址范围也太烦琐。 paper51.com

其实客户端可以通过一个有固定IP或者固定域名的第三方发布自己的IP,比如通过一个公共的邮箱,通过一个个人主页,或者我们截获其他进程收到的TCP数据或者UDP包,然后分析截获的数据,从中确定是否客户端发来了一个报告其IP的数据片断。对于普通用户来说,由于要上网浏览,这样的ICMP包是很少过滤掉的。所以还有一种方法是使用RAW socket来收听ECHO REPLY类型的ICMP包,在ICMP数据包的数据去就包含了客户端IP。 内容来自www.paper51.com

(2)使用UDP协议通信 copyright paper51.com

服务端侦听,客户端连接;客户端侦听,服务端连接。方法和安全性与使用TCP协议差不多。需要注意的是UDP不是一个可靠的协议,所以,必须在UDP协议的基础上设计一个自己的可靠的报文传递协议。

内容来自论文无忧网 www.paper51.com

(3)用ICMP来通信 内容来自www.paper51.com

既然客户端可以通过发一个ICMP(ECHO REPLY)来告诉服务端它的IP,那为什么不把所有服务端和客户端的通讯都建立在ICMP基础上呢?服务端向客户端发ICMP(ECHOREQUEST),客户端向服务端发ICMP(ECHO REPLY),然后可以在ICMP基础上建立一个自己的可靠数据报通讯协议。如果不怕麻烦的话,还可以建立一个TCP over ICMP。由于一般的用户这两类ICMP包都是设为无警告放行的,这种方法的隐秘性还是很强的。 copyright paper51.com

(4)用自定义的协议来通信

http://www.paper51.com

我们知道IP头的协议字段指定了这个IP包承载得数据的协议,比如TCP,UDP,ICMP等等。我们完全可以把这个字段设为我们自己定义的值(>80),定义自己的通讯协议。不过估计这种IP包将会被所有的防火墙过滤掉。

内容来自www.paper51.com

(5)基于嗅探原理的通信

内容来自www.paper51.com

服务器端是一个sniffer和发包器,它将捕获指定特征的数据包。客户端是一个发包器和嗅探器,用来发送指定特征的数据包并包括定义的命令以及接收服务器端的数据。当服务器端捕获到该指定特征的数据包时,变成激活状态,通过分析该数据包,获得客户端发送的命令和客户端的IP地址,然后实现相应的命令,并将执行后的结果发送回客户端,客户端的嗅探部分则接收相应的数据。所有的数据发送都是通过原始套接字进行。 http://www.paper51.com

其他隐藏通信的办法,如变换数据包顺序也可以实现通信隐藏。对于传输n 个对象的通信,可以有n!种传输顺序,总共可以表示log2( n!)比特位的信息。但是该方法对网络传输质量要求较高,接收方应能按照数据包发送的顺序接收。这种通信隐藏方式具有不必修改数据包内容的优点。 http://www.paper51.com

现有木马一般不大注意通信流量的隐藏, 而用户可以通过检测异常的通信流量变化发现木马,因此还有一种“跟着进程动”的办法来实现通信隐藏:当存在其它通信流量时,木马程序也启动通信。当不存在任何其它通信流量时,木马程序处于监听状态, 等待其它进程通信。同时可以运用数据缓冲区,暂存待发送的数据。

paper51.com

通信隐藏技术只是木马隐藏诸技术中得一部分,但也是最重要的一部分。因为他不但要保护木马,还要保护木马得控制者,所以不管是木马编写者,还是防火墙编写者,都应该对这一部分给予足够的重视。 paper51.com

4        隐藏技术的实现 paper51.com

4.1  隐藏进程 copyright paper51.com

上文介绍了几种隐藏进程的方法,在此,笔者采用远程线程插入的方法来实现进程的隐藏。 内容来自www.paper51.com

首先,我们通过OpenProcess 来打开我们试图嵌入的进程。如果远程进程不允许打开,那么嵌入就无法进行了,这往往是由于权限不足引起的,解决方法是通过种种途径提升本地进程的权限。 copyright paper51.com

  内容来自论文无忧网 www.paper51.com 

hRemoteProcess=OpenProcess(PROCESS_CREATE_THREAD| copyright paper51.com

  http://www.paper51.com 

PROCESS_VM_OPERATION| 内容来自论文无忧网 www.paper51.com

  copyright paper51.com 

PROCESS_VM_WRITE,

http://www.paper51.com

  
内容来自论文无忧网 www.paper51.com

FALSE, copyright paper51.com

  
paper51.com

dwRemoteProcessId); 内容来自论文无忧网 www.paper51.com

  

http://www.paper51.com

由于我们后面需要写入远程进程的内存地址空间并建立远程线程,所以需要申请足够的权限(PROCESS_CREATE_THREAD、VM_OPERATION、VM_WRITE)。

copyright paper51.com

  copyright paper51.com 

然后,我们可以建立LoadLibraryA函数这个线程来启动我们的DLL木马,LoadLibraryA函数是在kernel32.dll中定义的,用来加载DLL文件,它只有一个参数,就是DLL文件的绝对路径名pszLibFileName,也就是木马DLL的全路径文件名,但是由于木马DLL是在远程进程内调用的,所以我们首先还需要将这个文件名复制到远程地址空间:(否则远程线程是无法读到这个参数的) 

内容来自论文无忧网 www.paper51.com

  

内容来自论文无忧网 www.paper51.com

//计算DLL路径名需要的内存空间

http://www.paper51.com

  http://www.paper51.com 

int cb=((1+strlen(pszLibFileName))*sizeof(char));

内容来自论文无忧网 www.paper51.com

  
内容来自www.paper51.com

//使用VirtualAllocEx函数在远程进程的内存地址空间分配DLL文件名缓冲区

内容来自论文无忧网 www.paper51.com

  copyright paper51.com 

pszLibFileRemote = (PWSTR) VirtualAllocEx( hRemoteProcess, http://www.paper51.com

  copyright paper51.com 

NULL, cb, 内容来自www.paper51.com

  
copyright paper51.com

MEM_COMMIT, PAGE_READWRITE);

paper51.com

  paper51.com 

copyright paper51.com

  paper51.com 

图1 基于远程线程插入的程序流程图

paper51.com

  
内容来自www.paper51.com

//使用WriteProcessMemory函数将DLL的路径名复制到远程进程的内存空间 paper51.com

  
内容来自www.paper51.com

 ReturnCode = WriteProcessMemory(hRemoteProcess,

copyright paper51.com

  
paper51.com

                      pszLibFileRemote, copyright paper51.com

  

内容来自www.paper51.com

pszLibFileName, copyright paper51.com

  
http://www.paper51.com

  cb, NULL);

内容来自论文无忧网 www.paper51.com

  http://www.paper51.com 

//计算LoadLibraryA的入口地址

copyright paper51.com

  copyright paper51.com 

LPTHREAD_START_ROUTINE fnStartAddr=(LPTHREAD_START_ROUTINE) GetProcAddress(phmd,"LoadLibraryA");

内容来自www.paper51.com

  copyright paper51.com 

我们通过建立远程线程时的地址fnStartAddr(实际上就是LoadLibraryA的入口地址)和传递的参数pszLibFileRemote(实际上是我们复制过去的木马DLL的全路径文件名)在远程进程内启动我们的木马DLL: copyright paper51.com

  copyright paper51.com 

//启动远程线程LoadLibraryA,通过远程线程调用用户的DLL文件

paper51.com

  copyright paper51.com 

hRemoteThread = CreateRemoteThread( hRemoteProcess, paper51.com

  内容来自论文无忧网 www.paper51.com 

NULL, paper51.com

  
内容来自论文无忧网 www.paper51.com

0, http://www.paper51.com

  
内容来自论文无忧网 www.paper51.com

fnStartAddr,

内容来自www.paper51.com

  
paper51.com

pszLibFileRemote, 内容来自www.paper51.com

  copyright paper51.com 

0,

内容来自www.paper51.com

  内容来自论文无忧网 www.paper51.com 

NULL);

paper51.com

  
内容来自www.paper51.com
------分隔线----------------------------
联系方式