初学没多久,凑出来的一个好简单的抓包程序,
好心人帮忙给弄的能在窗口下运行啊?,
很简单的界面就行了~~ :)
在客户区能象命令行里那样显示.
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "mstcpip.h"#define MAX_BUF_LEN 65535
#define MAX_PROTO_LEN 16
#define MAX_ADDR_LEN 16
//#define DEFAULTPORT 2000typedef struct iphdr{
unsigned char h_lenver;  //版本号+头长度
unsigned char tos;   //服务类型
unsigned short t_len; //总长度,totoal_len
unsigned short iden;  //标识
unsigned short frag;  //偏移
unsigned char ttl;  //ttl
unsigned char proto;  //上层标识
unsigned short check;  //校验和
unsigned int sourip;   //源ip
unsigned int destip;   //目的ip
}IP_HEADER;typedef struct tcphdr{
unsigned short   sourport;
unsigned short  destport;
unsigned int seq_num;
unsigned int  ack_num;
unsigned char l_res;
unsigned short win;
unsigned short sum;
unsigned char flags;
unsigned short urg;
}TCP_HEADER;typedef struct udphdr{
unsigned short uh_sport;  
    unsigned short uh_dport;  
    unsigned short uh_len;   
    unsigned short uh_sum;   
}UDP_HEADER;
int iprotocal;
int iTTL;
char  szPortocal[MAX_PROTO_LEN];
char  szSourceip[MAX_ADDR_LEN];
char  szDestip[MAX_ADDR_LEN];
void decodeipack(char *,int); 
void decodetcpack(char *,int);
void decodeudpack(char *,int);void main(int argc,char *argv[])
{
char recvbuf[65535]={0};
WSADATA wsaData;
SOCKET sockRaw;


//struct sockaddr_in sa;
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
{
printf("can not start winsock\n");
return;
}

sockRaw=socket(AF_INET,SOCK_RAW,IPPROTO_IP);

char hostname[222];
hostent *pHostent;
struct sockaddr_in sa; //pHostent=(struct hostent*) malloc(sizeof(struct hostent));

if(gethostname(hostname,sizeof(hostname))!=0)
{
printf("gethostname() error:%u\n",WSAGetLastError());
return;
} pHostent=gethostbyname(hostname);
sa.sin_family=AF_INET;
sa.sin_port=htons(6000);
memcpy(&sa.sin_addr.S_un.S_addr, pHostent->h_addr_list[0], pHostent->h_length);
// free(pHostent); if(bind(sockRaw,(LPSOCKADDR)&sa,sizeof(sa))==SOCKET_ERROR)
{
printf("err in bind:%d\n",WSAGetLastError());
return;
} DWORD dwBufferLen[10] ;
DWORD dwBufferInLen = 1 ;
DWORD dwBytesReturned = 0 ;
WSAIoctl(sockRaw,SIO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),             
                        &dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL ); if( ! strcmp(argv[1],"start"))
{
while(1)
{
memset(recvbuf,0,sizeof(recvbuf));
        //printf("loading...\n");   int ret=recv(sockRaw,recvbuf,sizeof(recvbuf),0);
                  decodeipack(recvbuf,ret); // printf("%u\n",ret);
// IP_HEADER * ptr;
// ptr=(IP_HEADER *)recvbuf;
//  int iIphLen = sizeof(unsigned long) * (ptr->h_lenver & 0xf);
// for(int i=0;i<iIphLen;i++)
// {
// printf("%u",*ptr);
// }
// printf("\n");
}
}
}
void decodeipack(char * buf,int bufsize)
{
IP_HEADER * ipheader;
ipheader=(IP_HEADER *) buf;
struct sockaddr_in saSource, saDest; iprotocal=ipheader->proto;

saSource.sin_addr.s_addr=ipheader->sourip;
strncpy(szSourceip,inet_ntoa(saSource.sin_addr),MAX_ADDR_LEN); // printf("%s",szSourceip); saDest.sin_addr.s_addr=ipheader->destip;
strncpy(szDestip,inet_ntoa(saDest.sin_addr),MAX_ADDR_LEN); iTTL=ipheader->ttl; int hrd_len=sizeof(unsigned long)*(ipheader->h_lenver>>4); switch(iprotocal)
{
case IPPROTO_TCP:
decodetcpack(buf+hrd_len,bufsize);
//printf("tcp");
break;
case IPPROTO_UDP:
decodeudpack(buf+hrd_len,bufsize);
//printf("udp");
break;
case IPPROTO_ICMP:
printf("ICMP\n");
break;
}
}
void decodetcpack(char * buf,int bufsize)
{
TCP_HEADER *tcpheader;
tcpheader=(TCP_HEADER *) buf;

int sourcePort,destPort,hrd_len;
hrd_len=tcpheader->l_res>>4;
hrd_len*=sizeof(unsigned long); sourcePort=tcpheader->sourport;
destPort=tcpheader->destport;
//printf("loading...."); printf("tcp:%15s:%5d->%15s:%5d",szSourceip,sourcePort,szDestip,destPort);
printf("TTL=%3d\n",iTTL);
} void decodeudpack(char * buf,int bufsize)
{
UDP_HEADER *udpheader;
udpheader=(UDP_HEADER *) buf;

int sourceport,destport; sourceport=udpheader->uh_sport;
destport=udpheader->uh_dport; printf("udp:%15s:%5d->%15s:%5d\n",szSourceip,sourceport,szDestip,destport);
}//mstcpip.h
#if _MSC_VER > 1000
#pragma once
#endif
/* Argument structure for SIO_KEEPALIVE_VALS */
struct tcp_keepalive {
    u_long  onoff;
    u_long  keepalivetime;
    u_long  keepaliveinterval;
};
// New WSAIoctl Options
#define SIO_RCVALL            _WSAIOW(IOC_VENDOR,1)
#define SIO_RCVALL_MCAST      _WSAIOW(IOC_VENDOR,2)
#define SIO_RCVALL_IGMPMCAST  _WSAIOW(IOC_VENDOR,3)
#define SIO_KEEPALIVE_VALS    _WSAIOW(IOC_VENDOR,4)
#define SIO_ABSORB_RTRALERT   _WSAIOW(IOC_VENDOR,5)
#define SIO_UCAST_IF          _WSAIOW(IOC_VENDOR,6)
#define SIO_LIMIT_BROADCASTS  _WSAIOW(IOC_VENDOR,7)
#define SIO_INDEX_BIND        _WSAIOW(IOC_VENDOR,8)
#define SIO_INDEX_MCASTIF     _WSAIOW(IOC_VENDOR,9)
#define SIO_INDEX_ADD_MCAST   _WSAIOW(IOC_VENDOR,10)
#define SIO_INDEX_DEL_MCAST   _WSAIOW(IOC_VENDOR,11)