




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第5讲网络安全编程讲网络安全编程2 2基于基于TCPTCP的的socketsocket编程编程服务器端程序:服务器端程序:1、创建套接字(socket);2、将套接字绑定到一个本地地址和端口上(bind);3、将套接字设为监听模式,准备接收客户请求(listen);4、等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept);5、用返回的套接字和客户端进行通信(send/recv);6、返回,等待另一客户请求;7、关闭套接字。3 3基于基于TCPTCP的的socketsocket编程编程客户端程序:客户端程序:1、创建套接字(socket);2、向服务
2、器发出连接请求(connect);3、和服务器端进行通信(send/recv);4、关闭套接字。4 4基于基于C /SC /S模型的时序图模型的时序图5 5基于基于UDPUDP的的socketsocket编程编程服务器端(接收端)程序:服务器端(接收端)程序:1、创建套接字(socket);2、将套接字绑定到一个本地地址和端口上(bind);3、等待接收数据(recvfrom);4、关闭套接字。6 6基于基于UDPUDP的的socketsocket编程编程客户端(发送端)程序:客户端(发送端)程序:1、创建套接字(socket);2、向服务器发送数据(sendto);3、关闭套接字。7 7套接
3、字系统调用套接字系统调用创建套接字创建套接字socket( )指定本地地址指定本地地址bind( )建立套接字连接建立套接字连接connect( )接收连接请求接收连接请求listen( )和accept( )发送数据发送数据write( )、writev( )、send( )与 sendto( )、sendmsg( )接收数据接收数据read( )、readv( )、recv( )和recvfrom( )、recvmsg( )其他系统调用其他系统调用gethostbyname( )、getservbyname( )8 8WSAStartup( )WSAStartup( )函数说明函数说明in
4、t int WSAStartupWSAStartup( WORD ( WORD wVersionRequested, , LPWSADATA LPWSADATA lpWSAData ); );wVersionRequestedwVersionRequested:准备加载的Winsock库的版本。高位字节指定所需要的Winsock库的副版本,而低位字节则是主版本。可用MAKEWORDMAKEWORD(x,y)(其中,x是高位字节,y是低位字节)方便地获得wVersionRequested的正确值。lpWSADatalpWSAData:指向WSADATA结构的指针,WSAStartup用其加载的库
5、版本有关的信息填在此结构中。9 9typedef struct WSAData WORD wVersion; WORD wHighVersion; char szDescriptionWSADESCRIPTION_LEN+1; char szSystemStatusWSASYS_STATUS_LEN+1; unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; WSADATA, *LPWSADATA; WSADATAWSADATA结构结构1010wVersionwVersion:设成要使用的W
6、insock版本wHighVersionwHighVersion :现有的Winsock库的最高版本。szDescriptionszDescription和szSystemStatusszSystemStatus:由特定的Winsock实施方案设定,事实上没有用。iMaxSocketsiMaxSockets:最多可打开多少套接字(建议不使用)iMaxUdpDgiMaxUdpDg:数据报的最大长度(建议不使用) (数据报的最大长度应该通过WSAEnumProtocols来查询协议信息。同时最多可打开套接字的数目不是固定的,与可用物理内存的多少有关。lpVendorInfolpVendorInfo
7、:厂商信息预留WSADATAWSADATA结构结构1111如果WinSock.dll或底层网络子系统没有被正确初始化或没有被找到,WSAStartup将返回WSASYSNOTREADY;此函数允许协商WinSock版本:若请求的版本等于或高于DLL所支持的最低版本,WSAData的wVersion所支持的最高版本与请求版本中较小的那个。如果请求的版本低于DLL所支持的最低版本,将返回WSAVERNOTSUPPORTED。成功调用返回一个成功调用返回一个0 0;在最后都对应一个WSACleanUp以便释放为该应用程序分配的资源。 WSAStartup( )WSAStartup( )函数说明函数说
8、明1212函数函数SOCKET( )SOCKET( )说明说明SOCKET ( int afaf, int typetype, int protocolprotocol );AfAf:指定地址族,对于TCP/IP只能是AF_INET;TypeType:Socket类型,对于V1.1 ,只支持SOCK_STREAM及SOCK_DGRAM;ProtocolProtocol:与特定的地址家族相关的协议。如果指定为0,系统自动选择合适的协议(推荐使用)函数调用成功,将返回一个新的SOCKET类型的套接字描述符如果调用失败,返回INVALID_SOCKET。错误信息可以通过WSAGetLastError
9、函数返回。1313bind( )bind( )函数说明函数说明int bindbind( SOCKET s, const struct sockaddr FAR *name, int namelen );s s:指定要绑定的套接字;namename:指定该套接字的本地地址信息; 它是指向sockaddrsockaddr结构的指针变量,该地址结构是为所有的地址家族准备的,与所使用的网络协议有关;namelennamelen:指定该地址结构的长度。1414bind( )bind( )函数说明函数说明struct u_short sa_family; char sa_data14; ; sa_fam
10、ily:指定该地址族,在这里必须设为AF_INET;sa_data:仅仅表示要求一块内存分配区,该区域中指定与协议相关的具体地址信息。对于不同的协议家族,用不同的结构来替换sockaddr。除了sa_family外,sockaddr是按网络字节顺序表示的。在TCP/IP中,用sockaddr_in结构替换sockaddr,以方便我们填写地址信息。 1515struct short ; unsigned short ; struct in_addr ; char sin_zero8; ;:表示地址族,对于IP地址是AF_INET;:将要分配给套接字的端口;:主机IP地址;:只是一个填充数,以使s
11、ockaddr_in结构和sockaddr结构的长度一样。1616如果函数调用成功,返回0;若失败返回SOCKET_ERROR。错误信息可以通过WSAGetLastError函数返回。 1 1、一般将IP地址指定为INADDR_ANYINADDR_ANY,允许套接字向任何分配给本地机器的IP地址发送或接收数据。 2 2、可用inet_addr( 6 ) 指定实际IP地址;inet_addr( )inet_addr( ) 返回一个适合分配给S_addr的u_long类型的数值inet_ntoa( )inet_ntoa( ) 完成相反的转换,接受一个in_addr结构体类型的
12、参数并返回一个以点分十进制格式表示的IP地址字符串。bind( )bind( )函数说明函数说明1717面向连接的服务器进程通过listen( )和accept( )两个函数来接收并处理客户进程的连接请求。1isten( )是将指定的套接字设为监听状态。int listen(SOCKET sockidlisten(SOCKET sockid,int backlog);int backlog);sockidsockid:套接字描述符(即前面创建的套接字);backlogbacklog:等待队列的最大长度(注:并非在一个端口可同时连接的数目!)1818accept() 用于服务器进程接收客户进程发
13、送的连接请求newsock=accept(newsock=accept(sockidsockid,clientaddrclientaddr,addrlenaddrlen) );sockidsockid:套接字描述符(前面已经设为监听);clientaddrclientaddr:客户的地址信息(同bind函数);addrlenaddrlen:客户的地址信息的长度。该函数调用成功后会返回一个新的套接字。1919clientaddrclientaddr:表示指向客户套接字地址结构的指针。clientaddr指向一个初始值为空的地址结构,当accept()调用返回后,客户进程的套接字地址被填入该地址结
14、构中。addrlenaddrlen的初始值为0,当accept()调用返回后,保存了客户进程套接字地址的长度。当accept()调用成功返回后,服务器进程将在sockid指定的套接字上等待接收客户进程的连接请求,该连接请求是客户进程通过connect()系统调用发出的。2020accept( )调用成功后,将请求连接的客户进程的套接字地址填入clientaddrclientaddr、地址长度填入addrlenaddrlen,还将返回一个新的套接字号newsocknewsock;newsock用于服务器处理并发请求,对应于一个从服务器。并利用新的套接字号与客户进程通信(举例:10086);而主服
15、务器进程继续在原来的套接字(套接字号为sockid)上接收其他客户进程的连接请求;当newsock的值小于0时,表明accept()调用出错。2121int send(sockidint send(sockid,buffbuff,bufflenbufflen,flags)flags);可控缓冲发可控缓冲发送送:表示本地套接字号;:表示指向发送缓冲区的指针;:表示发送缓冲区大小;:表示传输控制标志,一般设为0。int recv(sockidint recv(sockid,buffbuff,bufflenbufflen,flags);flags);2222int sendto(sockidint
16、sendto(sockid,buffbuff,bufflenbufflen,flagsflags,dstaddrdstaddr,dstaddrlen);dstaddrlen); 缓冲无连接发送sockid、buff、bufflen、flags参数意义同前;dstaddr:表示指向信宿套接字地址的指针;dstaddrlen:表示信宿套接字地址长度。int recvfromint recvfrom(sockidsockid,buffbuff,bufflenbufflen,flagsflags,dstaddrdstaddr,dstaddrlendstaddrlen);缓冲无连接接收);缓冲无连接接收
17、23231、getservbyname( ):获取Internet上各种标准服务器的端口号;2、gethostbyname( ):获取服务器的IP地址;3、gethostname( ):获取服务器的主机名;4、htons( ):把主机字节(2B)顺序转换成网络字节顺序;5、htonl( ):把主机字节(4B)顺序转换成网络字节顺序;6、ntohs( ):把网络字节顺序转换成主机字节(2B)顺序;h host ost toto n network etwork s shorthorthtonshtons! !2424struct hostent char FAR * h_name; /主机名 c
18、har FAR * FAR * h_aliases; /主机别名 short h_addrtype; /地址类型 short h_length; /地址长度 char FAR * FAR * h_addr_list; /地址列表指针;2525SocketSocket编程编程获取获取IPIP地址地址#include #include void CheckIP(void) /用于获取本机IP地址 WORD wVersionRequested;/存放Winsock版本的值 WSADATA wsaData; char name255;/用于存放主机名 PHOSTENT hostinfo; wVersi
19、onRequested = MAKEWORD( 2, 2 ); /获取Winsock的版本,用于加载Winsock库 if ( WSAStartup( wVersionRequested, &wsaData ) = 0 ) /加载Winsock库,如果返回值为0说明加载成功 if( gethostname (name, sizeof(name) = 0) /判断是否成功的将本地主机名存放入由name参数指定的缓冲区中2626SocketSocket编程编程获取获取IPIP地址地址 if(hostinfo = gethostbyname(name) != NULL) /如果获得主机名成功
20、的话,调用inet_ntoa()函数取得IP地址 LPCSTR ip = inet_ntoa (*(struct in_addr *)*hostinfo-h_addr_list); printf(本机的IP地址是:%sn,ip);/输出IP地址 printf(本机的名称是:%sn,name); WSACleanup( ); /卸载Winsock库,并释放所有资源 int main()CheckIP();/调用CheckIP()函数获得并输出IP地址return 0;ws2_32.lib示例示例62727基于基于TCPTCP的聊天程序编程的聊天程序编程 服务器端:服务器端:1、调用WSASTAR
21、TUP2、建立SOCKET3、用bind()绑定SOCKET4、使服务器处于监听listen()5、接受客户端请求accept()6、用新的SOCKET发送数据send()7、用recv()接收数据8、不需要时调用WSACLEANUP 客户端:客户端:1、建立SOCKET2、用connect()发出请求3、用send()发送数据4、用recv()接收数据示例示例7示例示例82828注册表在计算机中由键名和键值组成,注册表中存储了Window操作系统的所有配置。值的名称值的名称值无名称值无名称2929注册表编程注册表编程1 1、创建注册表键、创建注册表键LONG RegCreateKeyRegC
22、reateKey ( HKEY hKey, / 主键名称 LPCTSTR lpSubKey, / 子键名称或路径 PHKEY phkResult, / 指向创建表项的句柄 );/ 此句柄是后面操作的依据,比如用RegCloseKey( )关闭注册表项2 2、开注册表键、开注册表键LONG RegOpenKeyRegOpenKey ( HKEY hKey, LPCTSTR lpSubKey, PHKEY phkResult);/ 各参数同上3030HKEY_CLASSES_ROOTHKEY_CURRENT_CONFIGHKEY_CURRENT_USERHKEY_LOCAL_MACHINEHKEY
23、_USERSWindows NT: HKEY_PERFORMANCE_DATA Windows 95 and Windows 98: HKEY_DYN_DATA 3131注册表编程注册表编程3 3、写入注册表、写入注册表(条目名称为默认或值为字符串时条目名称为默认或值为字符串时)LONG RegSetValueRegSetValue( HKEY , / 已打开的键的句柄 LPCTSTR, / 若为NULL,则条目名为默认值 DWORD , / 变量的类型,必须是REG_SZ LPCTSTR , / 变量数据的地址,用于存储内容 DWORD / 变量的长度 ); 返回值:不成功返回非0,成功返回
24、ERROR_SUCCESS 3232注册表编程注册表编程4 4、从注册表读数据(、从注册表读数据(条目名称为默认或值为字符串时)条目名称为默认或值为字符串时)LONG RegQueryValue RegQueryValue ( HKEY , / 已打开的键的句柄 LPCTSTR, / 一般为NULL LPCTSTR , / 指向存储变量内容数据的指针 PLONG / 变量的长度 ); 返回值:不成功返回非0,成功返回ERROR_SUCCESS 3333举例1:写注册表#include #include void main() HKEY hKey1; RegCreateKey(HKEY_LOCA
25、L_MACHINE, SOFTWAREMicrosoftHacker, &hKey1); /创建注册表项 RegSetValue(hKey1,NULL,REG_SZ,xiexin,strlen(xiexin); RegCloseKey(hKey1);示例示例93434举例2:读注册表#include #include void main() LONG lValue; RegQueryValue(HKEY_LOCAL_MACHINE, SOFTWAREMicrosoftHacker, NULL,&lValue); /读取注册表的键值,先获取长度,放入lValue char *pB
26、uf=new charlValue; RegQueryValue(HKEY_LOCAL_MACHINE, SOFTWAREMicrosoftHacker, pBuf,&lValue); printf(Value is %sn,pBuf);示例示例103535注册表编程注册表编程5 5、写入注册表、写入注册表LONG RegSetValueExRegSetValueEx( HKEY , / 已打开的键的句柄 LPCTSTR, / 要查询值的名称,若为NULL,则查询该键下的默认值或未命名值的类型与数据 DWORD , / 保留,必须为0 DWORD , / 变量的类型,如REG_SZ或
27、REG_DWORD CONST BYTE *, / 变量数据的地址,用于存储内容 DWORD / 变量的长度 ); 返回值:不成功返回非0,成功返回ERROR_SUCCESS 3636注册表编程注册表编程6 6、从注册表读数据、从注册表读数据LONG RegQueryValueExRegQueryValueEx( HKEY , / 已打开的键的句柄 LPCTSTR, / 要查询值的名称,若为NULL,则查询该键下的默认值或未命名值的类型与数据 LPDWORD , / 保留,必须为0 LPDWORD , / 变量的类型 LPBYTE , / 变量数据的地址,用于存储内容 LPDWORD / 变量
28、的长度 ); 返回值:不成功返回非0,成功返回ERROR_SUCCESS 3737举例3:写注册表#include #include void main() HKEY hKey1; DWORD dwAge=30;RegCreateKey(HKEY_LOCAL_MACHINE, SOFTWAREMicrosoftHacker, &hKey1); /创建注册表项 RegSetValueEx(hKey1,Age,0,REG_DWORD, (CONST BYTE *) &dwAge,sizeof(dwAge); RegCloseKey(hKey1);如果读写的数据不是字符串型的(如整形
29、),或者该值本身有名称,则要用带Ex的扩展函数示例示例113838举例4:读注册表#include #include void main() HKEY hKey1; RegOpenKey(HKEY_LOCAL_MACHINE, SOFTWAREMicrosoftHacker, &hKey1); /打开注册表项 DWORD dwType,dwValue,dwAge; RegQueryValueEx(hKey1,Age,0,&dwType,(LPBYTE) &dwAge, &dwValue);/读取后放入dwValue中printf(Age is %dn,dwAge
30、); RegCloseKey(hKey1);示例示例123939判断是否中了判断是否中了“冰河冰河” 中了“冰河”的计算机,其注册表中将扩展名为txttxt的文件的打开方式。正常时是在HKEY_CLASSES_ROOT主键下的“txtfileshellopencommand”中有如下关联:4040判断是否中了“冰河”#include #include int main()HKEY hkey;LPCTSTR lpSubKey=txtfileshellopencommand; LPCTSTR dest=%SystemRoot%system32NOTEPAD.EXE %1;LONG ret0=Reg
31、OpenKeyEx(HKEY_CLASSES_ROOT,lpSubKey, 0,KEY_READ,&hkey);if(ERROR_SUCCESS!=ret0)MessageBox(NULL,Open Failure,Error,MB_OK);return 0;4141判断是否中了“冰河” LPBYTE lpData=new BYTE80; DWORD lpType=REG_EXPAND_SZ; DWORD lpcbData=80; LONGret1=RegQueryValueEx(hkey,NULL,NULL, &lpType,lpData,&lpcbData); if
32、(ERROR_SUCCESS!=ret1) MessageBox(NULL,read Failure,Error,MB_OK); return 0; if(strcmp(const char*)lpData,dest)=0) MessageBox(NULL,No IceRiver,Safety,MB_OK); else MessageBox(NULL,Maybe IceRiver,Warm,MB_OK); return 1;/main function4242举例:更改登录用户名举例:更改登录用户名 当用户登录系统以后,注册表中就会自动记下用户名,下次登录时再把登录名显示出来,当非法入侵计算机
33、以后,同样会留下非法登录的用户名,所以需要将用户名修改会原来的值.它在HKEY_LOCAL_MACHINE主键下的SOFTWAREMicrosoftWindows NTCurrentVersionWinlogonSOFTWAREMicrosoftWindows NTCurrentVersionWinlogon键名:DefaultUserName;类型:REG_SZ;键值:Administrator4343更改系统登录用户 HKEY hKey1; LPCTSTR lpSubKey= SOFTWAREMicrosoftWindows NT CurrentVersionWinlogon ; RegO
34、penKeyEx ( HKEY_LOCAL_MACHINE, lpSubKey,0, KEY_WRITE, &hKey1); RegSetValueEx ( hKey1, DefaultUserName, 0, REG_SZ, (byte*)Hacker_sixage, 20); 4444文件系统编程文件系统编程 #include #include void main()char * szCMD = net user Hacker /add;BOOL bSuccess;PROCESS_INFORMATION piProcInfo;STARTUPINFO Info;Info.cb=siz
35、eof(STARTUPINFO);Info.lpReserved=NULL;Info.lpDesktop=NULL;4545文件系统编程文件系统编程Info.lpTitle=NULL;Info.cbReserved2=0;Info.lpReserved2=NULL;bSuccess=CreateProcess(NULL,szCMD,NULL,NULL,false ,NULL,NULL,NULL,&Info,&piProcInfo);if(!bSuccess)printf(创建进程失败!);4646系统时间#include #include int main()SYSTEMTIME sysTime;GetLocalTime(&sysTime);printf(%d年%d月%d日%d时%d分%d秒n,sysTime.wYear,sysTi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年内蒙古通辽经济技术开发区教育系统招聘真题
- 信用记录管理制度
- 信访闭环管理制度
- 修改学校管理制度
- 公务员业务管理制度
- 公司合伙人管理制度
- 公司新客户管理制度
- 出售现金卡管理制度
- 化妆品进货管理制度
- 奖金13薪管理制度
- 锂电池、新能源汽车火灾事故灭火救援处置
- 上海宝山区公开招聘社区工作者考试高频题库带答案2025年
- 《老年服务礼仪与沟通》高职养老服务类专业全套教学课件
- 自来水安装施工合同范例二零二五年
- 安全隐患的课件
- 小区安全隐患课件
- 国家安全共同守护-国家安全教育日主题班会课件-2024-2025学年初中主题班会课件
- 2025-2030中国倒装芯片球栅阵列行业市场现状供需分析及投资评估规划分析研究报告
- 机动车环检试题及答案
- 罗曼蛋鸡饲养管理手册
- 学校德育教育的有效方法研究
评论
0/150
提交评论