完美者(wmzhe.com)网站以软件下载为基础,改版后的网站对功能性板块进行扩充,以期能够解决用户在软件使用过程中遇见的所有问题。网站新增了“软件百科”、“锦囊妙技”等频道,可以更好地对用户的软件使用全周期进行更加专业地服务。
PortExpert是一个易于使用的应用程序,允许您监视的应用程序在您的计算机上当前正在运行,并且需要互联网访问。该软件可以列出在其运行时访问的 Web 页和指示哪个 IP 地址正在被打开的所有进程。
PortExpert 可以监视访问互联网网页,而它们在您的计算机,使它成为一个合适的解决方案为您的系统免受未知风险上运行的软件。此外,它可以显示本地连接,系统进程,并具有时间冻结功能,允许您在某一时刻分析所有受监视的应用程序。
新功能
[错误]托盘菜单没有效果 — — 解决"退出"命令
"锦囊妙技"栏目是聚合全网软件使用的技巧或者软件使用过程中各种问题的解答类文章,栏目设立伊始,小编欢迎各路软件大神朋友们踊跃投稿,在完美者平台分享大家的独门技巧。
本站文章素材来源于网络,大部分文章作者名称佚失,为了更利于用户阅读和使用,根据需要进行了重新排版和部分改编,本站收录文章只是以帮助用户解决实际问题为目的,如有版权问题请联系小编修改或删除,谢谢合作。
软件大小:509.10 KB
以原始套接字的方式 截获流经本机网卡的IP数据包嗅探器作为一种网络通讯程序,也是通过对网卡的编程来实现网络通讯的,对网卡的编程也是使用通常的套接字(socket)方式来进行。但是,通常的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。而网络嗅探器的目的恰恰在于从网卡接收所有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的。显然,要达到此目的就不能再让网卡按通常的正常模式工作,而必须将其设置为混杂模式。 具体到编程实现上,这种对网卡混杂模式的设置是通过原始套接字(raw socket)来实现的,这也有别于通常经常使用的数据流套接字和数据报套接字。在创建了原始套接字后,需要通过setsockopt()函数来设置IP头操作选项,然后再通过bind()函数将原始套接字绑定到本地网卡。为了让原始套接字能接受所有的数据,还需要通过ioctlsocket()来进行设置,而且还可以指定是否亲自处理IP头。至此,实际就可以开始对网络数据包进行嗅探了,对数据包的获取仍象流式套接字或数据报套接字那样通过recv()函数来完成。但是与其他两种套接字不同的是,原始套接字此时捕获到的数据包并不仅仅是单纯的数据信息,而是包含有 IP头、 TCP头等信息头的最原始的数据信息,这些信息保留了它在网络传输时的原貌。通过对这些在低层传输的原始信息的分析可以得到有关网络的一些信息。由于这些数据经过了网络层和传输层的打包,因此需要根据其附加的帧头对数据包进行分析。下面先给出结构.数据包的总体结构:数据包 IP头 TCP头(或其他信息头) 数据 数据在从应用层到达传输层时,将添加TCP数据段头,或是UDP数据段头。其中UDP数据段头比较简单,由一个8字节的头和数据部分组成,具体格式如下:16位 16位 源端口 目的端口 UDP长度 UDP校验和 而TCP数据头则比较复杂,以20个固定字节开始,在固定头后面还可以有一些长度不固定的可选项,下面给出TCP数据段头的格式组成:16位 16位 源端口 目的端口 顺序号 确认号 TCP头长 (保留)7位 URG ACK PSH RST SYN FIN 窗口大小 校验和 紧急指针 可选项(0或更多的32位字) 数据(可选项) 对于此TCP数据段头的分析在编程实现中可通过数据结构_TCP来定义:typedef struct _TCP{ WORD SrcPort; // 源端口 WORD DstPort; // 目的端口 DWORD SeqNum; // 顺序号 DWORD AckNum; // 确认号 BYTE DataOff; // TCP头长 BYTE Flags; // 标志(URG、ACK等) WORD Window; // 窗口大小 WORD Chksum; // 校验和 WORD UrgPtr; // 紧急指针 } TCP; typedef TCP *LPTCP; typedef TCP UNALIGNED * ULPTCP; 在网络层,还要给TCP数据包添加一个IP数据段头以组成IP数据报。IP数据头以大端点机次序传送,从左到右,版本字段的高位字节先传输(SPARC是大端点机;Pentium是小端点机)。如果是小端点机,就要在发送和接收时先行转换然后才能进行传输。IP数据段头格式如下:16位 16位 版本 IHL 服务类型 总长 标识 标志 分段偏移 生命期 协议 头校验和 源地址 目的地址 选项(0或更多) 同样,在实际编程中也需要通过一个数据结构来表示此IP数据段头,下面给出此数据结构的定义:typedef struct _IP{ union{ BYTE Version; // 版本 BYTE HdrLen; // IHL }; BYTE ServiceType; // 服务类型 WORD TotalLen; // 总长 WORD ID; // 标识 union{ WORD Flags; // 标志 WORD FragOff; // 分段偏移 }; BYTE TimeToLive; // 生命期 BYTE Protocol; // 协议 WORD HdrChksum; // 头校验和 DWORD SrcAddr; // 源地址 DWORD DstAddr; // 目的地址 BYTE Options; // 选项 } IP; typedef IP * LPIP; typedef IP UNALIGNED * ULPIP; 在明确了以上几个数据段头的组成结构后,就可以对捕获到的数据包进行分析了。嗅探器的具体实现 根据前面的设计思路,不难写出网络嗅探器的实现代码,下面就给出一个简单的示例,该示例可以捕获到所有经过本地网卡的数据包,并可从中分析出协议、IP源地址、IP目标地址、TCP源端口号、TCP目标端口号以及数据包长度等信息。由于前面已经将程序的设计流程讲述的比较清楚了,因此这里就不在赘述了,下面就结合注释对程序的具体是实现进行讲解,同时为程序流程的清晰起见,去掉了错误检查等保护性代码。主要代码实现清单为:// 检查 Winsock 版本号,WSAData为WSADATA结构对象 WSAStartup(MAKEWORD(2, 2), &WSAData); // 创建原始套接字 sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)); // 设置IP头操作选项,其中flag 设置为ture,亲自对IP头进行处理 setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag)); // 获取本机名 gethostname((char*)LocalName, sizeof(LocalName)-1); // 获取本地 IP 地址 pHost = gethostbyname((char*)LocalName)); // 填充SOCKADDR_IN结构 addr_in.sin_addr = *(in_addr *)pHost->h_addr_list[0]; //IP addr_in.sin_family = AF_INET; addr_in.sin_port = htons(57274); // 把原始套接字sock 绑定到本地网卡地址上 bind(sock, (PSOCKADDR)&addr_in, sizeof(addr_in)); // dwValue为输入输出参数,为1时执行,0时取消 DWORD dwValue = 1; // 设置 SOCK_RAW 为SIO_RCVALL,以便接收所有的IP包。其中SIO_RCVALL // 的定义为: #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) ioctlsocket(sock, SIO_RCVALL, &dwValue); 前面的工作基本上都是对原始套接字进行设置,在将原始套接字设置完毕,使其能按预期目的工作时,就可以通过recv()函数从网卡接收数据了,接收到的原始数据包存放在缓存RecvBuf[]中,缓冲区长度BUFFER_SIZE定义为65535。然后就可以根据前面对IP数据段头、TCP数据段头的结构描述而对捕获的数据包进行分析:while (true) { // 接收原始数据包信息 int ret = recv(sock, RecvBuf, BUFFER_SIZE, 0); if (ret > 0) { // 对数据包进行分析,并输出分析结果 ip = *(IP*)RecvBuf; tcp = *(TCP*)(RecvBuf + ip.HdrLen); TRACE("协议: %s\r\n",GetProtocolTxt(ip.Protocol)); TRACE("IP源地址: %s\r\n",inet_ntoa(*(in_addr*)&ip.SrcAddr)); TRACE("IP目标地址: %s\r\n",inet_ntoa(*(in_addr*)&ip.DstAddr)); TRACE("TCP源端口号: %d\r\n",tcp.SrcPort); TRACE("TCP目标端口号:%d\r\n",tcp.DstPort); TRACE("数据包长度: %d\r\n\r\n\r\n",ntohs(ip.TotalLen)); } } 其中,在进行协议分析时,使用了GetProtocolTxt()函数,该函数负责将IP包中的协议(数字标识的)转化为文字输出,该函数实现如下:#define PROTOCOL_STRING_ICMP_TXT "ICMP" #define PROTOCOL_STRING_TCP_TXT "TCP" #define PROTOCOL_STRING_UDP_TXT "UDP" #define PROTOCOL_STRING_SPX_TXT "SPX" #define PROTOCOL_STRING_NCP_TXT "NCP" #define PROTOCOL_STRING_UNKNOW_TXT "UNKNOW" …… CString CSnifferDlg::GetProtocolTxt(int Protocol) { switch (Protocol){ case IPPROTO_ICMP : //1 /* control message protocol */ return PROTOCOL_STRING_ICMP_TXT; case IPPROTO_TCP : //6 /* tcp */ return PROTOCOL_STRING_TCP_TXT; case IPPROTO_UDP : //17 /* user datagram protocol */ return PROTOCOL_STRING_UDP_TXT; default: return PROTOCOL_STRING_UNKNOW_TXT; } 最后,为了使程序能成功编译,需要包含头文件winsock2.h和ws2tcpip.h。在本示例中将分析结果用TRACE()宏进行输出,在调试状态下运行,得到的一个分析结果如下:协议: UDP IP源地址: 172.168.1.5 IP目标地址: 172.168.1.255 TCP源端口号: 16707 TCP目标端口号:19522 数据包长度: 78 …… 协议: TCP IP源地址: 172.168.1.17 IP目标地址: 172.168.1.1 TCP源端口号: 19714 TCP目标端口号:10 数据包长度: 200 …… 从分析结果可以看出,此程序完全具备了嗅探器的数据捕获以及对数据包的分析等基本功能。 小结 本文介绍的以原始套接字方式对网络数据进行捕获的方法实现起来比较简单,尤其是不需要编写VxD虚拟设备驱动程序就可以实现抓包,使得其编写过程变的非常简便,但由于捕获到的数据包头不包含有帧信息,因此不能接收到与 IP 同属网络层的其它数据包, 如 ARP数据包、RARP数据包等。在前面给出的示例程序中考虑到安全因素,没有对数据包做进一步的分析,而是仅仅给出了对一般信息的分析方法。通过本文的介绍,可对原始套接字的使用方法以及TCP/IP协议结构原理等知识有一个基本的认识。本文所述代码在Windows 2000下由Microsoft Visual C++ 6.0编译调试通过。
beyond port expert除了港口专家beyond英 [bɪˈjɒnd] 美 [bɪˈjɑ:nd] prep.超过; 越过; 那一边; 在…较远的一边adv.在远处; 在更远处n.远处
fob: 离岸价词形变化: 动词过去式:fobbed 过去分词:fobbed 现在分词:fobbing 第三人称单数:fobs 例句与用法: 1. You can't fob an expert off with cheap imitations. 用廉价的仿制品骗不了行家. 2. I won't be fobbed off this time I'm determined to say what I think. 这次我可不上当了--我一定要把想法说出来.3. Don't try fobbing off last year's goods on me! 别想拿去年的陈货来骗我! 4. Can you make an offer on fob basis? 能报给我离岸价吗? port: 港口词形变化: 动词过去式:ported 过去分词:ported 现在分词:porting 第三人称单数:ports 例句与用法: 1. It cost us a lot of money to get the goods from the port to our factory. 把货物从港口运到我们工厂花了一大笔钱。 2. London used to be Britain's largest port. 伦敦过去是英国最大的港口城市。 3. The ship embarked passengers and food at a Spanish port. 这艘船在西班牙的一个港口装载了乘客和食品。 4. The priest blessed the ship before it left port. 牧师在船离港之前为其祝福。 5. Ships must follow the channel into the port. 船只必须沿航道进入港口。 6. When the ship reached port, it bore abundant evidence of the severity of the storm. 船抵港时,船上满是受到暴风雨肆虐的痕迹。 7. Rick often watched the boats returning to port in the late afternoon. 瑞克常常看到小船在傍晚正回到港口。
我原来遇到过这个问题,你用的可能是内部振荡器,F340的内部时钟频率有2%的误差,所以你可以调整一下波特率定时器的初始值 假定你计算出来的定时器初始值应该是TH0=0X3A,可以试着修改为0X3B,0X3C,0X39,0X38 试试看(波特率不能太高,否则无法修正) 或者换外部晶体 11.0592M 等 , 这样就不会有误差另外有可能是上位机接收软件的问题 ,我原来用过端口专家(PortExpert),有时会出现接收数据错误,可能需要重新启动几次端口专家(PortExpert) 才正确