?? thread.cpp
字號:
#include "stdafx.h"
#include "PortScaner.h"
#include "PortScanerDlg.h"
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib,"ws2_32.lib")
#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
#define srcPort 88
unsigned short checksum(USHORT *buffer, int size) ;
int send_packet(in_addr tgtIP,in_addr sourceIP,int port) ;
UINT SendThread(LPVOID pParam);
typedef struct ip_hdr
{
unsigned char h_verlen; //4位首部長度,4位IP版本號
unsigned char tos; //8位服務類型TOS
unsigned short total_len; //16位總長度(字節)
unsigned short ident; //16位標識
unsigned short frag_and_flags; //3位標志位
unsigned char ttl; //8位生存時間 TTL
unsigned char proto; //8位協議 (TCP, UDP 或其他)
unsigned short checksum; //16位IP首部校驗和
unsigned int sourceIP; //32位源IP地址
unsigned int destIP; //32位目的IP地址
}IP_HEADER;
typedef struct tcp_hdr //定義TCP首部
{
USHORT th_sport; //16位源端口
USHORT th_dport; //16位目的端口
unsigned int th_seq; //32位序列號
unsigned int th_ack; //32位確認號
unsigned char th_lenres; //4位首部長度/6位保留字
unsigned char th_flag; //6位標志位
USHORT th_win; //16位窗口大小
USHORT th_sum; //16位校驗和
USHORT th_urp; //16位緊急數據偏移量
}TCP_HEADER;
typedef struct tsd_hdr //定義TCP偽首部
{
unsigned long saddr; //源地址
unsigned long daddr; //目的地址
char mbz;
char ptcl; //協議類型
unsigned short tcpl; //TCP長度
}PSD_HEADER;
UINT SendThread(LPVOID pParam)
{
CPortScanerDlg* pDlg;
pDlg=(CPortScanerDlg* )::AfxGetApp()->GetMainWnd();
int nIP= (pDlg->IP[6]-pDlg->IP[2])*254 + (pDlg->IP[7]-pDlg->IP[3]) + 1;
char hostname[100],hostip[100],destip[100];
struct hostent* phe;
in_addr host,dest;
gethostname(hostname,128);//獲取本機主機名
phe = gethostbyname(hostname);//獲取本機ip地址結構
if(phe == NULL)
{
pDlg->SendOver();
return 1;
}
strcpy(hostip, inet_ntoa(*((struct in_addr*)phe->h_addr_list[0])));//得到本機ip地址
host.S_un.S_addr=inet_addr(hostip);
sprintf(destip,"%d.%d.%d.%d",pDlg->IP[0],pDlg->IP[1],pDlg->IP[2],pDlg->IP[3]);
dest.S_un.S_addr=inet_addr(destip);
Sleep(1000); //wait for RecvThread
CString msg;
for(int i=0;i<nIP;i++)
{
for(int j=0;j<pDlg->nPort;j++)
{
msg.Format("Scaning %d.%d.%d.%d port :%d ...",
dest.S_un.S_un_b.s_b1,dest.S_un.S_un_b.s_b2,dest.S_un.S_un_b.s_b3,dest.S_un.S_un_b.s_b4,
pDlg->portlist[j]);
pDlg->SetWindowText(msg);
send_packet(dest,host,pDlg->portlist[j]);
Sleep(speed);
}
dest.S_un.S_un_b.s_b4++;
if(dest.S_un.S_un_b.s_b4==255)
{
dest.S_un.S_un_b.s_b3++;
dest.S_un.S_un_b.s_b4=1;
}
if(dest.S_un.S_un_b.s_b3==255)
{
dest.S_un.S_un_b.s_b2++;
dest.S_un.S_un_b.s_b3=1;
}
if(dest.S_un.S_un_b.s_b2==255)
{
dest.S_un.S_un_b.s_b1++;
dest.S_un.S_un_b.s_b2=1;
}
}
pDlg->SetWindowText("Scan Finish,Wait ...");
pDlg->SendOver();
return 0;
}
int send_packet(in_addr tgtIP,in_addr sourceIP,int port)
{
SOCKET sendSocket;
BOOL flag;
int timeout;
SOCKADDR_IN sin;
IP_HEADER ipHeader;
TCP_HEADER tcpHeader;
PSD_HEADER psdHeader;
char szSendBuf[60] = {0}; //發送包的緩沖區
int ret;
unsigned long source_ip;
unsigned long target_ip;
//建立原始數據socket
if((sendSocket = WSASocket(AF_INET, SOCK_RAW, IPPROTO_RAW, NULL, 0, WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)
{
return 0;
}
//設置自己填充數據包
if(setsockopt(sendSocket, IPPROTO_IP, IP_HDRINCL, (char *)&flag, sizeof(flag)) == SOCKET_ERROR)
{
return 0;
}
//設置超時時間
timeout = 1000;
if(setsockopt(sendSocket, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) == SOCKET_ERROR)
{
return 0;
}
target_ip = tgtIP.S_un.S_addr;
source_ip = sourceIP.S_un.S_addr;
sin.sin_family = AF_INET;
sin.sin_port = htons(port);
sin.sin_addr.S_un.S_addr = target_ip;
//填充IP首部
ipHeader.h_verlen = (4<<4 | sizeof(ipHeader)/sizeof(unsigned long));
ipHeader.total_len = htons(sizeof(ipHeader)+sizeof(tcpHeader));
ipHeader.ident = 1;
ipHeader.frag_and_flags = 0x40;
ipHeader.ttl = 128;
ipHeader.proto = IPPROTO_TCP;
ipHeader.checksum = 0;
ipHeader.sourceIP = source_ip;//源IP
ipHeader.destIP = target_ip; //目的IP
//填充TCP首部
tcpHeader.th_dport = htons(port);//目的端口
tcpHeader.th_sport = htons(srcPort); //源端口
tcpHeader.th_seq = 0x12345678;
tcpHeader.th_ack = 0;
tcpHeader.th_lenres = (sizeof(tcpHeader)/4<<4|0);
tcpHeader.th_flag = 2;//syn標志位。0,2,4,8,16,32->FIN,SYN,RST,PSH,ACK,URG(推測,哈哈)
tcpHeader.th_win = htons(512);
tcpHeader.th_urp = 0;
tcpHeader.th_sum = 0;
//填充tcp偽首部
psdHeader.saddr = ipHeader.sourceIP;
psdHeader.daddr = ipHeader.destIP;
psdHeader.mbz = 0;
psdHeader.ptcl = IPPROTO_TCP;
psdHeader.tcpl = htons(sizeof(tcpHeader));
//計算TCP校驗和
memcpy(szSendBuf, &psdHeader, sizeof(psdHeader));
memcpy(szSendBuf + sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader));
tcpHeader.th_sum = checksum((USHORT *)szSendBuf, sizeof(psdHeader) + sizeof(tcpHeader));
//計算IP檢驗和
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf + sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
memset(szSendBuf + sizeof(ipHeader) + sizeof(tcpHeader), 0, 4);
ipHeader.checksum = checksum((USHORT *)szSendBuf, sizeof(ipHeader) + sizeof(tcpHeader));
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf + sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
//發送數據包
ret = sendto(sendSocket, szSendBuf, sizeof(ipHeader) + sizeof(tcpHeader), 0, (struct sockaddr*)&sin, sizeof(sin));
if(ret == SOCKET_ERROR)
{
// printf("Send Packet Error...\n");
return 0;
}
else return 1;
}
unsigned short 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 (unsigned short)(~cksum);
}
UINT RecvThread(LPVOID pParam)
{
SOCKET sock;
SOCKADDR_IN sniff;
char recvBuffer[65000] = {0};//緩沖區存放捕獲的數據
CPortScanerDlg* pDlg;
pDlg=(CPortScanerDlg* )::AfxGetApp()->GetMainWnd();
char hostname[100],hostip[100];
struct hostent* phe;
// in_addr host,dest;
gethostname(hostname,128);//獲取本機主機名
phe = gethostbyname(hostname);//獲取本機ip地址結構
if(phe == NULL)
{
return 1;
}
strcpy(hostip, inet_ntoa(*((struct in_addr*)phe->h_addr_list[0])));//得到本機ip地址
//建立socket監聽數據包
sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);
sniff.sin_family = AF_INET;
sniff.sin_port = htons(0);
sniff.sin_addr.s_addr = inet_addr(hostip);
//綁定到本地隨機端口
bind(sock,(PSOCKADDR)&sniff,sizeof(sniff));
//設置SOCK_RAW為SIO_RCVALL,以便接收所有的IP包
DWORD dwBufferLen[10] ;
DWORD dwBufferInLen = 1 ;
DWORD dwBytesReturned = 0 ;
WSAIoctl(sock,SIO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL);
IP_HEADER *ipHeader; //IP_HEADER型指針
TCP_HEADER *tcpHeader; //TCP_HEADER型指針
struct in_addr in;
while(1)
{
memset(recvBuffer , 0 , sizeof(recvBuffer) );
//開始捕獲數據包
int bytesRecived = recv(sock,recvBuffer,sizeof(recvBuffer),0);
if(bytesRecived < 0)
{
break;
}
ipHeader = (IP_HEADER *) recvBuffer;
tcpHeader= (TCP_HEADER *) (recvBuffer+sizeof(IP_HEADER));
in.S_un.S_addr=ipHeader->sourceIP;
if(tcpHeader->th_flag == 18)// && tcpHeader->th_sport == htons(info.port))
{
//inet_ntoa(in),ntohs(tcpHeader->th_sport)
pDlg->AddPort(in,ntohs(tcpHeader->th_sport));
}
}
return 1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -