java使用nmap工具进行端口扫描,简单学习

java与nmap整合我目前使用过两种方式,可以参考一下:
1.导入nmap4j.jar的包,在src同级目录创建lib文件夹,把jar包放入然后右键->add as Library;
2.通过Java调用Runtime这个类可以执行其他的可执行程序;
这两种方法有一个相同的地方就是需要调用nmap的程序。为了方便我们可以把程序导入项目中,在通过相对路径进行引用即可。
官网链接https://nmap.org/download.html
下载nmap-X.XX-win32.zip这种以zip结尾的压缩包,解压出来就行了
目录结构如图:
java使用nmap工具进行端口扫描,简单学习_第1张图片
第一种写法:使用nmap4j ,需要导入jar包,这里把连接放上
链接: https://pan.baidu.com/s/1qx9gHyzBrRFqnoM1wH_eHw
提取码:cart
贴上代码:

public void getResult(String param){
        //创建对象与nmap建立连接,相对路径
        Nmap4j nmap4j = new Nmap4j( "doc/nmap-7.91" ) ;
        //需要扫描的主机ip,可查询范围192.168.1.1-255
        nmap4j.includeHosts(param);
        //不需要扫描的主机范围
        //nmap4j.excludeHosts("192.168.1.1-246");
        //扫描规则
        nmap4j.addFlags( "-T3 -Pn -sV -v") ;
        try {
            nmap4j.execute();
            ExecutionResults executionResults = nmap4j.getExecutionResults();
            if( !nmap4j.hasError() ) {
                //输出扫描结果
                System.out.println(executionResults.getOutput());
            } else {
                System.out.println( executionResults.getErrors() ) ;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

这段代码的意思在注释中已经解释了,但是我遇到了问题,就是同样的执行命令通过命令行窗口运行比代码运行快,而且大多数时候代码运行一直没反应,不知道是不是阻塞了,网上有大神对jar包进行了修改,但是还是解决不了我的问题,所有我用的是第二种方法。
第二种写法:不使用nmap4j
在Java中通过调用Runtime类执行其他的可执行程序,执行后返回一个进程(Process),利用Process这个类我们可以取得程序执行的结果(一个String类型的xml),把结果解析成document然后获取节点就能得到我们需要的信息。
贴上代码:

@Component
public class NmapScan {

    private static Logger log = LoggerFactory.getLogger(NmapScan.class);

    private static String command;

    @Value("${nmap.command}")
    public void setCommand(String command){
        NmapScan.command = command;
    }

    public static List<Map<String,Object>> getResult(String ip){
        //创建空集合存筛选的结果
        List<Map<String,Object>> portList = new ArrayList<>();
        String returnData = getReturnData(ip);
        try{
            if(!StringUtils.isEmpty(returnData)){
                //解析String类型的xml
                Document xmldoc = DocumentHelper.parseText(returnData);
                //得到根节点
                Element rootEl = xmldoc.getRootElement();
                if(rootEl != null){
                    Element addrEl = rootEl.element("host").element("address");
                    if(addrEl != null){
                        //扫描到的ip
                        String scanIp = addrEl.attributeValue("addr");
                        if(scanIp.equals(ip)){
                            log.info("ip匹配成功,开始解析...");
                            //ip类型
                            String ipType = StringUtils.isEmpty(addrEl.attributeValue("addrtype"))?"":"地址:"+addrEl.attributeValue("addrtype")+" ";
                            //获取所有子节点的跟节点,xpath
                            List<Element> ports = rootEl.selectNodes("//ports/port");
                            if(ports.size()>0){
                                for(Element el:ports){
                                    Map<String,Object> portMap = new HashMap<>();
                                    //协议
                                    String agreement = el.attributeValue("protocol");
                                    //端口号
                                    String port = el.attributeValue("portid");

                                    Element stateEl = el.element("state");
                                    //状态
                                    String state = StringUtils.isEmpty(stateEl.attributeValue("state"))?"":"状态:"+stateEl.attributeValue("state")+" ";
                                    //reason
                                    String reason = StringUtils.isEmpty(stateEl.attributeValue("reason"))?"":"reason:"+stateEl.attributeValue("reason")+" ";
                                    //reason_ttl
                                    String reasonTTL = StringUtils.isEmpty(stateEl.attributeValue("reason_ttl"))?"":"reason_ttl:"+stateEl.attributeValue("reason_ttl")+" ";

                                    Element serviceEl = el.element("service");
                                    //服务名
                                    String servicename = StringUtils.isEmpty(serviceEl.attributeValue("name"))?"":"服务名:"+serviceEl.attributeValue("name")+" ";
                                    //product
                                    String product = StringUtils.isEmpty(serviceEl.attributeValue("product"))?"":"product:"+serviceEl.attributeValue("product")+" ";
                                    //操作系统
                                    String ostype = StringUtils.isEmpty(serviceEl.attributeValue("ostype"))?"":"操作系统:"+serviceEl.attributeValue("ostype")+" ";
                                    //主机名
                                    String hostname = StringUtils.isEmpty(serviceEl.attributeValue("hostname"))?"":"主机名:"+serviceEl.attributeValue("hostname")+" ";
                                    //附加信息
                                    String extrainfo = StringUtils.isEmpty(serviceEl.attributeValue("extrainfo"))?"":"附加信息:"+serviceEl.attributeValue("extrainfo")+" ";
                                    portMap.put("id", UUIDUtil.getUUID());
                                    portMap.put("ip",ip);
                                    portMap.put("wcode","12");
                                    portMap.put("website","Nmap扫描工具");
                                    portMap.put("port",port);
                                    portMap.put("agreement",agreement);
                                    String other = hostname + ostype + state + ipType + servicename + extrainfo + product + reason + reasonTTL;
                                    portMap.put("other",other);
                                    portList.add(portMap);
                                }
                                log.info("解析数据成功...");
                            }
                        }
                    }

                }else {
                    log.info("解析数据为空...");
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            log.info("解析nmap数据失败...");
        }
        return portList;
    }

    /**
     * 调用nmap进行扫描
     * @return 执行回显
     * */
    public static String getReturnData(String ip){
        Process process = null;
        StringBuffer stringBuffer = new StringBuffer();
        try {
            process = Runtime.getRuntime().exec( "doc/nmap-7.91/nmap.exe " + command+" "+ip);
            log.info("开始对{}进行端口扫描...",ip);
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(),"UTF-8"));
            String line = null;
            while((line = reader.readLine()) != null){
                stringBuffer.append(line + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return stringBuffer.toString();
    }
}

代码仅供参考
参考博客:
https://blog.csdn.net/weixin_33834628/article/details/89986357
https://blog.csdn.net/weixin_34302798/article/details/92217281

你可能感兴趣的:(java,nmap)