晴天2030
计算机网络的毕业设计 我刚才看到一个网站 三七毕业设计论文网 里面有专门的网络专区给你参考一下吧,希望能够帮到你的忙~计算机网络论文-网络嗅探器的设计与实现.-- 10-31 分析网络流量监控的工具的设计|计算机网络论文|网络毕业设计-- 10-31 网路毕业设计-网络数据包分析工具的设计与开发-- 10-31 基于Linux环境下的网络层加密解密的实现-- 10-31 基于网络的虚拟实验平台—VLP2P通信库的设计与实现-- 10-31 C语言Linux环境下的网络管理控制系统-- 10-31 关于网络数据包捕获工具的程序设计-- 10-31 VC网络数据包的协议分析研究-- 10-31 网络毕业论文-网络数据包的协议分析程序的设计开发-- 10-31 动态升级模块的设计与实现[网络中的虚拟实验平台]-- 10-31 网络毕业设计-3G的AKA协议中F1至F5的服务网络端实现-- 10-31 社会网络相关技术的论文范例-- 10-31 计算机网络-服务推荐社会网络模型的构建方法及研究-- 10-31 校园网组建|计算机校园局域网组建与互连|学校网络组建-- 10-27
queeniechen2007
文章比较长,得慢点看。转载 利用HOOK拦截封包原理 截获API是个很有用的东西,比如你想分析一下别人的程序是怎样工作的。这里我介绍一下一种我自己试验通过的方法。 首先,我们必须设法把自己的代码放到目标程序的进程空间里去。Windows Hook可以帮我们实现这一点。SetWindowsHookEx的声明如下: HHOOK SetWindowsHookEx( int idHook, // hook type HOOKPROC lpfn, // hook procedure HINSTANCE hMod, // handle to application instance DWORD dwThreadId // thread identifier ); 具体的参数含义可以翻阅msdn,没有msdn可谓寸步难行。 这里Hook本身的功能并不重要,我们使用它的目的仅仅只是为了能够让Windows把我们的代码植入别的进程里去。hook Type我们任选一种即可,只要保证是目标程序肯定会调用到就行,这里我用的是WH_CALLWNDPROC。lpfn和hMod分别指向我们的钩子代码及其所在的dll,dwThreadId设为0,表示对所有系统内的线程都挂上这样一个hook,这样我们才能把代码放到别的进程里去。 之后,我们的代码就已经进入了系统内的所有进程空间了。必须注意的是,我们只需要截获我们所关心的目标程序的调用,因此还必须区分一下进程号。我们自己的钩子函数中,第一次运行将进行最重要的API重定向的工作。也就是通过将所需要截获的API的开头几个字节改为一个跳转指令,使其跳转到我们的API中来。这是最关键的部分。这里我想截三个调用,中的send和recv、中的GetMessageA。 DWORD dwCurrentPID = 0; HHOOK hOldHook = NULL; DWORD pSend = 0; DWORD pRecv = 0; GETMESSAGE pGetMessage = NULL; BYTE btNewBytes[8] = { 0x0B8, 0x0, 0x0, 0x40, 0x0, 0x0FF, 0x0E0, 0 }; DWORD dwOldBytes[3][2]; HANDLE hDebug = INVALID_HANDLE_value; LRESULT CALLBACK CallWndProc( int nCode, WPARAM wParam, LPARAM lParam ) { DWORD dwSize; DWORD dwPIDWatched; HMODULE hLib; if( dwCurrentPID == 0 ) { dwCurrentPID = GetCurrentProcessId(); HWND hwndMainHook; hwndMainHook = ::FindWindow( 0, "MainHook" ); dwPIDWatched = ::SendMessage( hwndMainHook, (WM_USER+100), 0, 0 ); hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 ); if( dwCurrentPID == dwPIDWatched ) { hLib = LoadLibrary( "" ); pSend = (DWORD)GetProcAddress( hLib, "send" ); pRecv = (DWORD)GetProcAddress( hLib, "recv" ); ::ReadProcessMemory( INVALID_HANDLE_value, (void *)pSend, (void *)dwOldBytes[0], sizeof(DWORD)*2, &dwSize ); *(DWORD *)( btNewBytes + 1 ) = (DWORD)new_send; ::WriteProcessMemory( INVALID_HANDLE_value, (void *)pSend, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize ); ::ReadProcessMemory( INVALID_HANDLE_value, (void *)pRecv, (void *)dwOldBytes[1], sizeof(DWORD)*2, &dwSize ); *(DWORD *)( btNewBytes + 1 ) = (DWORD)new_recv; ::WriteProcessMemory( INVALID_HANDLE_value, (void *)pRecv, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize ); hLib = LoadLibrary( "" ); pGetMessage = (GETMESSAGE)GetProcAddress( hLib, "GetMessageA" ); ::ReadProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)dwOldBytes[2], sizeof(DWORD)*2, &dwSize ); *(DWORD *)( btNewBytes + 1 ) = (DWORD)new_GetMessage; ::WriteProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize ); hDebug = ::CreateFile( "C:\\", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 ); } } if( hOldHook != NULL ) { return CallNextHookEx( hOldHook, nCode, wParam, lParam ); } return 0; } 上面的钩子函数,只有第一次运行时有用,就是把三个函数的首8字节修改一下(实际上只需要7个)。btNewBytes中的指令实际就是 mov eax, 0x400000 jmp eax 这里的0x400000就是新的函数的地址,比如new_recv/new_send/new_GetMessage,此时,偷梁换柱已经完成。再看看我们的函数中都干了些什么。以GetMessageA为例: BOOL _stdcall new_GetMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax ) { DWORD dwSize; char szTemp[256]; BOOL r = false; //Watch here before it's executed. sprintf( szTemp, "Before GetMessage : HWND 0x%, msgMin 0x%, msgMax 0x% \r\n", hWnd, wMsgFilterMin, wMsgFilterMax ); ::WriteFile( hDebug, szTemp, strlen(szTemp), &dwSize, 0 ); //Watch over // restore it at first ::WriteProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)dwOldBytes[2], sizeof(DWORD)*2, &dwSize ); // execute it r = pGetMessage( lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax ); // hook it again *(DWORD *)( btNewBytes + 1 ) = (DWORD)new_GetMessage; ::WriteProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize ); //Watch here after it's executed sprintf( szTemp, "Result of GetMessage is %d.\r\n", r ); ::WriteFile( hDebug, szTemp, strlen( szTemp ), &dwSize, 0 ); if( r ) { sprintf( szTemp, "Msg : HWND 0x%, MSG 0x%, wParam 0x%, lParam 0x%\r\nTime 0x%, X %d, Y %d\r\n", lpMsg->hwnd, lpMsg->message, lpMsg->wParam, lpMsg->lParam, lpMsg->time, lpMsg->, lpMsg-> ); ::WriteFile( hDebug, szTemp, strlen( szTemp ), &dwSize, 0 ); } strcpy( szTemp, "\r\n" ); ::WriteFile( hDebug, szTemp, strlen( szTemp ), &dwSize, 0 ); //Watch over return r; } 先将截获下来的参数,写入到一个log文件中,以便分析。然后恢复原先保留下来的GetMessageA的首8字节,然后执行真正的GetMessageA调用,完毕后再将执行结果也写入log文件,然后将GetMessageA的执行结果返回给调用者。 整个截获的过程就是这样。你可以把其中的写log部分改成你自己想要的操作。这里有个不足的地方是,截获动作是不能够并发进行的,如果目标进程是多线程的,就会有问题。解决办法是,可以在每次new_GetMessage中加入一个CriticalSection的锁和解锁,以使调用变为串行进行,以原始套接字的方式 截获流经本机网卡的IP数据包 从事网络安全的技术人员和相当一部分准黑客(指那些使用现成的黑客软件进行攻击而不是根据需要去自己编写代码的人)都一定不会对网络嗅探器(sniffer)感到陌生,网络嗅探器无论是在网络安全还是在黑客攻击方面均扮演了很重要的角色。通过使用网络嗅探器可以把网卡设置于混杂模式,并可实现对网络上传输的数据包的捕获与分析。此分析结果可供网络安全分析之用,但如为黑客所利用也可以为其发动进一步的攻击提供有价值的信息。可见,嗅探器实际是一把双刃剑。 虽然网络嗅探器技术被黑客利用后会对网络安全构成一定的威胁,但嗅探器本身的危害并不是很大,主要是用来为其他黑客软件提供网络情报,真正的攻击主要是由其他黑软来完成的。而在网络安全方面,网络嗅探手段可以有效地探测在网络上传输的数据包信息,通过对这些信息的分析利用是有助于网络安全维护的。权衡利弊,有必要对网络嗅探器的实现原理进行介绍。 文章正文 嗅探器设计原理 嗅探器作为一种网络通讯程序,也是通过对网卡的编程来实现网络通讯的,对网卡的编程也是使用通常的套接字(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结构 = *(in_addr *)pHost->h_addr_list[0]; //IP = AF_INET; = 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 + ); TRACE("协议: %s\r\n",GetProtocolTxt()); TRACE("IP源地址: %s\r\n",inet_ntoa(*(in_addr*)&)); TRACE("IP目标地址: %s\r\n",inet_ntoa(*(in_addr*)&)); TRACE("TCP源端口号: %d\r\n",); TRACE("TCP目标端口号:%d\r\n",); TRACE("数据包长度: %d\r\n\r\n\r\n",ntohs()); } } 其中,在进行协议分析时,使用了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; } 最后,为了使程序能成功编译,需要包含头文件和。在本示例中将分析结果用TRACE()宏进行输出,在调试状态下运行,得到的一个分析结果如下: 协议: UDP IP源地址: IP目标地址: TCP源端口号: 16707 TCP目标端口号:19522 数据包长度: 78 …… 协议: TCP IP源地址: IP目标地址: TCP源端口号: 19714 TCP目标端口号:10 数据包长度: 200 …… 从分析结果可以看出,此程序完全具备了嗅探器的数据捕获以及对数据包的分析等基本功能。 小结 本文介绍的以原始套接字方式对网络数据进行捕获的方法实现起来比较简单,尤其是不需要编写VxD虚拟设备驱动程序就可以实现抓包,使得其编写过程变的非常简便,但由于捕获到的数据包头不包含有帧信息,因此不能接收到与 IP 同属网络层的其它数据包, 如 ARP数据包、RARP数据包等。在前面给出的示例程序中考虑到安全因素,没有对数据包做进一步的分析,而是仅仅给出了对一般信息的分析方法。通过本文的介绍,可对原始套接字的使用方法以及TCP/IP协议结构原理等知识有一个基本的认识。
馋猫儿星星
随着互联网技术的不断发展,网络工程专业越来越受到国家和社会的关注,我们在写作网络工程 毕业 论文时,题目也是值得我们关注的。下面是我带来的关于网络工程毕业论文题目的内容,欢迎阅读参考!网络工程毕业论文题目(一) 1. 基于 Web的分布式 EMC数据库集成查询系统 2. 基于 Web的网络课程的设计 3. 基于工作流的业务系统开发 4. B1级安全数据库设计的设计与实现 5. 数据库加密及密钥管理 方法 研究 6. 企业应用集成(EAI)中数据集成技术的应用 7. 基于数据仓库连锁店决策支持系统模型的研究 8. VC开发基于 Office 组件应用程序 9. 从 XML到关系数据库映射技术研究 10. ORACLE9i 数据库系统性能优化研究与实践 11. MIS系统统用报表的设计与实现 12. 数字机顶盒系统的软件加密设计 13. 网上体育用品店的ASP实现 14. 基于ASP的毕业设计管理系统 15. 基于ASP的考务管理系统 16. 如何在网上营销好生意 17. 网上商店顾客消费心理的研究 18. 信息产品与网络营销 19. 网络营销中的 广告 策略研究 20. 网络营销中的价格策略研究 网络工程毕业论文题目(二) 1. 网络校园网络工程综合布线方案 2. ARP攻击与防护 措施 及解决方案 3. 路由器及其配置分析 4. 服务器的配置与为维护 5. 入侵检测技术研究 6. 复杂环境下网络嗅探技术的应用及防范措施 7. 网络病毒技术研究 8. 网络蠕虫传播模型的研究 9. 无尺度网络中邮件蠕虫的传播与控制 10. 网络路由协议研究 11. 可动态配置的移动网络协议设计研究 12. Ipv4/Ipv6 双协议栈以太网接入认证和移动技术 13. 虚拟路由器的体系结构及实现 14. 一种基于分布式并行过滤得前置式邮件过滤模型 15. XML应用于信息检索的研究 16. JMX框架下 SNMP适配器的实现与应用 17. MANET 路由协议性能分析 18. Internet用户 Ipv6 协议试验网设计与实现 19. 基于光纤通道的网络文件管理系统设计与实现 20. 网络拓扑结构的测量协议与技术 21. 办公业务对象在关系数据库中的存储 网络工程毕业论文题目(三) 1、基于协同过滤的个性化Web推荐 2、Web导航中用户认知特征及行为研究 3、Web服务器集群系统的自适应负载均衡调度策略研究 4、动态Web技术研究 5、语义Web服务的关键技术研究 6、面向语义Web服务的发现机制研究 7、Web服务组合研究与实现 8、构建REST风格的Web应用程序 9、企业架构下WebService技术的研究 10、Web回归桌面的研究与应用 11、Web服务选择的研究 12、Web服务的授权访问控制机制研究 13、基于WEB标准的网络课程设计与开发 14、基于Web的教师个人知识管理系统的设计与开发 15、基于Android平台的手机Web地图服务设计 16、基于Web的信息管理系统架构的研究 17、基于Web使用挖掘的网站优化策略研究 18、基于Web的自适应测试系统的研究 19、面向语义Web服务的发现机制研究 20、面向语义Web服务的分布式服务发现研究 猜你喜欢: 1. 最新版网络工程专业毕业论文题目 2. 网络工程论文题目 3. 网络工程专业毕业论文题目 4. 网络工程专业毕业论文精选范文 5. 网络工程论文选题 6. 关于网络工程毕业论文范文
计算机网络的毕业设计 我刚才看到一个网站 三七毕业设计论文网 里面有专门的网络专区给你参考一下吧,希望能够帮到你的忙~计算机网络论文-网络嗅探器的设计与实现.
运用对比,必须对所要表达的事物的矛盾本质有深刻的认识。对比的两种事物或同一事物的两个方面,应该有互相对立的关系,否则是不能构成对比的。
可以百度一下
1. 智能压力传感器系统设计 2. 智能定时器 3. 液位控制系统设计 4. 液晶控制模块的制作 5. 嵌入式激光打标机运动控制卡软件系统设计 6.
你看下这篇文章跟网站设计相关的主要内容:1)本课题是结合我院新型轮机模拟器的子专题“主机遥控装置仿真”进行的。仿真对象为中国海运集团总公司所属的集装箱船“新大连