nmap架构图_Nmap 源码学习二 整体架构

目录功能:

docs :相关文档

libdnet-stripped :开源网络接口库

liblinear:开源大型线性分类库

liblua:开源Lua脚本语言库

libnetutil:基本的网络函数

libpcap:开源抓包库

libpcre:开源正则表达式库

macosx:xcode项目文件

mswin32:vs项目文件

nbase:Nmap封装的基础使用函数库

ncat:netcat网络工具,由Nmap实现

ndiff:比较Nmap扫描结果的实用命令

nmap-update:负责Nmap更新操作

nping:Nmap项目组实现的新版的Hping,探测与构建包

nselib:Nmap的Lua脚本

nsock:Nmap实现的并行的SocketEvent处理库

scripts:Nmap提供常用的扫描检查的lua脚本

todo:开发任务

zenmap:python的图形界面程序

主体程序逻辑

入口程序在main.cc,主要功能

检查环境变量NMAP_ARGS

检查有没有–resume参数

判断是resume之前扫描,还是新请求

然后是根据传入参数去调用 nmap.cc的nmap_main()函数。下面是精简后的源码:

int main(int argc, char *argv[]) {

char command[2048];

int myargc;

char **myargv = NULL;

char *cptr;

int ret;

int i;

set_program_name(argv[0]);

if ((cptr = getenv("NMAP_ARGS"))) {

if (Snprintf(command, sizeof(command), "nmap %s", cptr) >= (int) sizeof(command)) {

error("Warning: NMAP_ARGS variable is too long, truncated");

}

/* copy rest of command-line arguments */

for (i = 1; i < argc && strlen(command) + strlen(argv[i]) + 1 < sizeof(command); i++) {

strcat(command, " ");

strcat(command, argv[i]);

}

myargc = arg_parse(command, &myargv);

if (myargc < 1) {

fatal("NMAP_ARGS variable could not be parsed");

}

ret = nmap_main(myargc, myargv);

arg_parse_free(myargv);

return ret;

}

if (argc == 3 && strcmp("--resume", argv[1]) == 0) {

if (gather_logfile_resumption_state(argv[2], &myargc, &myargv) == -1) {

fatal("Cannot resume from (supposed) log file %s", argv[2]);

}

return nmap_main(myargc, myargv);

}

return nmap_main(argc, argv);

}

然后程序教育nmap_main().

nmap_main里,表面看起来扫描的循环是从2065行开始:

for (targetno = 0; targetno < Targets.size(); targetno++) {

currenths = Targets[targetno];

前后的代码都比较多,下次再抽时间细致分析。

这里引用一个别人做的流程图:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值