diff options
| author | 2026-08-10 21:25:03 +0200 | |
|---|---|---|
| committer | 2026-08-10 21:25:03 +0200 | |
| commit | 088889a95b7c0a1dcd70e07f71def437d1cccd1c (patch) | |
| tree | 578821b7ed87acaffddd8380a3cf518e25db1288 /src | |
| parent | 032091f6dcd6a8a8771eee3fd26a011170209cc2 (diff) | |
Instead of reading a string as banner read bytes and then in
ServiceDetector convert to string
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/java/com/it_jaros/jscanner/PortResult.java | 6 | ||||
| -rw-r--r-- | src/main/java/com/it_jaros/jscanner/Scanner.java | 11 | ||||
| -rw-r--r-- | src/main/java/com/it_jaros/jscanner/ServiceDetector.java | 8 |
3 files changed, 13 insertions, 12 deletions
diff --git a/src/main/java/com/it_jaros/jscanner/PortResult.java b/src/main/java/com/it_jaros/jscanner/PortResult.java index be2e119..f246302 100644 --- a/src/main/java/com/it_jaros/jscanner/PortResult.java +++ b/src/main/java/com/it_jaros/jscanner/PortResult.java @@ -5,7 +5,7 @@ import java.io.IOException; public class PortResult { private int port; private PortState state; - private String banner; + private byte[] banner; private Exception exception; public int getPort() { @@ -24,11 +24,11 @@ public class PortResult { this.state = state; } - public String getBanner() { + public byte[] getBanner() { return banner; } - public void setBanner(String banner) { + public void setBanner(byte[] banner) { this.banner = banner; } diff --git a/src/main/java/com/it_jaros/jscanner/Scanner.java b/src/main/java/com/it_jaros/jscanner/Scanner.java index 079c6aa..fdd011e 100644 --- a/src/main/java/com/it_jaros/jscanner/Scanner.java +++ b/src/main/java/com/it_jaros/jscanner/Scanner.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.net.*; import java.nio.ByteBuffer; import java.nio.channels.SocketChannel; -import java.nio.charset.StandardCharsets; import java.time.Duration; import java.util.*; import java.util.concurrent.*; @@ -399,9 +398,9 @@ public class Scanner implements AutoCloseable { return result; } - private String getBanner(SocketChannel socketChannel) { + private byte[] getBanner(SocketChannel socketChannel) { try { - return readBannerFrom(socketChannel); + return tryReadFrom(socketChannel); } catch (IOException ignore) { // ignore } @@ -409,12 +408,12 @@ public class Scanner implements AutoCloseable { return null; } - private String readBannerFrom(SocketChannel socketChannel) throws IOException { + private byte[] tryReadFrom(SocketChannel socketChannel) throws IOException { byte[] buffer = new byte[READ_BUFFER_SIZE]; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - long deadlineNanos = System.nanoTime() + TimeUnit.MILLISECONDS.toNanos(timeoutInMillis); boolean timedout = false; + long deadlineNanos = System.nanoTime() + TimeUnit.MILLISECONDS.toNanos(timeoutInMillis); while (!timedout) { int bytesRead = socketChannel.read(ByteBuffer.wrap(buffer)); if (bytesRead == -1) { @@ -430,7 +429,7 @@ public class Scanner implements AutoCloseable { LockSupport.parkNanos(Math.min(remaining, TimeUnit.MILLISECONDS.toNanos(1000))); } } - return byteArrayOutputStream.toString(StandardCharsets.UTF_8).trim(); + return byteArrayOutputStream.toByteArray(); } } diff --git a/src/main/java/com/it_jaros/jscanner/ServiceDetector.java b/src/main/java/com/it_jaros/jscanner/ServiceDetector.java index 425372c..4d4f76e 100644 --- a/src/main/java/com/it_jaros/jscanner/ServiceDetector.java +++ b/src/main/java/com/it_jaros/jscanner/ServiceDetector.java @@ -1,5 +1,6 @@ package com.it_jaros.jscanner; +import java.nio.charset.StandardCharsets; import java.util.List; import java.util.regex.Pattern; @@ -20,13 +21,14 @@ public class ServiceDetector { new ServicePattern(ServiceType.SSH, Pattern.compile("(?i)^SSH-")) ); - public static ServiceType detect(String banner) { - if (banner == null || banner.isBlank()) { + public static ServiceType detect(byte[] banner) { + if (banner == null || banner.length == 0) { return ServiceType.UNKNOWN; } + String bannerString = new String(banner, StandardCharsets.UTF_8); for (ServicePattern servicePattern : patterns) { - if (servicePattern.matches(banner)) { + if (servicePattern.matches(bannerString)) { return servicePattern.serviceType(); } } |
