当前位置:早雪网网络学院编程文档其他语言 → 两个半连接扫描程序源代码

两个半连接扫描程序源代码

减小字体 增大字体 作者:未知  来源:supcode.com收集整理  发布时间:2005-7-1 14:59:03
ader.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;
}

//SINFFER函数
int recv_packet()
{
    SOCKET          sock;
    SOCKADDR_IN     sniff;
    char            recvBuffer[65000] = {0};//缓冲区存放捕获的数据

    //建立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(srcIP);

    //绑定到本地随机端口
    bind(sock,(PSOCKADDR)&sniff,sizeof(sniff));

    //设置SOCK_RAW为SIO_RCVALL,以便接收所有的IP包
    //copy来的
    DWORD dwBufferLen[10] ;
    DWORD dwBufferInLen = 1 ;
    DWORD dwBytesReturned = 0 ;
    WSAIoctl(sock,SIO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL);

    while(1)
    {
        memset(recvBuffer , 0 , sizeof(recvBuffer) );

        //开始捕获数据包
        int bytesRecived = recv(sock,recvBuffer,sizeof(recvBuffer),0);
        if(bytesRecived <= 0)
        {
            break;
        }
        check_port(recvBuffer); //调用解包函数
    }
    return 1;
}

//解包函数
void check_port(char *buffer)
{
    IP_HEADER        *ipHeader;//IP_HEADER型指针
    TCP_HEADER       *tcpHeader;//TCP_HEADER型指针

    ipHeader = (IP_HEADER *)buffer;
    tcpHeader = (TCP_HEADER *) (buffer+sizeof(IP_HEADER));

    if(ipHeader->sourceIP != inet_addr(tgtIP))
    {
        return;
    }

    for(int tmp=0;tmp<20;tmp++)
    {
        //SYN+ACK -> 2+16=18(也是推测,哈哈)
        if(tcpHeader->th_flag == 18 && tcpHeader->th_sport == htons(ports[tmp]))
        {
            printf("[Found]\t%s\tport\t%d\tOpen\n",tgtIP,ports[tmp]);
        }
    }
}


//--------------------------------------------------------
//计算检验和函数,完全抄别人的
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);
}

第二个:

//半打开扫描源程序(for WIN2K)
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include "mstcpip.h"
#pragma comment(lib,"ws2_32")

#define DEFAULT_DEST_PORT 5
#define DEST_HOST "www.hrbust.edu.cn"
#define SEQ 0x28376839

typedef struct _iphdr
{
unsigned char h_lenver; //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 _tcphdr //定义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;

struct //定义TCP伪首部
{
unsigned long saddr; //源地址
unsigned long daddr; //目的地址
char mbz;
char ptcl; //协议类型
unsigned short tcpl; //TCP长度
}psd_header;

SOCKET sockRaw = INVALID_SOCKET,
sockListen = INVALID_SOCKET;
struct sockaddr_in dest;

//SOCK错误处理程序
void CheckSockError(int iErrorCode, char *pErrorMsg)
{
if(iErrorCode==SOCKET_ERROR) 
{
printf("%s Error:%d\n", pErrorMsg, GetLastError());
closesocket(sockRaw);
ExitProcess(-1);
}

}

//计算检验和
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);
}

//IP解包程序
bool DecodeIPHeader(char *buf, int bytes)
{
IP_HEADER *iphdr;
TCP_HEADER *tcphdr;
  unsigned short iphdrlen;

  iphdr = (IP_HEADER *)buf;
  iphdrlen = sizeof(unsigned long) * (iphdr->h_lenver & 0xf);
  tcphdr = (TCP_HEADER*)(buf + iphdrlen);

//是否来自目标IP
if(iphdr->sourceIP != dest.sin_addr.s_addr) return false;

//序列号是否正确
if((ntohl(tcphdr->th_ack) != (SEQ+1)) && (ntohl(tcphdr->th_ack) != SEQ)) return false;

//RST/ACK - 无服务
if(tcphdr->th_flag == 20)
{
printf(".\n");
return true;
}

//SYN/ACK - 扫描到一个端口
if(tcphdr ->th_flag == 18)
{
printf("%d

上一页  [1] [2] [3]  下一页


Tags:连接,扫描,程序,源代码
[数据载入中...] [返回上一页] [打 印]