阅读:1878回复:7
救命的意思是,再不(救)就出人(命)了!!!
各位大虾:
小生自认为什末都不懂,老板让做个网络数据包分析计费软件,在下看了很多东西,ddk文档、windows wdm编程等等,现在还是一头雾水,有几个问题想问: 1、我看到贴子上写过一个,用w2k的ddk中的ip filter 就是网络篇第六部分,不能很好的处理数据包,可文档上写得比较清楚,我想请问我要做的东西用这个行吗?回调函数的返回值中PF_FORWARD和FP_PASS有什末区别?我要在win2000 professional上实现这功能,请问它是ndis5.0吗?行不行? 2、imd是不是intermediate driver的缩写,我看了驱动开发的书,上面的DriverEntry中初始化的是DriverObject->MajorFunction,而 passthru中初始化的是miniport和protocal驱动的结构,passthru不也是驱动吗?我看了别人的贴自,说passthru是filter不是imd,为什莫这莫说? 小生在这里谢过了。 我一定会给分!!!不过我现在还不知道怎末给!!! |
|
沙发#
发布于:2002-03-11 18:31
用户被禁言,该主题自动屏蔽! |
|
板凳#
发布于:2002-03-11 18:42
看来你不做驱动是不行的了。
|
|
地板#
发布于:2002-03-11 21:09
大猫头鹰macy先生:
感谢你的回答,根据你的提示,我找到了如何编写raw socket截获数据包的程序,但有两点问题,原码如下(我做了修改): #include \"stdafx.h\" #include <stdio.h> #include \"winsock2.h\" #include \"stdlib.h\" #include \"errno.h\" //#include \"IPHlpApi.h\" //#include \"mstcpip.h\" void init(void); //void GetProtocol(int num, char *str); void recv_packet(char *host, int sockfd); void getippak(int SockRaw); typedef struct _IPHEADER { unsigned char header_len:4; 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; ///////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// FILE * fp; int main()//int argc, char* argv[] { char *host=\"localhost\"; int sockfd; init(); sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_IP);//IPPROTO_IP); if(sockfd<0) { printf(\"socket error->%s\\n\",strerror(errno)); exit(1); } getippak(sockfd); recv_packet(host,sockfd); fclose(fp); return(0); } /////////////////////////////////////////////////////// void init(void) { WORD wVersion; WSADATA wsaData; int err; wVersion=MAKEWORD(2,0); err=WSAStartup(wVersion,&wsaData); if(err!=0) exit(1); fp=fopen(\"d:\\\\log.txt\",\"a+\"); } /////////////////////////////////////////////////////// void recv_packet(char *host, int sockfd) { char recvbuf[512]; // int len; int n; long count=0; for(;;) { memset(recvbuf,0,sizeof(recvbuf)); n=recvfrom(sockfd,recvbuf,sizeof(recvbuf),0,NULL,NULL); //GetLastError(); //MessageBox(NULL,(char *)GetLastError(),\"\",0); if(n<0) { continue; } else { for(int i=0;i<n;i++) { fprintf(fp,\"%c\",*(recvbuf+i)); } } printf(\"\\n\\n\"); } } /////////////////////////////////////////////////////////////// void getippak(int SockRaw) { #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) //³õʼ»¯SOCKET #define MAX_HOSTNAME_LAN 257 // WSADATA wsaData; int iErrorCode; //iErrorCode = WSAStartup(MAKEWORD(2,1),&wsaData); //CheckSockError(iErrorCode, \"WSAStartup\"); //SockRaw = socket(AF_INET , SOCK_RAW , IPPROTO_IP); //CheckSockError(SockRaw, \"socket\"); //»ñÈ¡±¾»úIPµØÖ? char FAR name[MAX_HOSTNAME_LAN]; iErrorCode = gethostname(name, MAX_HOSTNAME_LAN); //CheckSockError(iErrorCode, \"gethostname\"); struct hostent FAR * pHostent; pHostent = gethostbyname(name); SOCKADDR_IN sa; sa.sin_family = AF_INET; sa.sin_port = htons(80);//6000); memcpy(&sa.sin_addr.S_un.S_addr, pHostent->h_addr_list[0], pHostent->h_length); iErrorCode = bind(SockRaw, (PSOCKADDR)&sa, sizeof(sa)); DWORD dwBufferLen[10] ; DWORD dwBufferInLen = 1 ; DWORD dwBytesReturned = 0 ; iErrorCode=WSAIoctl(SockRaw, SIO_RCVALL,&dwBufferInLen, sizeof(dwBufferInLen),&dwBufferLen, sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL ); } 问题: 1、为什末它要将raw socket和本地的80端口做邦定? 2、我用文件保存内容可以,但不能加入我的注释,一旦加入象recv data=%s这样的程序,就会有很多recv data=这样的字符串出现,就算使用控制台打出也是一样的,程序中我只打了接收到的内容,还可以,为什末?我要将这些数据保存下来,怎样做?用共享内存吗?我不知道有什末好的方法,请指教。 3、raw socket能不能收到让本地发出去的包,怎样做。 4、recvfrom是不是收到一个ip包就返回一次?这样的话我是不是就可以用ip头格式化buf,然后再分析其中的协议,以及数据? 如能回答或提出建议,大大有分!!! |
|
地下室#
发布于:2002-03-11 21:34
用户被禁言,该主题自动屏蔽! |
|
5楼#
发布于:2002-03-11 21:50
2、我的意思是,我收到的数据,如果用控制台打出来的话,加上点东西就会出错,这我可以去自己研究一下。 3、我不明白什末意思:“但是在本机上就不行了,比如访问本机的web”,是不是本机做web服务器? 4、如果数据量太大,按照普通的处理方法,就是直接操作recvfrom收来的缓冲区,会不会因为太慢而丢包!? 我为什末只能给你加一次分? |
|
6楼#
发布于:2002-03-12 09:01
用户被禁言,该主题自动屏蔽! |
|
7楼#
发布于:2002-03-12 09:18
大猫头鹰先生:
非常感谢您的回答,虽然我还有问题,但也不想问了,我听您的,去vc论坛了,祝您天天快乐,万事顺心,次次中大奖!!! 斐珩 |
|