初学没多久,凑出来的一个好简单的抓包程序,
好心人帮忙给弄的能在窗口下运行啊?,
很简单的界面就行了~~ :)
在客户区能象命令行里那样显示.
#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)
解决方案 »
- 使用CreateThread创建线程正确关闭线程的方法应该在什么时候进行呢?
- 急!在线等。IE浏览器中无法正确使用自己做的ocx插件
- 请问如何用程序改变CBUTTON的字体
- 求助!!按钮问题
- 我调用一个dll时,用例子.c的加入工程可以编译,如果将例子.c的代码拷到CPP文件中编译不行,为什么?
- 删掉类中的一个函数,在classview里却看不到这个类了?为什么?怎么恢复?
- 简单问题:OnInitDialog这个函数是干吗用的
- 如何把定时器(SetTimer)和我算法里的时间变量联系起来?理不清,请给个思路
- 关于CreateWindow("EDIT"...)数据调用的问题
- RUNTIME_CLASS返回的指针为什么会变?
- 画出的窗口, 上面放出完全画出的button. 就是一个rect.
- 不知道网址秀(www.wzxiu.com)是怎么在windows2000的右键菜单中增加菜单项的?
把main的代码放到消息响应函数里面
其他的文件添加到project里
很简单的啊
用windows的api怎么写呢?