用C++Builder6能否编出抓取通过本机网卡数据包的程序

jandger 2005-04-30 10:02:41
各位仁兄!小弟刚刚接触C++Builder不久,道行尚浅。
希望哪位高手大虾能够告诉小弟,用C++Builder6能否编出抓取通过本机网卡数据包的程序,如果能都需要哪些控件,如何设置控件的属性和事件,如果编写代码复杂请提示小弟关键代码。
小弟的请求希望各位仁兄大力帮助,小弟将不胜感激。
...全文
415 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
jandger 2005-05-16
  • 打赏
  • 举报
回复
感谢MEFULEU仁兄的大力帮助,小弟受益非浅,今敬上100分,表示谢意!
感谢!!感谢!!感谢!!
dargons 2005-05-13
  • 打赏
  • 举报
回复
以前我也做了个嗅探器,但在显示数据包的内容时好象老是出错,与包的大小也不匹配.

要想直接显示数据包中的内容有什么好的方法吗?

我是直接在后面显示的.
lengda 2005-05-13
  • 打赏
  • 举报
回复
学习中。。。
cb2005 2005-05-13
  • 打赏
  • 举报
回复
做个记号结贴时收藏
MEFULEU 2005-05-13
  • 打赏
  • 举报
回复
要显示包的内容必须进行解码:
MEFULEU 2005-05-13
  • 打赏
  • 举报
回复
要显示包的内容必须进行解码:
MEFULEU 2005-05-13
  • 打赏
  • 举报
回复
要源码的朋友到这里来下吧;

我也只是更改自别的版本;其中的很多东西我也不是很明白;

http://www.h2e.com.cn/images/BCBipmon.rar
ahua_liu 2005-05-13
  • 打赏
  • 举报
回复
结帖时收藏
MEFULEU 2005-05-13
  • 打赏
  • 举报
回复
typedef struct _tcphdr{ //定义TCP首部
WORD TCP_Sport ; //16位源端口
WORD TCP_Dport ; //16位目的端口
DWORD th_seq ; //32位序列号
DWORD th_ack ; //32位确认号
BYTE th_lenres ; //4位首部长度/6位保留字
char th_flag ; //6位标志位
WORD th_win ; //16位窗口大小
WORD th_sum ; //16位校验和
WORD th_urp ; //16位紧急数据偏移量
} TCP_HEADER;

typedef struct _udphdr{ //定义UDP首部
WORD uh_sport ; //16位源端口
WORD uh_dport; //16位目的端口
WORD uh_len ; //16位长度
WORD uh_sum ; //16位校验和
}UDP_HEADER;

typedef struct _icmphdr{ //定义ICMP首部
BYTE i_type ; //8位类型
BYTE i_code ; //8位代码
WORD i_cksum ; //16位校验和
WORD i_id ; //识别号(一般用进程号作为识别号)
//WORD i_seq ; //报文序列号
WORD timestamp ; //时间戳
}ICMP_HEADER;

typedef struct _protomap{ //定义子协议映射表
int ProtoNum;
char ProtoText[MAX_PROTO_TEXT_LEN];

} TPROTOMAP;
MEFULEU 2005-05-13
  • 打赏
  • 举报
回复
// Part of winsock2.h
/*
* Protocols

#define IPPROTO_IP 0 dummy for IP
#define IPPROTO_ICMP 1 control message protocol
#define IPPROTO_IGMP 2 internet group management protocol
#define IPPROTO_GGP 3 gateway^2 (deprecated)
#define IPPROTO_TCP 6 tcp
#define IPPROTO_PUP 12 pup
#define IPPROTO_UDP 17 user datagram protocol
#define IPPROTO_IDP 22 xns idp
#define IPPROTO_ND 77 UNOFFICIAL net disk proto

#define IPPROTO_RAW 255 raw IP packet
#define IPPROTO_MAX 256
*/
#define MAX_PACK_LEN 65535 //接收的最大IP报文
#define MAX_ADDR_LEN 16 //点分十进制地址的最大长度
#define MAX_PROTO_TEXT_LEN 16 //子协议名称(如"TCP")最大长度
#define MAX_PROTO_NUM 12 //子协议数量
#define MAX_HOSTNAME_LAN 255 //最大主机名长度

