RAW协议是大多数打印设备的默认协议.doc_第1页
RAW协议是大多数打印设备的默认协议.doc_第2页
RAW协议是大多数打印设备的默认协议.doc_第3页
RAW协议是大多数打印设备的默认协议.doc_第4页
RAW协议是大多数打印设备的默认协议.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

RAW协议是大多数打印设备的默认协议。为了发送 RAW 格式的作业,打印服务器将打开一个针对打印机网络接口的 TCP 流。对于许多设备来说,这个接口将是端口 9100。在创建 TCP/IP端口之后,Windows将按照RFC 1759(Printer MIB),使用SNMP来查询设备的对象标识符(Object Identifier,OID)。如果设备返回了一个值,则解析系统文件tcpmon.ini来寻找匹配项。如果打印机制造商提供了特定设备的特殊配置信息,则这些配置信息已经连同配置设置一起创建就绪。例如,有些外部打印服务器接口支持多台打印机(例如,具有3个并行端口连接的Hewlett Packard JetDirect EX)。制造商可以使用不同的端口来指明应该将某项作业提交给哪台打印机(例如,将作业9102提交给端口1,将作业9103提交给端口2等等)。这一功能对于需要使用特殊端口名称的打印服务器接口有所裨益,比如:某些IBM网络打印机上的PASS端口。这里介绍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_MACHINESystemCurrentControlSetServicesAfdParameter修改键:DisableRawSecurity(类型为DWORD),把值修改为 1。如果没有,就添加。BOOL blnFlag=TRUE;setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)&blnFlag, sizeof(blnFlag);对于原始套接字在接收数据报的时候,要注意这么几点:1、如果接收的数据报中协议类型和定义的原始套接字匹配,那么,接收的所有数据就拷贝到套接字中。2、如果绑定了本地地址,那么只有接收数据IP头中对应的远端地址匹配,接收的数据就拷贝到套接字中。3、如果定义的是外部地址,比如使用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 0x01typedef struct _iphdr /定义IP首部unsigned char h_lenver; /4位首部长度+4位IP版本号unsigned char tos; /8位服务类型TOSunsigned short total_len; /16位总长度(字节)unsigned short ident; /16位标识unsigned short frag_and_flags; /3位标志位unsigned char ttl; /8位生存时间 TTLunsigned char proto; /8位协议 (TCP, UDP 或其他)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 (size 1)cksum += *buffer+;size -= sizeof(USHORT);if (size)cksum += *(UCHAR*)buffer;cksum = (cksum 16) + (cksum & 0xffff);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 #include #include #define SOURCE_PORT 7234#define MAX_RECEIVEBYTE 255typedef struct ip_hdr /定义IP首部unsigned char h_verlen; /4位首部长度,4位IP版本号unsigned char tos; /8位服务类型TOSunsigned short total_len; /16位总长度(字节)unsigned short ident; /16位标识unsigned short frag_and_flags; /3位标志位unsigned char ttl; /8位生存时间 TTLunsigned 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首部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 = (cksum 16) + (cksum & 0xffff);cksum += (cksum 16);return (USHORT)(cksum);void useage()printf(*n);printf(TCPPingn);printf(t Written by Refdomn);printf(t Email: 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 szSendBuf60=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(argv2);addr_in.sin_addr.S_un.S_addr=inet_addr(argv1);/填充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;ipHto=IPPROTO_TCP;ipHeader.checksum=0;ipHeader.sourceIP=inet_addr(本地地址);ipHeader.destIP=inet_addr(argv1);/填充TCP首部tcpHeader.th_dport=htons(atoi(argv2);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!:%dn,WSAGetLastError();return false;elseprintf(send ok!n);closesocket(sock);WSACleanup();return 0;4、接收数据和发送原始套接字数据相比,接收就比较麻烦了。因为在WIN我们不能用recv()来接收raw socket上的数据,这是因为,所有的IP包都是

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论