📄 scanhost.cpp
字号:
#include "scanhost.h"
WSADATA wsaData;
SOCKET sockRaw;
struct sockaddr_in dest,from,end;
int fromlen=sizeof(from);
char*recvbuf=new char[MAX_PING_PACKET_SIZE];
unsigned int addr=0;
long ThreadNumCounter=0,ThreadNumLimit=20;
long*aa=&ThreadNumCounter;
void main(int argc,char*argv[])
{
if(argc!=3)
{
cout<<"输入格式错误:scanhost start_ip end_ip"<<endl;
return;
}
if(WSAStartup(MAKEWORD(2,1),&wsaData)!=0)
{
cout<<"WSAStartup failed:"<<GetLastError()<<endl;
ExitProcess(STATUS_FAILED);
}
sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);
if(sockRaw==INVALID_SOCKET)
{
cout<<"WSASocket() failed:"<<WSAGetLastError()<<endl;
ExitProcess(STATUS_FAILED);
}
int timeout=1000;
int bread=setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout));
if(bread==SOCKET_ERROR)
{
cout<<"failed to set recv timeout:"<<WSAGetLastError()<<endl;
ExitProcess(STATUS_FAILED);
}
timeout=1000;
bread=setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout));
if(bread==SOCKET_ERROR)
{
cout<<"failed to set send timeout:"<<WSAGetLastError()<<endl;
ExitProcess(STATUS_FAILED);
}
memset(&dest,0,sizeof(dest));
unsigned long startIP,endIP;
dest.sin_family=AF_INET;
dest.sin_addr.s_addr=inet_addr(argv[1]);
startIP=inet_addr(argv[1]);
end.sin_family=AF_INET;
end.sin_addr.s_addr=inet_addr(argv[2]);
endIP=inet_addr(argv[2]);
HANDLE hThread;
while(htonl(startIP)<=htonl(endIP))
{
if(ThreadNumCounter>ThreadNumLimit)
{
Sleep(5000);
continue;
}
DWORD ThreadID;
sockaddr_in*pIPAddrTemp=new(sockaddr_in);
if(!pIPAddrTemp)
{
cout<<"memory alloc failed"<<endl;
return;
}
*pIPAddrTemp=dest;
clock_t start;
start=clock();
hThread=CreateThread(NULL,NULL,FindIP,(LPVOID)pIPAddrTemp,NULL,&ThreadID);
long i=60000000L;
while(i--)
;
TerminateThread(hThread,0);
InterlockedDecrement(aa);
memset(&from,0,sizeof(from));
startIP=htonl(htonl(startIP)+1);
dest.sin_addr.s_addr=startIP;
}
while(ThreadNumCounter!=0)
{
Sleep(2000);
return;
}
}
void fill_icmp_data(char*icmp_data,int datasize)
{
IcmpHeader*icmp_hdr;
char*datapart;
icmp_hdr=(IcmpHeader*)icmp_data;
icmp_hdr->type=ICMP_ECHO;
icmp_hdr->id=(USHORT)GetCurrentThreadId();
datapart=icmp_data+sizeof(IcmpHeader);
memset(datapart,'A',datasize-sizeof(IcmpHeader));
}
void decode_resp(char*buf,int bytes,struct sockaddr_in* from)
{
IpHeader*iphdr;
IcmpHeader*icmphdr;
unsigned short iphdrlen;
iphdr=(IpHeader*)buf;
iphdrlen=iphdr->headlen*4;
icmphdr=(IcmpHeader*)(buf+iphdrlen);
if(bytes<iphdrlen+ICMP_MIN) return;
if(icmphdr->type!=ICMP_ECHO_REPLY) return;
if(icmphdr->id!=(USHORT)GetCurrentThreadId()) return;
cout<<"活动主机:"<<inet_ntoa(from->sin_addr)<<endl;
}
USHORT checksum(USHORT*buffer,int size)
{
unsigned long cksum=0;
while(size>1)
{
cksum+=*buffer++;
size-=sizeof(USHORT);
}
if(size)
{
cksum+=*(UCHAR*)buffer;
}
cksum=(cksum>>16)+(cksum&0xffff);
cksum+=(cksum>>16);
return(USHORT)(~cksum);
}
DWORD WINAPI FindIP(LPVOID pIPAddrTemp)
{
InterlockedIncrement(aa);
char icmp_data[MAX_PACKET];
int datasize=DEF_PACKET_SIZE;
datasize+=sizeof(IcmpHeader);
fill_icmp_data(icmp_data,datasize);
((IcmpHeader*)icmp_data)->checksum=0;
((IcmpHeader*)icmp_data)->seq=0;
((IcmpHeader*)icmp_data)->checksum=checksum((USHORT*)icmp_data,datasize);
int bwrote=sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)pIPAddrTemp,sizeof(dest));
int n=0;
if(bwrote==SOCKET_ERROR)
{
if(bwrote==SOCKET_ERROR)
{
cout<<"timed out"<<endl;
}
cout<<"sendto failed:"<<WSAGetLastError()<<endl;
ExitProcess(STATUS_FAILED);
n=1;
}
if(WSAGetLastError()==WSAETIMEDOUT)
{
cout<<"timed out"<<endl;
ExitProcess(STATUS_FAILED);
n=1;
}
if(bwrote<datasize)
{
cout<<"wrote"<<bwrote<<"bytes"<<endl;
ExitProcess(STATUS_FAILED);
n=1;
}
int bread=recvfrom(sockRaw,recvbuf,MAX_PING_PACKET_SIZE,0,(struct sockaddr*)&from,&fromlen);
if(bread==SOCKET_ERROR)
{
if(WSAGetLastError()==WSAETIMEDOUT)
{
cout<<"timed out"<<endl;
}
cout<<"recvfrom failed:"<<WSAGetLastError()<<endl;
ExitProcess(STATUS_FAILED);
n=1;
}
if(n==0)
decode_resp(recvbuf,bread,&from);
InterlockedDecrement(aa);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -