feiheng
驱动牛犊
驱动牛犊
  • 注册日期2002-03-07
  • 最后登录2002-03-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1878回复:7

救命的意思是,再不(救)就出人(命)了!!!

楼主#
更多 发布于:2002-03-11 10:46
各位大虾:
    小生自认为什末都不懂,老板让做个网络数据包分析计费软件,在下看了很多东西,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,为什莫这莫说?
小生在这里谢过了。
我一定会给分!!!不过我现在还不知道怎末给!!!
macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-03-11 18:31
用户被禁言,该主题自动屏蔽!
software
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录2012-08-07
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-03-11 18:42
   看来你不做驱动是不行的了。
feiheng
驱动牛犊
驱动牛犊
  • 注册日期2002-03-07
  • 最后登录2002-03-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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) //&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;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\");
//&raquo;&ntilde;&Egrave;&iexcl;±&frac34;&raquo;úIP&micro;&Oslash;&Ouml;?
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,然后再分析其中的协议,以及数据?
如能回答或提出建议,大大有分!!!
macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2002-03-11 21:34
用户被禁言,该主题自动屏蔽!
feiheng
驱动牛犊
驱动牛犊
  • 注册日期2002-03-07
  • 最后登录2002-03-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-03-11 21:50

2、我的意思是,我收到的数据,如果用控制台打出来的话,加上点东西就会出错,这我可以去自己研究一下。
3、我不明白什末意思:“但是在本机上就不行了,比如访问本机的web”,是不是本机做web服务器?
4、如果数据量太大,按照普通的处理方法,就是直接操作recvfrom收来的缓冲区,会不会因为太慢而丢包!?

我为什末只能给你加一次分?

macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2002-03-12 09:01
用户被禁言,该主题自动屏蔽!
feiheng
驱动牛犊
驱动牛犊
  • 注册日期2002-03-07
  • 最后登录2002-03-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-03-12 09:18
大猫头鹰先生:
    非常感谢您的回答,虽然我还有问题,但也不想问了,我听您的,去vc论坛了,祝您天天快乐,万事顺心,次次中大奖!!!
                                              斐珩
游客

返回顶部