📄 pings.cpp
字号:
#include <iostream.h>
#include <winsock2.h>
#include <windows.h>
#include <mstcpip.h>
#pragma link "ws2_32.lib"
typedef struct iphdr
{
unsigned char h_lenver;
unsigned char tos;
unsigned short total_len;
unsigned short ident;
unsigned short frag_and_flags;
unsigned char ttl;
unsigned char proto;
unsigned short cksum;
unsigned int sourceip;
unsigned int destip;
} iphdr;
typedef struct icmphdr
{
unsigned char i_type;
unsigned char i_code;
unsigned short i_cksum;
unsigned short i_id;
unsigned short i_seq;
} icmphdr;
int scanip, startip, stopip, socksend, stopthread;
struct sockaddr_in sin;
/* */
unsigned short checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while(size > 0)
{
cksum+=*buffer++;
size-=sizeof(USHORT);
}
if(size)
{
cksum+=*(UCHAR *)buffer;
}
cksum=(cksum >> 16) + (cksum & 0xffff);
cksum+=(cksum >> 16);
return(USHORT) (~cksum);
}
/* */
void start(void)
{
cout << "\t\t-------------------------------------------\n";
cout << "\t\t || || \n";
cout << "\t\t || Ping Sweep || \n";
cout << "\t\t || || \n";
cout << "\t\t || Author:TOo2y SafeChina || \n";
cout << "\t\t || || \n";
cout << "\t\t-------------------------------------------\n";
cout << endl;
}
/* */
void usage(void)
{
cout << "Usage: Ping < ip | startip endip >" << endl;
}
/* */
void recv_packet(void *arg)
{
int socksniffer;
struct sockaddr_in from;
int packsize;
char buffer[1500]={ 0 };
char local[250]={ 0 };
struct hostent *hp;
icmphdr *icmpheader;
iphdr *ipheader;
if((socksniffer=WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)
{
cout << "WSASocket Error!" << endl;
return;
}
memset(&sin, 0, sizeof(sin));
gethostname(local, sizeof(local));
hp=gethostbyname(local);
sin.sin_addr=*(in_addr *)hp->h_addr_list[0];
sin.sin_family=AF_INET;
sin.sin_port=htons(11282);
if(bind(socksniffer, (struct sockaddr *) &sin, sizeof(sin)) == SOCKET_ERROR)
{
cout << "Bind Error!" << endl;
return;
}
icmpheader= (struct icmphdr *)(buffer + sizeof(iphdr));
ipheader= (struct iphdr *)(buffer);
while(!stopthread)
{
packsize=recv(socksniffer, buffer, sizeof(buffer), 0);
if(packsize == SOCKET_ERROR || packsize < 0)
{
cout << "Receive Error: " << GetLastError() << endl;
return;
}
if((icmpheader->i_id == GetCurrentProcessId()) && (ipheader->destip == sin.sin_addr.S_un.S_addr))
{
from.sin_addr.S_un.S_addr=ipheader->sourceip;
cout << "[Host:] " << inet_ntoa(from.sin_addr) << "\t[Status:] alive " << endl;
}
}
}
/* */
void send_packet(void)
{
char sendbuf[20];
icmphdr icmpheader;
struct sockaddr_in dest;
icmpheader.i_cksum=0;
icmpheader.i_code=0;
icmpheader.i_type=8;
icmpheader.i_seq=0;
icmpheader.i_id=(USHORT) GetCurrentProcessId();
icmpheader.i_cksum=checksum((USHORT *) &icmpheader, sizeof(icmpheader));
memset(sendbuf, 0, sizeof(sendbuf));
memcpy(sendbuf, &icmpheader, sizeof(icmpheader));
dest.sin_addr.S_un.S_addr=htonl(scanip);
dest.sin_family=AF_INET;
sendto(socksend, sendbuf, sizeof(sendbuf), 0, (struct sockaddr *) &dest, sizeof(dest));
}
/* */
int main(int argc, char *argv[])
{
WSADATA wsa;
HANDLE hThread;
start();
if(argc != 3)
{
usage();
return -1;
}
startip=ntohl(inet_addr(argv[1]));
stopip=ntohl(inet_addr(argv[2]));
stopthread=0;
WSAStartup(MAKEWORD(2, 2), &wsa);
socksend=WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, WSA_FLAG_OVERLAPPED);
cout << "Waiting..." << endl;
hThread=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) recv_packet, NULL, 0, NULL);
Sleep(2000);
for(scanip=startip; scanip <= stopip; scanip++)
{
send_packet();
Sleep(10);
}
Sleep(10000);
stopthread=1;
if(WaitForSingleObject(hThread, 1000) == WAIT_TIMEOUT)
{
TerminateThread(hThread, 0);
}
CloseHandle(hThread);
WSACleanup();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -