一、环境

nmap-7.80、Windows10、VMware


二、主体流程

分为了三个分支

main.cc
main()
//分支1.检查环境变量 NMAP_ARGS
//    若是有,则提取环境变量NMAP_ARGS中的值,而且拼接命令行中的参数
//    进入nmap_main()

//分支2.检查命令行参数,若是只有三个参数,而且第二个参数为 --resume
       从日志文件中加载上次终止状态,继续上次终止时最先运行
//     进入 nmap_main()

//分支3. 进入 nmap_main()

 

真正的主函数为 nmap_main()

2.1 剖析命令行参数

nmap_main() ->
    ...
    parse_options()// 剖析命令行参数
        ...
        struct option long_options[] = {...} //界说的长选项
        46Ab:D:d::e:Ffg:hIi:M:m:nO::o:P::p:qRrS:s::T:Vv:: //短选项
        //无冒号的选项示意无参数
        //一个冒号的选项示意必须有参数,否则报错;参数和选项中可以有空格,也可以没有;eg. -D123 or -D 123
        //两个冒号的选项示意参数是可选的;但是有参数时,选项与参数之间不能有空格
        
        //将命令行参数剖析到 全局工具NmapOps o 中
        //同时将一些涉及时间的参数 剖析到 静态全局变量 static struct delayed_options delayed_options 中

2.2 处置选项

nmap_main() ->
...
    apply_delayed_options()
        ...
        //若是设置了 -O 选项举行扫描操作系统 
        //     或则 -A 而且是root权限时, 
        //则加载操作系统指纹文件
        parse_fingerprint_reference_file("nmap-os-db") 
        ...
        
        //扫描端口处置
        validate_scan_lists()
        ...
        
        //各个参数之间关系的校验,并输出日志
        ...
        
        //其他选项的一些处置


2.3 循环举行处置

do{
    ...
}while()