#define PROTO_NUM 11
#define BUFLEN 65536 //IP包最长的有效长度,长度过长,会忙不过来造成死机,
#define IOC_IN 0x80000000
#define IOC_VENDOR 0x18000000
#define IOC_out 0x40000000
#define SIO_RCVALL IOC_IN | IOC_VENDOR | 1// or IOC_out;

#define IP_VER 4 /* IP version */
#define IP_HEAD_LEN 5 /* IP head length */
#define IP_SERV_TYPE 0 /* IP service type */
#define IP_PROTO_TCP 6 /* TCP protocol */
#define IP_PROTO_UDP 17 /* UDP protocol */
#define IP_PROTO_ICMP 1 /* ICMP protocol */
#define IP_PAD 0 /* IP pseudohead padding */
#define IP_MF 0x4000 /* IP MF */
#define IP_DF 0x2000 /* IP DF */
#define IP_FLAG_MASK 0x1fff /* IP flagoffset mask */
#define IP_HEAD_BYTE_LEN 20 /* IP head length in byte */

#define TCP_HEAD_LEN 5 /* TCP head length */
#define TCP_URG 0x20 /* TCP URG */
#define TCP_ACK 0x10 /* TCP ACK */
#define TCP_PSH 0x08 /* TCP PSH */
#define TCP_RST 0x04 /* TCP RST */
#define TCP_SYN 0x02 /* TCP SYN */
#define TCP_FIN 0x01 /* TCP FIN */
#define TCP_HEAD_BYTE_LEN 20 /* TCP head length in byte */

#define UDP_HEAD_LEN 8 /* UDP head length */

#define PSEUDO_HEAD_LEN 12 /* Pseudo head length */

#define ICMP_HEAD_LEN 4 /* ICMP head length */


#define WM_GETDATA WM_USER

typedef struct _PROTN2T
{
int proto ;
char *pprototext ;
}PROTN2T ;


/* The IP header */
typedef struct _IPHEADER {
unsigned char header_len:4; //位首部长度+4位IP版本号
unsigned char version:4;
unsigned char tos; // type of service
unsigned short total_len; // length of the packet
unsigned short ident; // unique identifier
unsigned short flags;
unsigned char ttl;
unsigned char proto; // protocol ( IP , TCP, UDP etc)
unsigned short checksum;
unsigned int sourceIP;
unsigned int destIP;

}IPHEADER;
MEFULEU 2005-05-13
  • 打赏
  • 举报
回复
你的贴:

http://community.csdn.net/Expert/TopicView3.asp?id=3994320

连接不上;提示:


请输入帖子编号!
dargons 2005-05-12
  • 打赏
  • 举报
回复
我想请教一个问题:既然该程序是用原始套接字实现的,那么从原理上说它所捕获到的数据就应该是原始的IP数据包中的数据,其中应该包含原始的二进制形式的信息.如果按照上面的程序来调试的话,会得到什么样的数据呢?
jandger 2005-05-12
  • 打赏
  • 举报
回复
我试着将String DecodeIpPack(char *mIPDATA,int iBufSize)函数加入到先前的程序中,但出现了类型定义错误:Undefined Symbol 'IPHEADER',还有TCP_HEADER,UDP_HEADER,ICMP_HEADER,TSockAddrIn.我不知道这些类型是不是在某些.h或.hpp文件中,需要加到本程序的头文件中,如果不是,那么这些类型是如何定义的呢?
顺便说明一下,我想知道IP的内容是指这个IP包的16进制数串如:45 00 00 28 AC 03 40 00 2C 06 0D BA DB 97 C9 F9 0A BB 54 C6 25 CF 12 79 CE AE 2C D5 8F FB AF 1B 50 10 FF FF 37 DF 00 00
不知可不可以?
前面的那个程序我已经调通了,首先感谢MEFULEU仁兄的帮助,现在就差如何提取包的内容(16进制数串),希望仁兄能再拉小弟一把,将不胜感激。
MEFULEU 2005-05-11
  • 打赏
  • 举报
回复
另外要显示包的内容必须进行解码:

