Nmap源码分析(基本框架)

本文详细介绍了Nmap源码的文件组织结构,包括目录和文件类型的分布,重点分析了Nmap的核心功能源码、库文件以及相关工具。此外,文章还概述了Nmap的执行流程,从nmap_main()函数出发,详细阐述了准备阶段、工作阶段和善后阶段的执行逻辑,展示了Nmap如何进行主机发现、端口扫描、服务和OS检测等操作。
摘要由CSDN通过智能技术生成

Nmap是一款非常强大的开源扫描工具。

这里我们以阅读nmap6.0的代码作为主线来分析Nmap源码的实现框架。

源码下载地址:http://nmap.org/dist/nmap-6.01.tar.bz2

SVN检出:

svn co https://svn.nmap.org/nmap

 

1      文件组织

我们先从总体上了解Nmap的文件组织方式及分析源码需要关注的重点。

1.1    目录结构

解压Nmap的源码包后,可以看到根目录下有许多的子目录和文件。

文件分析

放在Nmap/根目录下包括几种类型文件:

1)       Nmap核心功能的源码(如nmap.cc/ scan_engine.cc/ service_scan.cc/osscan2.cc/ nse_main.lua等)。

2)       Nmap的核心数据库文件(nmap-os-db/ nmap-service-probes/ nmap-rpc/nmap-protocols等)。

3)       编译链接相关的Makefile或CONFIG文件。

4)       其他杂项文件(如安装提示:README-WIN32)

 

目录分析

使用Windows的tree命令列举出Nmap的目录结构.

为了避免目录树过长,这里只显示了3个级别的目录,目录的主要作用在名字后面简略说明。

可以看到Nmap工具也使用到很多其他开源项目的成果,例如libdnet/ liblinear/ liblua/libpcap/ libpcre等;另外Nmap自身也实现很多有用的程序库,如nsock/ libnetutil/;Nmap项目包括附带几个小工具:1)ncat,这是根据TCPIP协议栈瑞士军刀netcat(该工具已停止维护更新)开发扩展出来的工具。2)nping,类似于Hping的工具,用于进行主机探测和发包收包。3)ndiff,用于比较两次nmap扫描结果之间差异。

 

[plain]  view plain copy
  1. Nmap/  
  2. ├─docs(Nmap相关文档,包括License、usage说明及XMLschema文件等)  
  3. │  ├─licenses     
  4. │  └─man-xlate  
  5. ├─libdnet-stripped(libdnet:简单的网络接口开源库)  
  6. │  ├─config  
  7. │  ├─include  
  8. │  └─src  
  9. ├─liblinear(LIBLINEAR:负责大型线性分类的开源库)  
  10. │  └─blas  
  11. ├─liblua(Lua脚本语言源码库)  
  12. ├─libnetutil(Nmap实现的基本的网络实用函数)  
  13. ├─libpcap(开源的抓包代码库libpcap)  
  14. │  ├─bpf  
  15. │  ├─ChmodBPF  
  16. │  ├─lbl  
  17. │  ├─missing  
  18. │  ├─msdos  
  19. │  ├─NMAP_MODIFICATIONS  
  20. │  ├─packaging  
  21. │  ├─pcap  
  22. │  ├─SUNOS4  
  23. │  ├─tests  
  24. │  └─Win32  
  25. ├─libpcre(Perl兼容的正则表达式开源库libpcre)  
  26. ├─macosx(该目录负责支持苹果的操作系统MACOS X)  
  27. │  └─nmap.pmdoc  
  28. ├─mswin32(该目录负责支持Windows操作系统)  
  29. │  ├─lib  
  30. │  ├─license-format  
  31. │  ├─NET  
  32. │  ├─NETINET  
  33. │  ├─nsis  
  34. │  ├─OpenSSL  
  35. │  ├─pcap-include  
  36. │  ├─RPC  
  37. │  └─winpcap  
  38. ├─nbase(Nmap封装的基础使用程序库,包括string/path/random等)  
  39. ├─ncat(Ncat是Nmap项目组实现的新版的netcat:强大的网络工具)  
  40. │  ├─certs  
  41. │  ├─docs  
  42. │  └─test  
  43. ├─ndiff(Ndiff是用于比较Nmap扫描结果的实用命令)  
  44. │  ├─docs  
  45. │  └─test-scans  
  46. ├─nmap-update(负责Nmap更新相关操作)  
  47. ├─nping(Nping是Nmap项目组实现的新版的Hping:网络探测与构建packet)  
  48. │  └─docs  
  49. ├─nselib(Nmap使用Lua语言编写的常用的脚本库)  
  50. │  └─data  
  51. ├─nsock(Nmap实现的并行的SocketEvent处理库)  
  52. │  ├─include  
  53. │  └─src  
  54. ├─scripts(Nmap提供常用的扫描检查的lua脚本)  
  55. ├─todo(介绍Nmap项目将来开发的具体任务)  
  56. └─zenmap(Nmap的官方的图形界面程序,由python语言编写)  
  57.    ├─install_scripts  
  58.    ├─radialnet  
  59.    ├─share  
  60.    ├─test  
  61.    ├─zenmapCore  
  62.    └─zenmapGUI  

1.2    文件类型

