文章作者:netxfly [E.S.T]
信息来源:邪恶八进制安全小组(
www.eviloctal.com)
复制内容到剪贴板
代码:
//
//header.h
//IP,TCP和UDP数据报报头定义
//
#define MAX_PACK_LEN 65535 //接收的最大IP报文
#define MAX_ADDR_LEN 16 //点分十进制地址的最大长度
#define MAX_HOSTNAME_LEN 255 //最大主机名长度
#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
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首部
{
unsigned short th_sport; //16位源端口
unsigned short th_dport; //16位目的端口
unsigned int th_seq; //32位序列号
unsigned int th_ack; //32位确认号
unsigned char th_lenres; //4位首部长度/6位保留字
unsigned char th_flag; //6位标志位
unsigned short th_win; //16位窗口大小
unsigned short th_sum; //16位校验和
unsigned short th_urp; //16位紧急数据偏移量
}TCP_HEADER;
typedef struct _udphdr //定义UDP首部
{
unsigned short uh_sport; //16位源端口
unsigned short uh_dport; //16位目的端口
unsigned short uh_len; //16位长度
unsigned short uh_sum; //16位校验和
}UDP_HEADER; 复制内容到剪贴板
代码:
//
//实现文件Netxsniffer.cpp
//
#include "header.h"
#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#include "ws2tcpip.h"
#pragma comment(lib,"ws2_32.lib")
void usage(char *); //使用说明函数
void sniffer(void); //开始监听函数
void decodeip(char *); //IP解包函数
void decodetcp(char *); //TCP解包函数
void decodeudp(char *); //UDP解包函数
char *getproto(int); //协议判断函数
//
//主函数
//
int main(int argc,char *argv[])
{
if(argc==2)
{
if(strcmp(argv[1],"-s")==0)
{
sniffer();
}
}
else
{
usage(argv[0]);
}
return 0;
}
//
//帮助函数
//
void usage(char *help)
{ system("color 0a");
printf("================================================================\n");
printf("Netxsniffer ver 0.1 by netxfly 2005-3-4\n");
printf("Used to find hide friend'IP on QQ\n");
printf("USAGE:\n");
printf("%s -s\t\t\tStart to sniffer\n",help);
printf("%s -s >netxfly.log\tInsert result to file netxfly.log\n",help);
printf("Note: \nIt only can run at win200/XP/2003,Can't on win95/98\n");
printf("Press CTRL + C to quit\n");
printf("================================================================\n");
}
//
//监听函数
//
void sniffer(void)
{
WSADATA wsa;
SOCKET netxsniffer;
int err;
char buffer[MAX_PACK_LEN];
char localname[MAX_HOSTNAME_LEN];
struct hostent *phostent;
struct sockaddr_in sniffer;
DWORD dwBufferLen[10] ;
DWORD dwBufferInLen = 1 ;
DWORD dwBytesReturned = 0 ;
//printf("Protocol |Source Address |Dest Address |Srcport |Destport\n");
printf("协议 |远端地址| |本地地址| |来源端口| |目的端口|\n");
system("color 0a");
if(WSAStartup(MAKEWORD(2,2),&wsa)!=0)
{
printf("Init Socket Error...\n");
exit(0);
}
if((netxsniffer = socket(AF_INET,SOCK_RAW,IPPROTO_IP))==INVALID_SOCKET)
{
printf("Create Raw socket Error...\n");
exit(0);
}
gethostname(localname,MAX_HOSTNAME_LEN);
phostent = gethostbyname(localname);
sniffer.sin_family=AF_INET;
sniffer.sin_port=htons(60000);
memcpy(&sniffer.sin_addr.S_un.S_addr, phostent->h_addr_list[0], phostent->h_length);
err=bind(netxsniffer,(PSOCKADDR)&sniffer,sizeof(sniffer));
if(err==SOCKET_ERROR)
{
printf("Bind Local ADDR Error..\n");
exit(0);
}
WSAIoctl(netxsniffer, SIO_RCVALL,&dwBufferInLen, sizeof(dwBufferInLen),&dwBufferLen, sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL );
while(1)
{
memset(buffer , 0 , sizeof(buffer) );
err = recv(netxsniffer , buffer , sizeof(buffer) , 0 );
if(err <= 0)
{
continue;
}
else
{
decodeip( buffer);
}
}
}
//
//IP解包函数
//
void decodeip(char *ipbuf)
{
IP_HEADER *pip;
char *protocol;
SOCKADDR_IN addr;
pip=(IP_HEADER *)ipbuf;
protocol=getproto(pip->proto);
printf("%s ",protocol);
addr.sin_addr.s_addr = pip->sourceIP;
printf("%s-->",inet_ntoa(addr.sin_addr));
addr.sin_addr.s_addr = pip->destIP;
printf("%s ",inet_ntoa(addr.sin_addr));
switch(pip->proto)
{
case 6:
decodetcp(ipbuf+sizeof(IP_HEADER));
break;
case 17:
decodeudp(ipbuf+sizeof(IP_HEADER));
break;
default:
putchar('\n');
}
}
//
// DecodeTCP function
//
void decodetcp(char *tcpbuf)
{
TCP_HEADER *ptcp;
ptcp=(TCP_HEADER *)tcpbuf;
printf("%8d -->%8d",ntohs(ptcp->th_sport),ntohs(ptcp->th_dport));
putchar('\n');
}
//
// DecodeUDP function
//
void decodeudp(char *udpbuf)
{
UDP_HEADER *pudp;
pudp=(UDP_HEADER *)udpbuf;
printf("%8d -->%8d",ntohs(pudp->uh_sport),ntohs(pudp->uh_dport));
putchar('\n');
}
//
// Get type of protocol
//
char *getproto(int proto)
{
switch(proto)
{
case 6:
return "TCP";
break;
case 17:
return "UDP";
break;
default:
return "Other";
}
}