答题要求:将每一道题的答案保存到word文档中。
一、详细说明使用TCP SYN扫描的过程和结论。(20分)
答:TCP SYN扫描
在这种技术中,扫描主机向目标主机的选择端口发送SYN数据段。如果应答是RST,那么说明端口是关闭的,按照设定就探听其它端口;如果应答中包含SYN和ACK,说明目标端口处于****状态。由于所有的扫描主机都需要知道这个信息,传送一个RST给目标机从而停止建立连接。由于在SYN扫描时,全连接尚未建立,所以这种技术通常被称为半打开扫描。SYN扫描的优点在于即使日志中对扫描有所记录,但是尝试进行连接的记录也要比全扫描少得多。缺点是在大部分操作系统下,发送主机需要构造适用于这种扫描的IP包,通常情况下,构造SYN数据包需要超级用户或者授权用户访问专门的系统调用。
二、数据结构sockaddr_in的详细构造如何?(20分)
答:struct sockaddr_in ("in" 代表 "Internet"。)
struct sockaddr_in {
short int sin_family; /* 通信类型 */
unsigned short int sin_port; /* 端口 */
struct in_addr sin_addr; /* Internet 地址 */
unsigned char sin_zero[8]; /* 与sockaddr结构的长度相同*/
};
三、Internet Explore中的安全规定设置情况如何?(20分)
答:1、当你浏览网页的时候,开始打开浏览器IE。
2、从Tools(工具)菜单里选择Internet Options... (Internet选项。。。)项,之
后会弹出Internet Options(Internet选项)对话框。
3、选择Security(安全)项,Security(安全)选项会出现。
4、点击Internet区域并选择它。
5、点击Custom Level... (自定义级别。。。),出现安全设置框。
6、从滚动菜单里选择High(高)级别。
7、点击 Reset(重置)项后,会有一个对话框出现,询问你是否确定要改变
Internet区域中的安全设置。
8、点击Yes(是),接下来按照以下列出的步骤并且通过滑动设置菜单来进行设置。
9、在设置 Script ActiveX controls marked safe for Scripting(对标记为可安全
执行ActiveX控件执行脚本)项的时候, 你根据你的信任级别来选择禁止或是提示。
10、如果你决定要禁用Java,那末在Java权限设置中, 单击禁用Java。(说明:如果你安
装了Microsoft Virtual Machine(微软的虚拟机),那末这个设置将要在
Microsoft VM(微软的虚拟机)环境中来设置。如果你没有设置Java 权限,那末
Java已经被禁用了。)
11、要在脚本部分下设置Active scripting(活动脚本),则单击活动脚本下的禁用。
12、点击OK(确定),然后出现一个对话框,问你是否确定接受这个改变。
13、点击 Yes(是)。
14、在Internet选项对话框里,点击Advanced(高级)框,高级选项表框出现。
15、在Security(安全)设置里,点击Warn if changing between secure and
insecure(在安全与非安全模式之间转换时发出警告)。
16、点击Apply(应用),保留你的设置。
17、点击OK(确定),关闭Internet选项对话框。
四、阅读程序段,解释每个程序语句。(40分)
byte=0x45;
memcpy(p_ptr,&byte,sizeof(u_char);
p_ptr+=2;
*((u_short*)p_ptr)=FIX(IPH+UDPH+PADDING);
p_ptr+=2;
*((u_short*)p_ptr)=htons(242);
p_ptr+=2;
*((u_short*)p_ptr)=FIX(IP_MF);
p_ptr+=2;
*((u_short*)p_ptr)=0x40;
byte=IPPROTO_UDP;
memcpy(p_ptr+1,&byte,sizeof(u_char));
p_ptr+=4;
*((u_long*)p_ptr)=src_ip;
p_ptr+=4;
*((u_long*)p_ptr)=dst_ip;
p_ptr+=4;
*((u_short*)p_ptr)=htons(src_prt);
p_ptr+=2;
*((u_short*)p_ptr)=htons(dst_prt);
p_ptr+=2;
*((u_short*)p_ptr)=htons(8+PADDING);
if(sendto(sock,packet, IPH+UDPH+PADDING,0,(struct sockaddr*)&sin,sizeof(struct sockaddr))= = -1){
perror(“\nsendto”);
free(packet);
exit(1);
}
答:
byte=0x45;/*IP version and header length */ ip版本和头长
memcpy(p_ptr,&byte,sizeof(u_char));
p_ptr+=2;/*IP TOS(skipped)*/ ip的tos值
*((u_short*)_ptr)=FIX(IPH+UDPH+PADDING);/*total length*/ ip的长度
p_ptr+=2;
*((u_short*)_ptr)=htons(242);/*IP id */ ip的标识
p_ptr+=2;
*((u_short*)_ptr)=FIX(IP_MF);/*IP frag flags and offset */ ip的分段标识符
p_ptr+=2;
*((u_short*)_ptr)=0x40;/*IP TTL */ ip的生存时间
byte=IPPROTO_UDP;
memcpy(p_ptr+1,&byt,sizeof(u_char));
p_ptr+=4;/*IP checksum filled in by kernel */ ip的校验和
*((u_long *)p_ptr)=scr_ip;/* IP source address */ ip的源地址
p_ptr+=4;
*((u_long *)p_ptr)=dst_ip;/* IP destination address */ ip的目标地址
p_ptr+=4;
*((u_long *)p_ptr)=htons(scr_ptr);/* UDP source potr */ UDP的源地址
p_ptr+=2;
*((u_long *)p_ptr)=htons(dst_ptr);/* UDP destination */ UDP的目标地址
p_ptr+=2;
*((u_long *)p_ptr)=htons(8+PADDING);/*UDP total length */ ip的总长度
if(sendto(sock,packed,IPH+UDPH+PADDING,0,(struct sockadder *)&sin,sizeof(struct sockadder))==-1){
perror("\nsendto");
free(packet);
exit(1);
答题要求:将每一道题的答案保存到word文档中。
一、 一个全相关需要由几个系统调用函数来完成,说明这几个函数的原型及参数的用法。(20分)
二、 数据结构ostent的详细构造如何?(20分)
三、 使用C语言写出TCP数据包的报头格式。(20分)
四、 四在windows 2000操作系统中,请说明目录WINNT/System32/etc下各种文件的作用。(40分)
<书上题目>
1,创建套接口——Socket()
应用程序在使用套接口前,首先必须创建一个套接口,其掉用格式如下;
int Socket(int af.int type,int protocol);
入口参数;af,type,protocol.参数af指定通信使用的区域,Unix系统支持AF?_Unix,AF_INET,AF?_NS等,而DOS,Windows中仅
支持AF_INET,他是网际网区域。参数type描述要建立的套接口的类型(,流式,数据报式和原始式套接口)。参数protocol说明
该套接口使用的协议(TCP,UDP,RAW),
2,指定本地地址——bind()
当一个套接口用Socket()创建后,存在一个名字空间(地址族0,但它没有被命名。bind()将套接口地址(包括本地主机地址和本
地端口地址)与所创建的套接口号联系起来,即将名字赋予套接口。一指定本地半相关,其调用格式如下:
int bind(SOCKETs,const struct sockaddr FAR*name,int namelen);
参数s是用Socket()调用返回的并未作连接的套用接口描述符(套接口号)。参数name是赋给套接口s的本地地址(名字)。其
长度可变,结构随通信域的不同而不同。namelen表明了name的长度。
3,建立套接口连接——connect()与accept()
这两个系统调用用于建立一个完整相关,其中connect()用于客户方建立连接。无连接的套接口进程也可以调用connect()
但这时在进程之见没有实际的报文交换,调用将从本地操作系统直接返回。
connect()的调用格式如下;
int connect(SOCKETs.const struct sockaddr FAR*name,int nameelen);
参数s是欲建立连接的本地套接口描述符。参数name指出说明对方套接口地址结构的指针。对方套接口地址长度由namelen说明。
accept()的调用格式如下;
int accept(SOCKETs,struct sockaddr FAR*addr,int FAR*addrlen);
参数s为本地套接口描述符,在用作accept()调用的参数前应该先调用过listen()。addr是指向客户方套接口地址结构的指针,
用来接收连接实体的地址。
四个套接口系统调用Socket(),bind(),connect(),accept(),可以完成一个完全五元相关的建立。Socket()指定
五元组中的协议元,它的用法与是否为客户或服务器,是否向连接无关。bind()指定五元组中的本地二元,即本地主机地址和
端口号,其用法与是否面向连接有关;在服务器方,无论是否面向连接,均要调用bind();在客户方。若采用面向连接则可以
不调用bind()而通过connect(),而通过connect()自动完成。若采用无连接。客户方必须使用bind()以获得而已唯一
的地址。
4,****连接——listen()
int listen (SOCKETs,int masQue);
参数s标识一个本地已建立,尚未连接的套接口号,服务器愿意从他上面接受请求。maxQue表示请求连接队列的最大长度,用于
限制排队请求的个数。如果没有错误发生,listen()返回0;否则他返回SOCKET_ERROR.
5,数据传输——send()与recv()
当一个连接建立以后,就可以进行数据传输。常用的系统调用有send()和recv()。
send()调用用于在参数s指定的已连接的数据报或流套接口上发送传输数据,格式如下:
int send(SOCKETs.const char FAR*buf,int len,int flags);
参数s为已连接的本地套接口描述符。buf指向存有发送数据的缓冲区的指针,其长度由len指定。flags指定传输控制方法,如是否
发送带外数据等。如果没有错误发生,send()返回总共发送的字节数。否则它返回SOCKET_ERROR.
recv()调用用于在参数s指定的已连接的数据报或流套接口上接收输入数据,格式如下:
int recv(SOCKETs,char FAR*buf,int len,int len,int flags);
参数s为已连接的套接口描述符。buf指向接收输入数据缓冲区的指针,其长度由len指定。flags指定传输控制方式,如是否接收
外带数据等。如果没有错误发生,recv()返回总共接收的字节数,如果连接被关闭,返回0。否则它返回SOCKET_ERROR.
6,关闭套接口——closeSocket()
closeSocket()关闭套接口s,并释放分配给该套接口的资源;如果s 涉及一个打开的TCP连接,则该连接被释放。closeSocket()
的调用格式如下:
int closeSocket(SOCKETs);
参数s是待关闭的套接口描述符。如果没有错误发生,closeSocket()返回0/否则返回值SOCKET_ERROR.
printff("sending to %s\n",inet_ntoa(ip→ip_dst));
ip→ip_v=4 ip版本
ip→ip_hl=sizeof*ip>>2; ip的头长
ip→ip_tos=0; ip的tos值
ip→ip_len=FIX(sizeofbuf); ip的长度
ip→ip_id=htons=(4321); ip的标识
ip→ip_off=FIX(0); ip的分段标识符
ip→ip_ttl=255; ip的生存时间
ip→ip_p=1;
ip→ip_sum=0; ip的总和数
ip→ip_src.s_addr=0; ip的源地址
byte=0x;/*IP version and header length */ ip版本和头长
memcpy(p_ptr,&byte,sizeof(u_char));
p_ptr+=2;/*IP TOS(skipped)*/ ip的tos值
*((u_short*)_ptr)=FIX(IPH+UDPH+PADDING);/*total length*/ ip的长度
p_ptr+=2;
*((u_short*)_ptr)=htons(242);/*IP id */ ip的标识
p_ptr+=2;
*((u_short*)_ptr)=FIX(IP_MF);/*IP frag flags and offset */ ip的分段标识符
p_ptr+=2;
*((u_short*)_ptr)=0x40;/*IP TTL */ ip的生存时间
byte=IPPROTO_UDP;
memcpy(p_ptr+1,&byt,sizeof(u_char));
p_ptr+=4;/*IP checksum filled in by kernel */ ip的校验和
*((u_long *)p_ptr)=scr_ip;/* IP source address */ ip的源地址
p_ptr+=4;
*((u_long *)p_ptr)=dst_ip;/* IP destination address */ ip的目标地址
p_ptr+=4;
*((u_long *)p_ptr)=htons(scr_ptr);/* UDP source potr */ UDP的源地址
p_ptr+=2;
*((u_long *)p_ptr)=htons(dst_ptr);/* UDP destination */ UDP的目标地址
p_ptr+=2;
*((u_long *)p_ptr)=htons(8+PADDING);/*UDP total length */ ip的总长度
if(sendto(sock,packed,IPH+UDPH+PADDING,0,(struct sockadder *)&sin,sizeof(struct sockadder))==-1){
perror("\nsendto");
free(packet);
exit(1);
<试卷题目>
BIND()函数
一旦你有一个套接字。你可能要将接字和机器上的一定的端口关联起来。如果你只想CONNECT()那么这个步骤没有必要。但无论如何,请下去一步
这里是调用BIND()的大概
#INCLUDE〈SYS/TYPES。H〉
#INCLUDE〈SYS/SOCKET。H〉
INT BIND(INT SOCKFD STRUCT SOCKADDR MY ADDR。INTR ADDR,INT ADDRLEN)
SOCKFD是调用SOCKFD返回的文件描述符 MY ADDR指向数据结构的指针它保存你的地址信息ADDRLEN设置为SIZEOF
简单的很能不是吗
#INCLUDE〈STRING。H〉
#INCLUDE〈SYS/TYPE.H〉
#INCLUDE〈SYS/SOCKET.H〉
#DEFINE MYPORT 3490
MAIN()
{
INT SOCKFD;
STRUCT SOCKADDR IN MY ADDR;
SOCKFD=SOCKET(AF INET,SOCK_STREAM,O);/*需要错误检测*/
MY_ADDR.SIN_FAMILY=AF_INET:/*HOST BYTEORDER*/
MY_ADDR,SIN_PORT=HTONS(MYPORT);/*SHORT,NETWORK BYTE ORDER*/
MY_ADDR.SIN_ADDR=INET_ADDR("132.241.5.10")
BZERO(&( MY_ADDR,SIN_ZERO),;
BIND(SOCKFD,(STRUCT SOCKADDR*)&MY_ADDR.SIZEOF(STRUCT SOCKADDR)
.
.
.
这里也有要注意的几件事情.my_addr.sin_port是网络字节顺序,my_addr.sin_addr.s_addr也是的.另外要注意到的事情是因系统的不同,包含的头文件也不尽相同,请查阅本地的man帮助文件.
在bind()主题中最后要说的话是,在处理自己的IP地址和/或端口号的时候,有些工作是可以自动处理的.
my_addr.sin_port=0;/*随机选择一个没有使用的端口*/
my_addr.sin_addr.s_addr=INADDR_ANY;/*使用自己的IP地址
通过将0赋给my_addr.sin_port=,你告诉bind()自己选择合适的端口.
同样将my_addr.sin_addr.s_addr设置为INADDR_ANY,你告诉它自动填上它所运行的机器的IP地址.
如果你一向小心谨慎,那么你可能注意到我没有将INADDR_ANY转换为网络字节顺序!这是因为我知道内部的东西;INADDR_ANY实际上就是0!即使你改变字节的顺序,0依然是0.但是完美主义者说应该处处一致,INADDR_ANY或许是12呢?
你的代码就不能工作了,那么看下面的代码:
my_addr.sin_port=htons(0);/*随机选择一个没有使用的端口*/
my_addr.sin_addr.s_addr=htonl(INADDR_ANY);/*使用自己的IP 地址*/
你或许不相信,上面的代码将可以随便转移.我只是想指出,既然你所遇到的程序不会都运行使用htonl的INADDR_ANY.
bind() 在错误的时候依然是返回-1,并且设置全局错误变量errno.
在你调用bind 的时候,你要小心的另一件事情是:不要采用小于1024的端口号.所有小于1024的端口号都被系统保留!你可以选择从1024到65535的端口.
在你调用BIND()的时侯,你在要小心另一件事情,不要采用小于1024的端口。所有小于1024的端口都会被系统保存,你可以选从1024-65535的端口
你需要注意的另一个小事是;有时侯你跟本不需要他们,如果你使用CONNECT()来和远程机器进行通讯,你不需要关心你的本地端口号。你只要简单调用就可以了。它会检查是否绑定端口号,如果没有。它会自己绑定一个没有使用的本地端口。
connet()程序
现在我们假设你是个telnet程序.你的用户命令你得到套接字的文件描述符,你听从命令调用了socket().下一步,你的用户告诉你通过端口23连接到"132.241.5.10".你该怎么做呢?幸运的是,你正在阅读connet()--如何连接到远程主机这一章.你可不想让你的用户失望.
connet()系统调用是这样的:
#include
#include
int connet(int sockfd,struck sockaddr*serv_addr,int addrlen);
sockfd 是系统调用socket()返回的套接字文件描述符.serv_addr 是保存着目的地端口和IP地址的数据结构 struck sockaddr .addrlen设置为sizeof(struck sockaddr).
想知道的更多吗 我们来看个例子:
#include
#include
#include
#define DEST_IP"132.241.5.10"
#define DEST_PORT 23
main()
{
int sockfd:
struck sockaddr_in dest_addr:/*目的地址*/
sockfd=sockfd=socket(AF_INET,sock_stream, 0);/*错误检查*/
dest_addr.sin_family=AF_INET;/*host byte order */
dest_addr.sin_port=htons(DEST_PORT);/*short,network byte order*/
dest_addr.sin_addr.s_addr=inet_addr(DEST_IP);
bzero(&(dest_addr.sin_zero),;/*zero the rest of the struck*/
/*don't forget to error check the connect()!*/
connect(sockfd,(struck sockaddr*)&dest_addr,sizeof(struck sockaddr));
.
.
.
再一次,你应该检查connect()的返回值--它在错误的时候返回-1,并设置全局错误变量errno.
同时,你可能看到,我没有调用bind().因为我不在乎本地的端口号.我只关心我要去哪.内核将为我选择一个合适的端口号,而我们所连接的地方也自动地获得这些信息.一切都不用担心.
listen()函数
是换换内容的时候了.假如你不希望与远程的一个地址连接,后者说,仅仅是将它踢开,那你就需要等待接入请求并且用各种方法处理它们.处理过程分 两步: 首先,你听listen()<看下面的内容>
除了要一点解释外,系统调用listen也非常简单.
int listen(int sockfd ,int backlog);
sockfd是调用socket()返回的套接字文件描述符.bacalog是在进入队列中允许的连接数目.什么意思呢?进入的连接是在队列中一直等待直到你接受(accept()请看下面)连接.它们的数目限制于队列的允许.大多数允许的数目是20.你也可以设置为5到10.
和别的函数一样,在发生错误的时候返回-1,并设置全局错误变量errno.
你可能想象到了,在你调用listen()前你或者要调用bind()或者让内核随便选择一个端口.如果你想侦听进入的连接,那么系统调用的顺序是这样的:
sock();
bind();
listen();
/*accept()应该在这*/
因为他相当的明了,我将在这里不给出例子了.(在accept()那一章的代码更加完全)
accept()函数
准备好了,系统调用accept()会有点古怪的地方的!你可以想象发生这样的事情:有人从很远的地方通知一个你在侦听的端口连接到你的机器.他的连接将加入到等待接受的队列中.你调用accept() 告诉它你有空闲的连接.它将返回一个新的套接文件描述符!这样你就有两个套接字了,原来的一个还在侦听你的那个端口,新的在准备发送(send())和接受(recv())数据.这就是这个过程!
函数是这样定义的:
#include
int accept(int sockfd,void*addr,int*addrlen);
sockfd相当简单,是和listen()中一样的套接字描述符.addr 是个指向局部的数据结构sockaddr_in的指针.这是要求接入的信息所要去的地方.在它的地址传递给accept之前,addrlen是个局部的整形变量,设置为sizeof(struck sockaddr_in).accept 将不会将多余的字节给addr.如果你防如的少些,那么他会通过改变addrlen的值反映出来.
同样在错误时返回-1,并设置全局错误变量errno.
现在是你应该熟悉的代码:
#include
#include
#include
#define MYPORT 3490/*用户接入端口*/
#define BACKLOG 10/*多少等待连接控制*/
main()
{
int sockfd,new_fd;/*listen on sock_fd, new connection on new_fd*/
struck sockaddr_in my_addr;/*地址信息*/
struck sockaddr_in sockaddr_in their_addr;/*connector's address information*/
int sin_size;
sockfd=socket(AF_INET,SOCK_STREAM,0);/*错误检查*/
my_addr.sin_family=AF_IENT;/*host byte order*/
my_addr.sin_port=htone(MYPORT);/*short,network byte order*/
my_addr.sin_addr.s_addr=INADDR_ANY;/*auto-fill with my IP*/
bzero($(my_addr.sin_zero),;/*zero the rest of the struck*/
/*don't forget your error checking for these calls:*/
bind(sockfd,(struck sockaddr*)&my_addr,sizeof(struck sockaddr));
listen(sockfd, BACKLOG);
sin_size=sizeof(struck sockaddr_in);
new_fd=accept(sockfd,&their_addr,&sin_size);
.
.
.
注意,在系统调用 send()he recv()中你应该使用新的套接字描述符new_fd.如果你只想让一个连接近来,那么你可以使用close()去关闭原来的文件描述符sockfd来避免同一个端口更多的连接.
send()andrecv()函数
这两个函数用于流式套接字或者数据报套接字的通讯.如果你喜欢使用无连接的数据报套接字,你应该看一看下面关于sendto()和recvfrom()的章节.
send()是这样的:
int send(int sockfd,conkfd,const void*msg,intlen,int flage):
sockfd是你想发送数据的套接字描述符,msg是指向你想发送的数据的指针.len是数据的长度.把flags设置为0就可以了.
这里是一些可能的例子:
char*msg="Beej was here !";
int len,bytes_sent;
len=strlen(msg);
byte_sent=send(sockfd,msg,len,0);
.
.
.
send()返回实际发送的数据字节数--它可能小于你要求发送的数目!注意,有时候你告诉它要发送一堆数据可是它不能处理成功.它只是发送它可能发送的数据,然后希望你能够发送其他
的数据.记住,如果send()返回的数据和len不匹配,你就应该发送其他的数据.但是这里也有个好消息:如果你要发送的包很小,它可能让数据一次发完.最后要说的就是,它在错误的时间返回-1,并设置errno.recv()函数很相似:
int recv(int sockfd,void*buf,int len,unsigned int flags);
sockfd是要读的套接字描述符.buf是要读的信息的缓冲.len是缓冲的最大长度.flags可以设置为0.
recv()返回实际读入缓冲的数据的字节数.或者在错误的时候返回-1,同时设置errno.
1。getpeername()函数
#include
int getpeername(int sockfd,struct sockaddr*addr,int*addrlen);sockfd是连接的流式套接字的 描述符。addr是一个指向结构struct sockaddr的指针,它保存着连接的另一边的信息。addrlen是一个int型的指针,它初始化为sizeof.函数在错误的时候返回-1,设置相应的errno.
一旦你获得它们的 地址,你可以使用inetntoa()或者gethostbyaddr()来打印或者获得更多的信息。但是你不能得到它的帐号。
2。gethostname()函数
#includeint.gethostname(char*hostname,size-t sizet);hostname是一 个字符数组指针,它将在函数返回时保存主机名。size是hostname数组的字节长度。函数调用成功时返回0,失败时返回-1,并设置errno.
3.域名服务(DNS)
它主要的功能是:你给它一个容易记忆的某站点的地址,它给你IP地址(然后你就可以使用bind(),connect(),sendto()或者其他函数)。当 一个人输入$telnet whitehouse.gov
telnet能知道它将连接(connect())到“198.137.240.100”
但是这是如何工作的呢?你可以调用函数gethostbyname():#include
struct hostent*gethostbyname(const char*name):很明白的 是,它返回一个指向struct hostent的指针,这个数据结构是这样 的:
struct hostent{
char *h-name;
char **h-aliases;
int h-addrtype;
int h-length;
char **h-addr-list;
};
#define h-addr h-addr-list[0]
(3): C:\Documents and Settings\creat>arp
Displays and modifies the IP-to-Physical address translation tables used by
address resolution protocol (ARP).
ARP -s inet_addr eth_addr [if_addr]
ARP -d inet_addr [if_addr]
ARP -a [inet_addr] [-N if_addr]
-a Displays current ARP entries by interrogating the current
protocol data. If inet_addr is specified, the IP and Physical
addresses for only the specified computer are displayed. If
more than one network interface uses ARP, entries for each ARP
table are displayed.
-g Same as -a.
inet_addr Specifies an internet address.
-N if_addr Displays the ARP entries for the network interface specified
by if_addr.
-d Deletes the host specified by inet_addr. inet_addr may be
wildcarded with * to delete all hosts.
-s Adds the host and associates the Internet address inet_addr
with the Physical address eth_addr. The Physical address is
given as 6 hexadecimal bytes separated by hyphens. The entry
is permanent.
eth_addr Specifies a physical address.
if_addr If present, this specifies the Internet address of the
interface whose address translation table should be modified.
If not present, the first applicable interface will be used.
Example:
> arp -s 157.55.85.212 00-aa-00-62-c6-09 .... Adds a static entry.
> arp -a .... Displays the arp table.
(4):net user C:\Documents and Settings\creat>net user
\LEGEND-0SMWHAJ7 的用户帐户
-----------------------------------------------------------------------------
Administrator creat Guest
HelpAssistant SUPPORT_388945a0
命令成功完成。
(5)Net share C:\Documents and Settings\creat>net share
共享名 资源 注释
-----------------------------------------------------------------------------
IPC$ 远程 IPC
命令成功完成。
(6):ipconfig C:\Documents and Settings\creat>ipconfig
Windows IP Configuration
Ethernet adapter 本地连接:
Media State . . . . . . . . . . . : Media disconnected
2常用的服务(安全机制)
(1)out look express的安全机制
打开out look express——工具——选项(弹出选项对话框)——安全
开始设置:安全电子邮件;安全内容;数字标识(证书)
(2)IE的安全机制
打开IE——工具——Internet选项(弹出选项对话框)——安全 or IE(右键)属性——安全
开始设置:
请为不同区域的WEB内容指定安全设置;该区域的安全级别(自定义级别,默认级别)
(3)电子商务网站(eg:易趣,8848,dell)安全方面的设置
有连接和无连接的套口应用流程图
服务器 客户机 服务器
socket() socket() socket()
| | |
bind() | bind()
| | | 客户机
readfrom() bind() listen() socket()
| | | |
阻塞,等待客户数据 | accept |
|--------服务请求---------- sendto() | |
处理服务器请求 | 阻塞,等待客户请求 |
| | |-------建立连接--------- connect()|
|
sendto() -----服务应答------- readfrom() read()------请求数据-------- write()
| | | |
close() close() 处理服务请求 |
无连接套接口应用流程图 | |
write()-------应答数据-------read()
| |
close() close()
面向连接套接口应用流程图
3通过四个函数建立一个五元组:
四个套接口系统调用Socket(),bind(),connect(),accept(),listen(),可以完成一个完全五元组相关的建立。 Socket()指定五元组中的协议元。它的用法与是否为用户与服务器,是否面向连接无关。bind()指定五元组中的本地二元,即本地地址和端口号,其用法与是否面向连接有关:在服务器方,无论是否面向连接,均要调用bind();在客户方,若采用面向连接,则可以不调用bind(),而通过 connect()自动完成,若采用无连接,客户方必须采用bind(),以获得一个唯一的地址,listen()用来设置最大****队列(服务器用)。
分析源程序(编写端口扫描器程序)
4 #include
#include
#include#include
#include
#include
int main(int argc,char**argv)
{
int probeport=0;
struct hostent*host;
int err,i,net;
struct sockaddr_in sa;
if(argc !=2){
printf("usage:%s hostname\n",argv[0]);
exit(1);
}
/*扫描1——1024端口范围*/
for(i=1;i<1024;i++)
{
strncpy((char*)&sa,"",sizeof sa);
sa.sin_family=AF_INET;
if(isdigit(*argv[1])) /*如果是IP地址*/
sa.sin_addr.s_addr=inet_addr(argv[1]);
else if((host=gethostbyname(argv[1]))!=0) /*如果是主机名,需要转换*/
strncpy((char*)&sa.sin_addr,(char*)host->h_addr,sizeof sa.sin_addr);
else{
herror(argv[1]);
exit(2);
}
sa.sin_port=htons(i);
/*创建socket标识符*/
net=socket(AF_INEF,SOCK_STREAM,O);
if(net<0){
perror("nsocket");
exit(2);
}
/*与目的方连接*/
err=connect(net,(stuct sockaddr*)*sa,sizeof sa);
if(err<0){
printf("%-5d%s\t",argv[1],i,strerror(errno));
fflush(stdout);
}else{
/*如果连接成功,打印主机名(或地址)和成功连接的端口号*/
printf("%s %-5d accepted.\n",argv(1),i);
if(shutdown(net,2)<0{
perror("\nshutdown");
exit(2);
}
}
\*关闭标误符*/
close(net);
}
print("\r");
fflush(stdout);
return(0);
} |