nc功能以及演示指令
如果定义了“POSIXLY_CORRECT”该环境变量(Linux系统),则功能不可使用
查询端口开放状态
nc -v ip port //查看ip的port端口是否开放
nc -v ip port1-port2 //查看ip的port1-port2中端口开放状态
即时通信以及聊天保存
监听主机: nc -l -p port (-o File) //监听port的端口 并将后面接收的消息存入file,先开启监听,大写L可以一直监听
远程连接: nc -v Targert_IP port (-o File) //连接目标IP的port端口,接收消息存入File (16进制保存)
文件传输
接收端: nc -l -p port > File //须在当前目录下的文件
发送端: nc Targert_IP port < File //先后都行,在关闭的时候完成传输
nc数据交互使用协议,数据包发送特点
使用协议
默认使用为TCP协议,可以使用"-u"命令开启UDP协议。程序在执行时,先会加载套接字库(WSAStartup函数),后续如果输入了"-u"命令,则开启UDP协议,其他功能执行则默认开启TCP协议其后面部分。
信息交互,必须有连接方需知道目标方IP,以及相互设定好的端口号。
数据包发送特点
文件传输部分是全文件传输。聊天部分则将内容转为十六进制进行保存,且记录保存字符个数,以#号分隔转换内容与实际输入内容,每行不满11字节以“ ”补足,超过部分自行延长
与telnet相同点和不同点
相同点
telnet与nc功能上基本是相同的,可以进行IP端口的监视,进行文件传输,信息交流,也可以让服务器对客户端进行命令行的传递。
telnet与nc可以相互之间进行信息的交流。
不同点
1.telnet为微软自带的,可在windows功能中,选择启动;
2.telnet操作时,需关闭防火墙,否则可能影响某些功能的使用,nc不需要关闭;
3.telnet有明确的指令可随时选择开启或关闭(open/close),nc则没有;
4.telnet可以进行模式的切换,当处于 Telnet 命令模式时,按 Enter 将会返回到 Telnet 会话模式;
5.telnet有微软提供的远程桌面链接服务,可以让服务端对客户端进行windows图形界面的直接操作
6.nc进行shall需要修改其源代码,加入条件栏才能进行;
7.telnet相比于nc,在进行远程登陆时候,有更为严格的身份验证(账号和密码,NTLM验证); 参考文档 telnet命令使用
拆解nc源码
参数获取:源代码中"getopt.c",此部分代码全为获取参数以及分析参数部分
其他功能无法细拆,只能单个API进行分析
--static void res_init(); //建立UDP/TCP中,监听之前的部分
--static int helpme(); //输出help列表
--static char * winsockstr(int error); //int的错误的返回值
--static void holler (char* str, char* p1, p2, p3, p4, p5, p6); //输出一段字符
--static void bail (char* str, char* p1, p2, p3, p4, p5, p6); //输出一段字符,退出套接字,关闭套接字,终止程序退出
--static char * Hmalloc (unsigned int size); //判断大小,不是空就清零,是空就调用bail,返回申请size大小的char* p;
--static unsigned int findline (char* buf, unsigned int siz); //返回输入buf中的“\n位置,如果没有就返回原siz,
--static int comparehosts (HINF * poop, struct hostent * hp); //名字相同则返回1,不同返回0
--static HINF * gethostpoop (char* name, USHORT numeric); //将主机名字以及地址转到HINF结构体中
--static USHORT getportpoop (char* pstring,unsigned int pnum); //不能两个都是0,得到给定端口号;传入pnum=0,则o_nflag !=0 返回0;传入string = 0 ,则结束
--static USHORT nextport (char* block); //把block字符串其中任意1变为2,然后返回此处的下标
--static void loadports (char* block,USHORT lo,USHORT hi); //传入为0则退出,不为0则将字符串block hi到lo部分变为1;
--static int doconnect (IA* rad,USHORT rp,IA* lad,USHORT lp); //先设置当前线程错误码(后续可覆盖),创建socket,复制套接字句柄,然后设置套接字选项,bind套接字;执行正常返回 套接字句柄 ,错误返回-1
--static int dolisten (IA* rad, USHORT rp,IA* lad,USHORT lp); //connect上套接字,返回 套接字名字
--static int udptest (int fd,IA* where); //套接字实现,返回(fd)/-1
--static void oprint (int which,char* buf,int n); //调用bail,WriteFile
--static int readwrite (unsigned int fd); //两个连接读取发送事件
--static void __w32_shutdown(void); //
--atoi(); //把字符串转换成整型
--FreeConsole(); //是一个Win32 API函数,用于从其控制台分离调用进程