社区
iOS
帖子详情
iphone下IP_HDRINCL设置无法sendto成功
gongxujun
2013-07-19 02:01:20
setsockopt(sndsock, IPPROTO_IP, IP_HDRINCL, (char *)&on,sizeof(on))
在设置IP_HDRINCL来修改IP首部后,sendto就一直返回errno 22的错误,不知道为什么,win32,linux,android下都没有问题,就只有Iphone会出现,有没有人知道具体情况的
...全文
98
回复
打赏
收藏
iphone下IP_HDRINCL设置无法sendto成功
setsockopt(sndsock, IPPROTO_IP, IP_HDRINCL, (char *)&on,sizeof(on)) 在设置IP_HDRINCL来修改IP首部后,sendto就一直返回errno 22的错误,不知道为什么,win32,linux,android下都没有问题,就只有Iphone会出现,有没有人知道具体情况的
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
ip
欺骗
设置
教程
当某个
IP
的访问过于频繁,或者访问量过大是,服务器会拒绝访问请求,这时候通过
IP
欺骗可以增加访问频率和访问量,以达到压力测试的效果。 某些服务器配置了负载均衡,使用同一个
IP
不能测出系统的实际性能。LR中的
IP
欺骗通过调用不同的
IP
,可很大程度上的模拟实际使用中多
IP
访问和并测试服务器均衡处理的能力。
可以仿造
ip
我们知道,TCP/
IP
网络数据全部是通过封装在
IP
数据包中在Internet网上传送的,也就是封装建立起一个包含
IP
头和数据的
IP
数据报。一般来说,网络软件总是以多个32位字产生
IP
头,即使必须用附加的0填充
IP
头。
IP
头包含了传输
IP
数据包中封装数据的所有必要信息。
IP
头的数据结构和描述如下: 成员 长度(Bit) 描述 Version 4
IP
头的版本号,目前是
IP
v4,最新是
IP
v6 Header Length 4
IP
头的长度,若没有特殊选择,
IP
头总是20字节长 Type of Service 8 服务类型,定义了数据传输的优先级、延迟、吞吐量和可靠性等特性 Total Packet Length 16
IP
包的长度,若没有特殊选项,一般为20字节长 Identification 16
IP
包标识,主机使用它唯一确定每个发送的数据报 Flag 3
IP
数据分割标志 Fragment Offset 13
IP
数据分割偏移 Time to Live 8 数据报在网络上的存活时间,每通过一个路由器,该数值减一 Protocol 8 TCP/
IP
协议类型,比如:ICMP为1,IGMP为2,TCP为6,UDP为17等 Header Checksum 16 头部检验和 Source
IP
Address 32 源
IP
地址 Destination
IP
Address 32 目的
IP
地址 Other ? 其他选项 Data ? 数据 实现自己定义的
IP
头是一件非常有意义的事情,比如,通过改变
IP
头里的TOS的优先级和TTL,你可以使自己的数据包有更强的传输能力和寿命,通过修改
IP
头里的源
IP
地址就可以隐藏自己机器的
IP
地址等等。象著名攻击程序“泪滴TearDrop”就是通过故意制造系统不能处理的分片
IP
包而实现的,还有SYN Flooder和UDP Flooder就是通过产生随机源
IP
实现欺骗的。 三、实现原理 一般来说,自定义
IP
头是通过使用socket的库函数setsockopt()的选项
IP
_
HDRINCL
来实现的,尽管这在unix和linux平台上很容易实现,但遗憾的是在Windows平台的Winsock1.1和Winsock2.0函数库里setsockopt()不支持
IP
_
HDRINCL
选项,所以在Windows 9x/NT里是
无法
通过Winsock函数库来实现
IP
头自定义的,当然可以通过编写虚拟设备驱动程序来实现,不过比较复杂,但Windows 2000的出现打破了这种局面,Windows2000的Winsock2.2函数库里全面支持setsockopt()的选项
IP
_
HDRINCL
,使得我们轻松就可以实现自定义的
IP
头。实现方法如下: SOCKET s; BOOL bopt; s=WSASocket(AF_INET, SOCK_RAW,
IP
PROTO_UDP, NULL, 0, WSA_FLAG_OVERLAPPED); ret = setsockopt(s,
IP
PROTO_
IP
,
IP
_
HDRINCL
, (char *)bopt, sizeof(bopt); 四、实例 为帮助大家尽快地学会构造自己的
IP
头数据,特给出一个完整的实例,例子的功能是:只要给出对方的
IP
地址,就可以发送给对方的OICQ一个“hello!”消息,并且由于修改了发送数据包的
IP
头,完全实现了发送方
IP
地址的隐藏,也就是说稍加修改你就可以制作出一个能够完完全全的匿名OICQ发送器,当然,若是故意捣乱的话,后果自负。源代码如下: /***********************************************************************/ /* Oicq
Send
.c */ /* 本程序用Visual C++ 6.0编译在Windows 2000 Advanced Server 上调试通过 */ /* Created by janker@371.net 2000.8.28 */ /* 声明:本程序经修改后可能会产生攻击性擅自修改成攻击程序者后果自负 */ /***********************************************************************/ #pragma pack(1) #define WIN32_LEAN_AND_MEAN #include #include #include #include #include #define OICQ_MAX_PACKET 1024 #define OICQ_MAX_MSG 512 #define OICQ_MSG_LEN 45 #define SRC_
IP
"127.0.0.1" #define SRC_PORT 5277 #define DST_PORT 4000 typedef struct
ip
_hdr { unsigned char
ip
_verlen; unsigned char
ip
_tos; unsigned short
ip
_totallength; unsigned short
ip
_id; unsigned short
ip
_offset; unsigned char
ip
_ttl; unsigned char
ip
_protocol; unsigned short
ip
_checksum; unsigned int
ip
_srcaddr; unsigned int
ip
_destaddr; }
IP
_HDR; typedef struct udp_hdr { unsigned short src_portno; unsigned short dst_portno; unsigned short udp_length; unsigned short udp_checksum; } UDP_HDR; char strMessage[OICQ_MSG_LEN] = { 0x02,0x01,0x07,0x00,0x78,0x00,0x00,0x31,0x30,0x30,0x30,0x31,0x1f,0x30,0x1f, 0x30,0x30,0x1f,0x32,0x30,0x30,0x30,0x2d,0x30,0x31,0x2d,0x30,0x31,0x1f,0x30, 0x30,0x3a,0x30,0x30,0x3a,0x30,0x30,0x1f,0x68,0x65,0x6c,0x6c,0x6f,0x21,0x03 }; USHORT checksum(USHORT *buffer, int size) { unsigned long cksum=0; while (size > 1) { cksum += *buffer++; size -= sizeof(USHORT); } if (size) { cksum += *(UCHAR*)buffer; } cksum = (cksum >> 16) + (cksum & 0xffff); cksum += (cksum >>16); return (USHORT)(~cksum); } int main(int argc, char **argv) { WSADATA wsd; SOCKET s; BOOL bOpt; struct sockaddr_in remote;
IP
_HDR
ip
Hdr; UDP_HDR udpHdr; int ret; DWORD i; unsigned short iTotalSize, iUdpSize, iUdpChecksumSize, i
IP
Version, i
IP
Size, cksum = 0; char buf[OICQ_MAX_PACKET], *ptr = NULL; printf("Spoof OICQ Msg
Send
er - by Janker@371.net\n\n"); if(argc!=2) { printf("usage: OICQ
SEND
Destination_
IP
_Address"); ExitProcess(1); } srand((unsigned)time(NULL)); strMessage[5]=rand(); if (WSAStartup(MAKEWORD(2,2), &wsd;) != 0) { printf("WSAStartup() failed: %d\n", GetLastError()); return -1; } s = WSASocket(AF_INET, SOCK_RAW,
IP
PROTO_UDP, NULL, 0,0); if (s == INVALID_SOCKET) { printf("WSASocket() failed: %d\n", WSAGetLastError()); return -1; } bOpt = TRUE; ret = setsockopt(s,
IP
PROTO_
IP
,
IP
_
HDRINCL
, (char *)&bOpt;, sizeof(bOpt)); if (ret == SOCKET_ERROR) { printf("setsockopt(
IP
_
HDRINCL
) failed: %d\n", WSAGetLastError()); return -1; } iTotalSize = sizeof(
ip
Hdr) + sizeof(udpHdr) + OICQ_MSG_LEN; i
IP
Version = 4; i
IP
Size = sizeof(
ip
Hdr) / sizeof(unsigned long);
ip
Hdr.
ip
_verlen = (i
IP
Version << 4) | i
IP
Size;
ip
Hdr.
ip
_tos = 0;
ip
Hdr.
ip
_totallength = htons(iTotalSize);
ip
Hdr.
ip
_id = 0;
ip
Hdr.
ip
_offset = 0;
ip
Hdr.
ip
_ttl = 128;
ip
Hdr.
ip
_protocol = 0x11;
ip
Hdr.
ip
_checksum = 0 ;
ip
Hdr.
ip
_srcaddr = inet_addr(SRC_
IP
);
ip
Hdr.
ip
_destaddr = inet_addr(argv[1]); iUdpSize = sizeof(udpHdr) + OICQ_MSG_LEN; udpHdr.src_portno = htons(SRC_PORT) ; udpHdr.dst_portno = htons(DST_PORT) ; udpHdr.udp_length = htons(iUdpSize) ; udpHdr.udp_checksum = 0 ; iUdpChecksumSize = 0; ptr = buf; ZeroMemory(buf, OICQ_MAX_PACKET); memcpy(ptr, &
ip
Hdr;.
ip
_srcaddr, sizeof(
ip
Hdr.
ip
_srcaddr)); ptr += sizeof(
ip
Hdr.
ip
_srcaddr); iUdpChecksumSize += sizeof(
ip
Hdr.
ip
_srcaddr); memcpy(ptr, &
ip
Hdr;.
ip
_destaddr, sizeof(
ip
Hdr.
ip
_destaddr)); ptr += sizeof(
ip
Hdr.
ip
_destaddr); iUdpChecksumSize += sizeof(
ip
Hdr.
ip
_destaddr); ptr++; iUdpChecksumSize += 1; memcpy(ptr, &
ip
Hdr;.
ip
_protocol, sizeof(
ip
Hdr.
ip
_protocol)); ptr += sizeof(
ip
Hdr.
ip
_protocol); iUdpChecksumSize += sizeof(
ip
Hdr.
ip
_protocol); memcpy(ptr, &udpHdr;.udp_length, sizeof(udpHdr.udp_length)); ptr += sizeof(udpHdr.udp_length); iUdpChecksumSize += sizeof(udpHdr.udp_length); memcpy(ptr, &udpHdr;, sizeof(udpHdr)); ptr += sizeof(udpHdr); iUdpChecksumSize += sizeof(udpHdr); for(i = 0; i *ptr = strMessage[i]; iUdpChecksumSize += OICQ_MSG_LEN; cksum = checksum((USHORT *)buf, iUdpChecksumSize); udpHdr.udp_checksum = cksum; ZeroMemory(buf, OICQ_MAX_PACKET); ptr = buf; memcpy(ptr, &
ip
Hdr;, sizeof(
ip
Hdr)); ptr += sizeof(
ip
Hdr); memcpy(ptr, &udpHdr;, sizeof(udpHdr)); ptr += sizeof(udpHdr); memcpy(ptr, strMessage, OICQ_MSG_LEN); remote.sin_family = AF_INET; remote.sin_port = htons(DST_PORT); remote.sin_addr.s_addr = inet_addr(argv[1]); ret =
send
to(s, buf, iTotalSize, 0, (SOCKADDR *)&remote;, sizeof(remote)); if (ret == SOCKET_ERROR) printf("
send
to() failed: %d\n", WSAGetLastError()); else printf("
Send
O.K.!"); closesocket(s) ; WSACleanup() ; return 0; }
setsockopt参数详解
setsockopt参数详解 该函数不同参数所对应的意思,以及部分举例等。。 较为全面。
linux网络编程:原始套接字的魔力[上]
关于linux下原始套接字编程的相关知识,很不错的文档
send
ip
源码
Send
ip
是Linux下的
IP
数据包发送软件,它允许用户构造任意的甚至是不合法的
IP
数据包,并自动选择一个正确接口把它发送出去。
send
ip
工作的基本原理是利用原始套接口编程技术,创建一个原始套接口,然后
设置
该套接口的
IP
_
HDRINCL
选项,从而可以由程序使用者代替操作系统任意构造
IP
数据报首部、上层协议首部和数据。然后利用
send
to()系统调用,发送这个数据报。
send
ip
目前的最新版本是2.1,本文挡讨论的版本是2.0。本文档首先介绍了
send
ip
主函数的工作流程,然后介绍了一些
send
ip
主函数调用的附加函数,系统调用 的功能和使用方法。
iOS
29,046
社区成员
12,467
社区内容
发帖
与我相关
我的任务
iOS
主要讨论与iOS相关的软件和技术
复制链接
扫一扫
分享
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章