18,363
社区成员




#include <iostream>
using namespace std;
#include <pcap/pcap.h>
#pragma comment(lib,"wpcap.lib")
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#include "raw.h"
#define MSG_MAXLEN 60
PIPV4_HDR pPIPV4_HDR;
PTCP_HDR ptcphdr;
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);
char *srcip = "10.104.165.211";
char *destip = "10.104.165.90";
int main(int argc,char *args[])
{
// char *method = args[1];
// char *ip = args[2];
// char *port = args[3];
char *method = "syn";
int port = atoi("445");
int status = 0;
cout<<"Target IP:"<<destip<<"\t Target Port:"<<port<<endl;
if(strcmp(method,"tcp")==0)
{
cout<<"tcp connect scanning"<<endl;
status = tcp_scan(destip,port);
}
else if(strcmp(method,"syn")==0)
{
cout<<"syn connect scanning"<<endl;
status = syn_scan(destip,port);
//help();
}
else cout<<"not defined scan"<<endl;
switch(status)
{
case 0: cout<<"closed"<<endl;break;
case 1: cout<<destip<<":"<<port<<"\t open"<<endl;break;
case 2: cout<<destip<<":"<<port<<"\t closed"<<endl;break;
case 3: cout<<"connect error"<<endl;break;
}
system("pause");
return 0;
}
int syn_scan(const char * destIp,int destPort)
{
pcap_if_t *alldevs;
char errbuf[PCAP_ERRBUF_SIZE] = {};
if(-1 == pcap_findalldevs(&alldevs,errbuf))
{
cout<<"Get dev list error"<<endl;
return -1;
}
int devNum=0,inTerfaceNum=0,i=0;
for(pcap_if_t *d = alldevs;NULL != d;d = d->next)
{
cout<<d->description<<endl;
devNum++;
}
printf("Enter the interface number (1-%d):",devNum);
scanf("%d", &inTerfaceNum);
if(inTerfaceNum < 1 || inTerfaceNum > devNum)
{
printf("\nInterface number out of range.\n");
/* Free the device list */
pcap_freealldevs(alldevs);
return -1;
}
pcap_if_t *d;
/* Jump to the selected adapter */
for(d=alldevs, i=0; i< inTerfaceNum-1; d=d->next, i++);
/**
*打开选择的interface
*/
pcap_t *pt = pcap_open_live(d->name,65536,false,20,errbuf);
if(NULL == pt)
{
cout<<"Open dev error"<<endl;
return -1;
}
UCHAR SendMsg[MSG_MAXLEN] = {0};
//for(int i=180;i<200;i++)
//{
/*设置数据帧结构*/
PETHER_HDR pethhdr = (PETHER_HDR)SendMsg;
pethhdr->dest[0] = 0x00;
pethhdr->dest[1] = 0x23;
pethhdr->dest[2] = 0x89;
pethhdr->dest[3] = 0x42;
pethhdr->dest[4] = 0x7F;
pethhdr->dest[5] = 0x00;
pethhdr->source[0] = 0x00;
pethhdr->source[1] = 0x26;
pethhdr->source[2] = 0x9E;
pethhdr->source[3] = 0x32;
pethhdr->source[4] = 0x4E;
pethhdr->source[5] = 0x4B;
pethhdr->type = htons(0x0800);
/*IP header*/
pPIPV4_HDR = (PIPV4_HDR)(SendMsg + sizeof(ETHER_HDR));
pPIPV4_HDR->ip_version = 4;
pPIPV4_HDR->ip_header_len = 5; //In double words thats 4 bytes
pPIPV4_HDR->ip_tos = 0;
pPIPV4_HDR->ip_total_length = htons (sizeof(SendMsg)-sizeof(ETHER_HDR));
//pPIPV4_HDR->ip_id = htons(2);
pPIPV4_HDR->ip_frag_offset = 0;
pPIPV4_HDR->ip_reserved_zero=0;
pPIPV4_HDR->ip_dont_fragment=1;
pPIPV4_HDR->ip_more_fragment=0;
pPIPV4_HDR->ip_frag_offset1 = 0;
pPIPV4_HDR->ip_ttl = 128;
pPIPV4_HDR->ip_protocol = IPPROTO_TCP;
pPIPV4_HDR->ip_srcaddr = inet_addr(srcip); //inet_addr("76.18.55.205");
pPIPV4_HDR->ip_destaddr = inet_addr(destIp);
pPIPV4_HDR->ip_checksum =0;
pPIPV4_HDR->ip_checksum = in_checksum((USHORT*)(SendMsg+sizeof(ETHER_HDR)),sizeof(IPV4_HDR));
/*TCP header*/
ptcphdr = (PTCP_HDR)(SendMsg + sizeof(ETHER_HDR) + sizeof(IPV4_HDR));
ptcphdr->source_port = htons(8000+i);
ptcphdr->dest_port = htons(destPort);
ptcphdr->sequence = htons(i++) ;
ptcphdr->acknowledge=0;
ptcphdr->reserved_part1=0;
ptcphdr->data_offset=3;
ptcphdr->fin=0;
ptcphdr->syn=1;
ptcphdr->rst=0;
ptcphdr->psh=0;
ptcphdr->ack=0;
ptcphdr->urg=0;
ptcphdr->ecn=0;
ptcphdr->cwr=0;
ptcphdr->window = htons(64240);
ptcphdr->checksum=0;
ptcphdr->urgent_pointer = 0;
UCHAR *tmpbuf = new UCHAR[sizeof(SendMsg) - sizeof(ETHER_HDR) - sizeof(IPV4_HDR) + sizeof(P_HDR)];
memset(tmpbuf,0,sizeof(TCP_HDR)+sizeof(P_HDR));
PPSEUDO_HDR ppsdhdr = (PPSEUDO_HDR)tmpbuf;
ppsdhdr->source_address = pPIPV4_HDR->ip_srcaddr;
ppsdhdr->dest_address = pPIPV4_HDR->ip_destaddr;
ppsdhdr->placeholder = 0;
ppsdhdr->protocol = IPPROTO_TCP;
ppsdhdr->tcp_length = htons(sizeof(SendMsg) - sizeof(ETHER_HDR) - sizeof(IPV4_HDR));
//将tcp拷贝进tempbuf
memcpy(tmpbuf+sizeof(P_HDR),SendMsg+sizeof(ETHER_HDR)+sizeof(IPV4_HDR),sizeof(SendMsg) - sizeof(ETHER_HDR) - sizeof(IPV4_HDR));
ptcphdr->checksum = in_checksum((USHORT*)tmpbuf,sizeof(tmpbuf));
cout<<"send"<<endl;
pcap_sendpacket(pt,SendMsg,sizeof(SendMsg));
//}
/* 释放设备列表 */
pcap_freealldevs(alldevs);
pcap_loop(pt, 0, packet_handler, NULL);
cout<<"senoff"<<endl;
system("pause");
return 0;
}
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
struct tm *ltime;
char timestr[16];
PIPV4_HDR tempIPHeader = (PIPV4_HDR)pkt_data;
if(tempIPHeader->ip_srcaddr == pPIPV4_HDR->ip_destaddr)
{
PTCP_HDR tempTCPHeader = (PTCP_HDR)(pkt_data+sizeof(IPV4_HDR));
if(tempTCPHeader->source_port == ptcphdr->dest_port)
{
time_t local_tv_sec;
/* 将时间戳转换成可识别的格式 */
local_tv_sec = header->ts.tv_sec;
ltime=localtime(&local_tv_sec);
strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);
printf("%s,%.6d len:%d\n", timestr, header->ts.tv_usec, header->len);
}
}
}
unsigned short in_checksum(unsigned short *ptr,int nbytes)
{
register long sum;
unsigned short oddbyte;
register short answer;
sum=0;
while(nbytes>1) {
sum+=*ptr++;
nbytes-=2;
}
if(nbytes==1) {
oddbyte=0;
*((u_char*)&oddbyte)=*(u_char*)ptr;
sum+=oddbyte;
}
sum = (sum>>16)+(sum & 0xffff);
sum = sum + (sum>>16);
answer=(SHORT)~sum;
return(answer);
}