//IP解包程序
String TForm1::DecodeIpPack(char *mIPDATA,int iBufSize)
{
WORD SourcePort,DestPort;
int iProtocol,iTTL;
char szProtocol[MAX_PROTO_TEXT_LEN],szSourceIP[MAX_ADDR_LEN],szDestIP[MAX_ADDR_LEN];
IPHEADER pIpheader;
TCP_HEADER pTcpHeader;
UDP_HEADER pUdpHeader;
ICMP_HEADER pIcmpHeader;
TSockAddrIn saSource,saDest;
int iIphLen,data_size;
int TcpHeaderLen;
BYTE *TcpData=NULL;

String str="";


memcpy(&pIpheader,mIPDATA,sizeof(pIpheader));
//协议识别
iProtocol= pIpheader.proto;
StrLCopy(szProtocol,get_proto_name(iProtocol),15);


//源地址
saSource.sin_addr.s_addr = pIpheader.sourceIP;
StrLCopy(szSourceIP, inet_ntoa(saSource.sin_addr), MAX_ADDR_LEN);
//目的地址
saDest.sin_addr.s_addr = pIpheader.destIP;
StrLCopy(szDestIP, inet_ntoa(saDest.sin_addr), MAX_ADDR_LEN);
iTTL = pIpheader.ttl;
//计算IP首部的长度
iIphLen =sizeof(pIpheader);

//根据协议类型分别调用相应的函数
switch (iProtocol)
{
case IPPROTO_TCP :
{
memcpy(&pTcpHeader,mIPDATA+iIphLen,sizeof(pTcpHeader));
SourcePort= ntohs(pTcpHeader.TCP_Sport);//源端口
DestPort = ntohs(pTcpHeader.TCP_Dport); //目的端口

data_size=iBufSize-iIphLen-sizeof(pTcpHeader);
TcpData=((BYTE *)mIPDATA)+iIphLen+sizeof(pTcpHeader);


break;
}
case IPPROTO_UDP:
{ memcpy(&pUdpHeader,mIPDATA+iIphLen,sizeof(pUdpHeader));
SourcePort= ntohs(pUdpHeader.uh_sport);//源端口
DestPort= ntohs(pUdpHeader.uh_dport); //目的端口
data_size=iBufSize-iIphLen-sizeof(pUdpHeader);
TcpData=((BYTE *)mIPDATA)+iIphLen+sizeof(pUdpHeader);
break;
}
case IPPROTO_ICMP:
{ memcpy(&pIcmpHeader,mIPDATA+iIphLen,sizeof(pIcmpHeader));
SourcePort = pIcmpHeader.i_type;//类型
DestPort = pIcmpHeader.i_code; //代码
TcpData=((BYTE *)mIPDATA)+iIphLen+sizeof(pIcmpHeader);
data_size=iBufSize-iIphLen-sizeof(pIcmpHeader);
break;
}
default:
{
SourcePort =0;
DestPort = 0; //代码
TcpData=((BYTE *)mIPDATA)+iIphLen;
data_size=iBufSize-iIphLen;
break;
}
}


str.printf(TcpData);
return str;
MEFULEU 2005-05-11
  • 打赏
  • 举报
回复
警告就不用管了;我也不是很清楚!
jandger 2005-05-11
  • 打赏
  • 举报
回复
感谢MEFULEU的帮助!!
我现在已经能够成功的运行,并且抓取数据包,
但还是有那些警告,不知是为什么?
望请解答!
baichuan168 2005-05-11
  • 打赏
  • 举报
回复
我还是无法抓取数据包,程序运行到
recv(sock, RecvBuf, BUFFER_SIZE, 0)
就挂在哪里了,请问是什么问题!
NetSpider9804040 2005-05-11
  • 打赏
  • 举报
回复
学习中
baichuan168 2005-05-10
  • 打赏
  • 举报
回复
感谢MEFULEU的回复!
现在程序已能编译运行,但当运行到
if (recv(sock, RecvBuf, BUFFER_SIZE, 0) > 0)
时,程序就挂在此出,是否没有收到数据包,我将端口绑定到了80
addr_in.sin_port = htons(80);
请问是什么原因
jandger 2005-05-10
  • 打赏
  • 举报
回复
我在工程文件里加入WS2_32.LIB这个文件后,重新编译了一下,“bind error”不见了,但仍有那些警告,而且,每接收一个包,就显示一个数字,请问如何能够显示包的内容。感谢回复!!
加载更多回复(7)

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