c语言抓包函数大全 抓包csdn

C语言常用的函数有哪些C语言库函数,常用库函数有:
1、scanf格式输入函数
2、printf格式输出函数
3、systemdos命令函数
4、sort排序
5、main主函数
6、fgets文件读取字符串函数
7、fputs文件写入字符串函数
8、fscanf文件格式读取函数
9、fprintf文件格式写入函数
10、fopen打开文件函数
11、getchar输入字符函数
12、putchar输出字符函数
13、malloc动态申请内存函数
14、free释放内存函数
15、abs求绝对值数学函数
16、sqrt求平方根数学函数
扩展资料
语言组成:
1、数据类型
C的数据类型包括:整型、字符型、实型或浮点型(单精度和双精度)、枚举类型、数组类型、结构体类型、共用体类型、指针类型和空类型 。
2、常量与变量
常量其值不可改变,符号常量名通常用大写 。
变量是以某标识符为名字 , 其值可以改变的量 。标识符是以字母或下划线开头的一串由字母、数字或下划线构成的序列 , 请注意第一个字符必须为字母或下划线,否则为不合法的变量名 。变量在编译时为其分配相应存储单元 。
3、数组
如果一个变量名后面跟着一个有数字的中括号 , 这个声明就是数组声明 。字符串也是一种数组 。它们以ASCII的NULL作为数组的结束 。要特别注意的是,方括内的索引值是从0算起的 。
4、指针
如果一个变量声明时在前面使用 * 号,表明这是个指针型变量 。换句话说,该变量存储一个地址,而 *(此处特指单目运算符 * ,下同 。C语言中另有 双目运算符 *) 则是取内容操作符,意思是取这个内存地址里存储的内容 。指针是 C 语言区别于其他同时代高级语言的主要特征之一 。
参考资料来源:百度百科-函数
C语言 库函数C语言的库函数很多
大概几百个,举几个常用的
比如
printf()、scanf() , 等等
库函数是系统内部定义好的 , 不需要定义,但在使用前
需要把它所在的函数库的头文件进来

比如你要使用
sin()这个函数
, 这个函数在math.h
这个头文件里