下面从源码类型的角度上浏览一下Nmap项目的特点:

Nmap6.0工程内总共包括1300多个文件。

1)       C和C++文件有600多个,主要实现Nmap最核心的功能:主机发现、端口扫描、服务侦测、OS侦测及搭建脚本引擎框架;也包括其他开源项目如libpcap的源码。

2)       Python文件有100多个,主要实现Zenmap图形界面,Zenmap会调用到Nmap基本命令,也实现一些新的功能:例如确定网络拓扑结构、Profile的管理(常用的命令保存为Profile)等。

3)       Lua与NSE文件400多个,负责构建Nmap脚本引擎及提供常用的扫描脚本。其中NSE格式为Nmap定制的Lua文件,方便用户自行编写脚本进行功能扩展。

4)       XML文件数十个,用于辅助描述Nmap的内容或Zenmap的测试等工作。

5)       其他文件,其他辅助工具操作的文件。

 

2      源码分析

2.1    执行流程框架

Nmap的执行流程简单清晰,主要的工作在nmap.cc文件中完成,而main.cc负责简单地包装nmap_main()函数。

nmap_main()函数是执行流程的核心。

  • 准备阶段:在其中会执行参数解析、资源分配、基本扫描信息的输出、端口与地址列表的初始化、NSE环境准备及pre-scripts的运行等基本的准备操作。
  • 工作阶段:然后进入主循环,每次循环对一组目标地址进行主机发现、端口扫描、服务与版本侦测、OS侦测及脚本扫描等操作,直到所有的目标地址都被扫描完毕才推出主循环。
  •  善后阶段:在完成所有的扫描操作后,调用post-script完成相应处理,然后打印出扫描的最终结果,并释放掉分配的资源。


 

 

2.2    nmap_main()函数

以下代码是对nmap_main()函数基本的分析。

其中以///开头是新添加的注释。而以类似于///<Start------创建主机组状态,进入主循环--------Start>的形式出现的注释用于标注一个比较大的功能代码段。

Nmap的所有的功能都在此nmap_main()设有入口,以此为基础可以更深入地分析Nmap的其他模块。

[cpp]  view plain copy
  1. int nmap_main(int argc, char *argv[]) {  
  2.   int i;  
  3.   vector<Target *> Targets;  
  4.   time_t now;  
  5.   struct hostent *target = NULL;  
  6.   time_t timep;  
  7.   char mytime[128];  
  8.   addrset exclude_group;  
  9.   #ifndef NOLUA  
  10.   /* Only NSE scripts can add targets */  
  11.   NewTargets *new_targets = NULL;///NewTargets为Singleton模式,产生单个实例  
  12.   /* Pre-Scan and Post-Scan script results datastructure */  
  13.   ScriptResults *script_scan_results = NULL;  
  14.   #endif  
  15.   char **host_exp_group;    
  16.   int num_host_exp_groups;  
  17.   HostGroupState *hstate = NULL;  
  18.   unsigned int ideal_scan_group_sz = 0;  
  19.   Target *currenths;  
  20.   char *host_spec = NULL;  
  21.   char myname[MAXHOSTNAMELEN + 1];  
  22.   int sourceaddrwarning = 0; /* Have we warned them yet about unguessable 
  23.                                 source addresses? */  
  24.   unsigned int targetno;  
  25.   char hostname[MAXHOSTNAMELEN + 1] = "";  
  26.   struct sockaddr_storage ss;  
  27.   size_t sslen;  
  28.   char **fakeargv = NULL;  
  29.   
  30.   now = time(NULL);  
  31.   local_time = localtime(&now);  
  32.   ///设置错误log输出函数  
  33.   if(o.debugging)  
  34.     nbase_set_log(fatal,error);  
  35.   else  
  36.     nbase_set_log(fatal,NULL);  
  37.   
  38.   if (argc < 2 ) printusage(-1);  
  39.   
  40.   /* argv faking silliness */  
  41.   fakeargv = (char **) safe_malloc(sizeof(char *) * (argc + 1));  
  42.   for(i=0; i < argc; i++) {  
  43.     fakeargv[i] = strdup(argv[i]);  
  44.   }  
  45.   fakeargv[argc] = NULL;  
  46.   
  47.   Targets.reserve(100);  
  48. #ifdef WIN32  
  49.   win_pre_init();  
  50. #endif  
  51. ///调用parse_options进行命令参数的解析  
  52.   parse_options(argc, fakeargv);      
  53. ///在Linux下设置终端为只读非阻塞方式,在Windows平台为空函数。  
  54.   tty_init(); // Put the keyboard in raw mode  
  55. ///将解析命令时需要延迟执行的操作在此处处理  
  56.   apply_delayed_options();  
  57.   
  58. #ifdef WIN32  
  59. ///调用WSAStartup启动Winsock DLL,后续网络解析等需要用到。  
  60.   win_init();      
  61. #endif  
  62.   
  63. ///如果用户使用了参数--iflist,那么会在此处打印网卡和路由表信息,然后退出。  
  64. ///该选项对于显示指定发送网卡非常有帮助,可以提供基本的网络设备信息。  
  65.   if (delayed_options.iflist) {  
  66.     print_iflist();  
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值