就需要在程序开始
加入
#include
“math.h”
然后你就可以在程序里直接使用了
怎样用C语言实现网络抓包?第一法则:站在巨人肩膀上不要重复造轮子 。
对于这种复杂的过程c语言抓包函数大全 , 第一选择是使用现成的,节约时间,提升效率 。
Wireshark(前称Ethereal)是一个网络封包分析软件 。网络封包分析软件的功能是撷取网络封包 , 并尽可能显示出最为详细的网络封包资料 。Wireshark使用WinPCAP作为接口 , 直接与网卡进行数据报文交换 。
网络封包分析软件的功能可想像成 "电工技师使用电表来量测电流、电压、电阻" 的工作 - 只是将场景移植到网络上,并将电线替换成网络线 。在过去,网络封包分析软件是非常昂贵 , 或是专门属于营利用的软件 。Ethereal的出现改变c语言抓包函数大全了这一切 。在GNUGPL通用许可证的保障范围底下,使用者可以以免费的代价取得软件与其源代码,并拥有针对其源代码修改及客制化的权利 。Ethereal是目前全世界最广泛的网络封包分析软件之一 。
第二法则:学习提升 。
如果是单纯的学习知识,可以直接尝试写一些具有部分功能的程序,过程会有点艰难,但非常有意义 。学习网络编程,需要了解 开放系统互连参考模型的的七层每一层的意义以及现实当中实现的四层的网络协议 。然后就可以知道抓包的包位于模型当中的传输层协议,包括UDP和TCP的协议 。进一步要学习每种协议的格式,表头,数据包等等 。一句话,冰冻三尺非一日之寒 。
Windows下的抓包及简单的编程 。
Windows2000在TCP/IP协议组件上做了很多改进,功能也有增强 。比如在协议栈上的调整 , 增大了默认窗口大小,以及高延迟链接新算法 。同时在安全性上,可应用IPSec加强安全性 , 比NT下有不少的改进 。
Microsoft TCP/IP 组件包含“核心协议”、“服务”及两者之间的“接口” 。传输驱动程序接口 (TDI) 与网络设备接口规范 (NDIS) 是公用的 。此外,还有许多用户模型应用程序的更高级接口 。最常用的接口是 Windows Sockets、远程过程调用 (RPC) 和 NetBIOS 。
Windows Sockets 是一个编程接口,它是在加州大学伯克利分校开发的套接字接口的基础上定义的 。它包括了一组扩展件,以充分利用 Microsoft Windows 消息驱动的特点 。规范的 1.1 版是在 1993 年 1 月发行的,2.2.0 版在 1996 年 5 月发行 。Windows 2000 支持 Winsock 2.2 版 。在Winsock2中,支持多个传输协议的原始套接字 , 重叠I/O模型、服务质量控制等 。
这里介绍Windows Sockets的一些关于原始套接字(Raw Socket)的编程 。同Winsock1相比,最明显的就是支持了Raw Socket套接字类型 , 通过原始套接字,我们可以更加自如地控制Windows下的多种协议 , 而且能够对网络底层的传输机制进行控制 。
1、创建一个原始套接字,并设置IP头选项 。
SOCKET sock;
sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);
或者:
s = WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);
这里 , 我们设置了SOCK_RAW标志,表示我们声明的是一个原始套接字类型 。创建原始套接字后,IP头就会包含在接收的数据中,如果我们设定 IP_HDRINCL 选项,那么,就需要自己来构造IP头 。注意 , 如果设置IP_HDRINCL 选项,那么必须具有 administrator权限 , 要不就必须修改注册表:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Afd\Parameter\
修改键:DisableRawSecurity(类型为DWORD),把值修改为 1 。如果没有,就添加 。
BOOL blnFlag=TRUE;
setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)blnFlag, sizeof(blnFlag);
对于原始套接字在接收数据报的时候 , 要注意这么几点:
a、如果接收的数据报中协议类型和定义的原始套接字匹配,那么,接收的所有数据就拷贝到套接字中 。
b、如果绑定了本地地址,那么只有接收数据IP头中对应的远端地址匹配,接收的数据就拷贝到套接字中 。
c、如果定义的是外部地址,比如使用connect() , 那么,只有接收数据IP头中对应的源地址匹配,接收的数据就拷贝到套接字中 。
2、构造IP头和TCP头
这里,提供IP头和TCP头的结构:
// Standard TCP flags
#define URG 0x20
#define ACK 0x10
#define PSH 0x08
#define RST 0x04
#define SYN 0x02
#define FIN 0x01
typedef struct _iphdr //定义IP首部
{
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 或其c语言抓包函数大全他)
unsigned short checksum; //16位IP首部校验和
unsigned int sourceIP; //32位源IP地址
unsigned int destIP; //32位目的IP地址
}IP_HEADER;
typedef struct psd_hdr //定义TCP伪首部
{
unsigned long saddr; //源地址
unsigned long daddr; //目的地址
char mbz;
char ptcl; //协议类型
unsigned short tcpl; //TCP长度
}PSD_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;
TCP伪首部并不是真正存在的,只是用于计算检验和 。校验和函数:
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while (size1)
{
cksum= *buffer;
size -= sizeof(USHORT);
}
if (size)
{
cksum= *(UCHAR*)buffer;
}
cksum = (cksum16)(cksum0xffff);
cksum= (cksum 16);
return (USHORT)(~cksum);
}
当需要自己填充IP头部和TCP头部的时候,就同时需要自己计算他们的检验和 。
3、发送原始套接字数据报
填充这些头部稍微麻烦点,发送就相对简单多了 。只需要使用sendto()就OK 。
sendto(sock, (char*)tcpHeader, sizeof(tcpHeader), 0, (sockaddr*)addr_in,sizeof(addr_in));
下面是一个示例程序,可以作为SYN扫描的一部分 。
#include stdio.h
#include winsock2.h
#include ws2tcpip.h
#define SOURCE_PORT 7234
#define MAX_RECEIVEBYTE 255
typedef struct ip_hdr //定义IP首部
{
unsigned char h_verlen; //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地址
}IPHEADER;
typedef struct tsd_hdr //定义TCP伪首部
{
unsigned long saddr; //源地址
unsigned long daddr; //目的地址
char mbz;
char ptcl; //协议类型
unsigned short tcpl; //TCP长度
}PSDHEADER;
typedef struct tcp_hdr //定义TCP首部
{
【c语言抓包函数大全 抓包csdn】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位紧急数据偏移量
}TCPHEADER;
//CheckSum:计算校验和的子函数
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while(size 1)
{
cksum =*buffer;
size -=sizeof(USHORT);
}
if(size )
{
cksum= *(UCHAR*)buffer;
}
cksum = (cksum16)(cksum0xffff);
cksum= (cksum 16);
return (USHORT)(~cksum);
}
void useage()
{
printf("******************************************\n");
printf("TCPPing\n");
printf("\t Written by Refdom\n");
printf("\t Email: refdom@263.net\n");
printf("Useage: TCPPing.exe Target_ip Target_port \n");
printf("*******************************************\n");
}
int main(int argc, char* argv[])
{
WSADATA WSAData;
SOCKET sock;
SOCKADDR_IN addr_in;
IPHEADER ipHeader;
TCPHEADER tcpHeader;
PSDHEADER psdHeader;
char szSendBuf[60]={0};
BOOL flag;
int rect,nTimeOver;
useage();
if (argc!= 3)
{ return false; }
if (WSAStartup(MAKEWORD(2,2), WSAData)!=0)
{
printf("WSAStartup Error!\n");
return false;
}
if ((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET)
{
printf("Socket Setup Error!\n");
return false;
}
flag=true;
if (setsockopt(sock,IPPROTO_IP, IP_HDRINCL,(char *)flag,sizeof(flag))==SOCKET_ERROR)
{
printf("setsockopt IP_HDRINCL error!\n");
return false;
}
nTimeOver=1000;
if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)nTimeOver, sizeof(nTimeOver))==SOCKET_ERROR)
{
printf("setsockopt SO_SNDTIMEO error!\n");
return false;
}
addr_in.sin_family=AF_INET;
addr_in.sin_port=htons(atoi(argv[2]));
addr_in.sin_addr.S_un.S_addr=inet_addr(argv[1]);
//
//
//填充IP首部
ipHeader.h_verlen=(44 | sizeof(ipHeader)/sizeof(unsigned long));
// ipHeader.tos=0;
ipHeader.total_len=htons(sizeof(ipHeader) sizeof(tcpHeader));
ipHeader.ident=1;
ipHeader.frag_and_flags=0;
ipHeader.ttl=128;
ipHeader.proto=IPPROTO_TCP;
ipHeader.checksum=0;
ipHeader.sourceIP=inet_addr("本地地址");
ipHeader.destIP=inet_addr(argv[1]);
//填充TCP首部
tcpHeader.th_dport=htons(atoi(argv[2]));
tcpHeader.th_sport=htons(SOURCE_PORT); //源端口号
tcpHeader.th_seq=htonl(0x12345678);
tcpHeader.th_ack=0;
tcpHeader.th_lenres=(sizeof(tcpHeader)/44|0);
tcpHeader.th_flag=2; //修改这里来实现不同的标志位探测,2是SYN,1是FIN,16是ACK探测 等等
tcpHeader.th_win=htons(512);
tcpHeader.th_urp=0;
tcpHeader.th_sum=0;
psdHeader.saddr=ipHeader.sourceIP;
psdHeader.daddr=ipHeader.destIP;
psdHeader.mbz=0;
psdHeader.ptcl=IPPROTO_TCP;
psdHeader.tcpl=htons(sizeof(tcpHeader));
//计算校验和
memcpy(szSendBuf, psdHeader, sizeof(psdHeader));
memcpy(szSendBuf sizeof(psdHeader), tcpHeader, sizeof(tcpHeader));
tcpHeader.th_sum=checksum((USHORT *)szSendBuf,sizeof(psdHeader) sizeof(tcpHeader));
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));
rect=sendto(sock, szSendBuf, sizeof(ipHeader) sizeof(tcpHeader),
0, (struct sockaddr*)addr_in, sizeof(addr_in));
if (rect==SOCKET_ERROR)
{
printf("send error!:%d\n",WSAGetLastError());
return false;
}
else
printf("send ok!\n");
closesocket(sock);
WSACleanup();
return 0;
}
4、接收数据
和发送原始套接字数据相比 , 接收就比较麻烦了 。因为在WIN我们不能用recv()来接收raw socket上的数据,这是因为 , 所有的IP包都是先递交给系统核心,然后再传输到用户程序,当发送一个raws socket包的时候(比如syn),核心并不知道,也没有这个数据被发送或者连接建立的记录,因此,当远端主机回应的时候,系统核心就把这些包都全部丢掉,从而到不了应用程序上 。所以 , 就不能简单地使用接收函数来接收这些数据报 。
要达到接收数据的目的,就必须采用嗅探,接收所有通过的数据包 , 然后进行筛选 , 留下符合我们需要的 。可以再定义一个原始套接字,用来完成接收数据的任务,需要设置SIO_RCVALL , 表示接收所有的数据 。
SOCKET sniffersock;
sniffsock = WSASocket(AF_INET, SOCK_RAW, IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED);
DWORD lpvBuffer = 1;
DWORD lpcbBytesReturned = 0 ;
WSAIoctl(sniffersock, SIO_RCVALL, lpvBuffer, sizeof(lpvBuffer), NULL, 0,lpcbBytesReturned, NULL, NULL);
创建一个用于接收数据的原始套接字,我们可以用接收函数来接收数据包了 。然后在使用一个过滤函数达到筛选的目的,接收我们需要的数据包 。
如果在XP以上的操作系统,微软封杀了Raw Soccket,只能用wincpap之类的开发包了 。
如何使用c#实现抓包?方法/步骤
1
打开vs2012——文件——新建——项目 单击(如图)
在对话框左侧分别找到模板——其c语言抓包函数大全他语言——visual c——win32(如图)
选择“win32控制台应用程序”并设置好”名称“和”存储路径 “后单击确定
单击下一步
然后勾选”空项目“
接着单击菜单栏——视图——解决方案资源管理器
在弹出c语言抓包函数大全的浮动窗口中单击右键 ”源文件“(如图)
然后选择——添加——新建项单击(如图)
接着选择visual c后选择”c文件“并命名为holloworld.c
接着输入c语言代码
#includestdio.h
int main()
{
printf("hello world!");
return 0;
}
接着单击”本地windows调试器“或者ctrlF5
单击是
运行结果如下图
步骤阅读
用C语言编写一个域名提取的程序,如何选择抓包工具 , 域名的正则表达式怎么写?用libpcap这个工具,很强大 。
抓包部分在中文手册中有源代码 。我就给你讲讲获取域名吧 。
首先http包才有域名 , 并且是你三次握手后第一个包 。
包到手后累加14+20+tcp-doff*4后边的信息中有host:*****的消息
14是MAC头 20是ip头 后边那个 是 tcp头 长度(由于tcp头长度不定 , 但是有标志位的 。)
至于怎么提取你自己写吧
c语言常用库函数有哪些文件stddef.h里包含了标准库的一些常用定义 , 无论我们包含哪个标准头文件,stddef.h都会被自动包含进来 。
这个文件里定义:
类型size_t(sizeof运算符的结果类型,是某个无符号整型);
类型ptrdiff_t(两个指针相减运算的结果类型,是某个有符号整型);
类型wchar_t(宽字符类型,是一个整型 , 其中足以存放本系统所支持的所有本地环境中的字符集的所有编码值 。这里还保证空字符的编码值为0);
符号常量NULL(空指针值);
宏offsetor(这是一个带参数的宏,第一个参数应是一个结构类型,第二个参数应是结构成员名 。offsetor(s,m)求出成员m在结构类型t的变量里的偏移量) 。
c语言抓包函数大全的介绍就聊到这里吧 , 感谢你花时间阅读本站内容,更多关于抓包csdn、c语言抓包函数大全的信息别忘了在本站进行查找喔 。

    推荐阅读