From 7f3c4d0472f625c6587f8a49faf1a2695bdeb1ea Mon Sep 17 00:00:00 2001 From: horvist Date: Sat, 5 Apr 2014 12:09:08 +0200 Subject: [PATCH] IP's are scanned reversly when the end IP address is lower than the start IP address. --- src/net/azib/ipscan/feeders/RangeFeeder.java | 14 ++++++-- .../azib/ipscan/util/InetAddressUtils.java | 32 +++++++++++++++++-- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/net/azib/ipscan/feeders/RangeFeeder.java b/src/net/azib/ipscan/feeders/RangeFeeder.java index 4caf24ac..c3dbecf3 100644 --- a/src/net/azib/ipscan/feeders/RangeFeeder.java +++ b/src/net/azib/ipscan/feeders/RangeFeeder.java @@ -26,6 +26,7 @@ public class RangeFeeder extends AbstractFeeder { private InetAddress endIP; private InetAddress originalEndIP; private InetAddress currentIP; + private boolean isReverse; double percentageComplete; double percentageIncrement; @@ -44,12 +45,15 @@ public class RangeFeeder extends AbstractFeeder { try { this.startIP = this.currentIP = InetAddress.getByName(startIP); this.endIP = this.originalEndIP = InetAddress.getByName(endIP); + this.isReverse = false; } catch (UnknownHostException e) { throw new FeederException("malformedIP"); } if (InetAddressUtils.greaterThan(this.startIP, this.endIP)) { - throw new FeederException("range.greaterThan"); + this.isReverse = true; + this.endIP = InetAddressUtils.decrement(InetAddressUtils + .decrement(this.endIP)); } initPercentageIncrement(); this.endIP = InetAddressUtils.increment(this.endIP); @@ -66,7 +70,7 @@ public class RangeFeeder extends AbstractFeeder { rawEndIP = rawEndIP >= 0 ? rawEndIP : rawEndIP + Integer.MAX_VALUE; rawStartIP = rawStartIP >= 0 ? rawStartIP : rawStartIP + Integer.MAX_VALUE; // compute 1% of the whole range - percentageIncrement = 100.0/(rawEndIP - rawStartIP + 1); + percentageIncrement = Math.abs(100.0 / (rawEndIP - rawStartIP + 1)); percentageComplete = 0; } @@ -78,7 +82,11 @@ public class RangeFeeder extends AbstractFeeder { public ScanningSubject next() { percentageComplete += percentageIncrement; InetAddress prevIP = this.currentIP; - this.currentIP = InetAddressUtils.increment(prevIP); + if (this.isReverse) { + this.currentIP = InetAddressUtils.decrement(prevIP); + } else { + this.currentIP = InetAddressUtils.increment(prevIP); + } return new ScanningSubject(prevIP); } diff --git a/src/net/azib/ipscan/util/InetAddressUtils.java b/src/net/azib/ipscan/util/InetAddressUtils.java index 919e9c65..c8c451f0 100644 --- a/src/net/azib/ipscan/util/InetAddressUtils.java +++ b/src/net/azib/ipscan/util/InetAddressUtils.java @@ -82,11 +82,39 @@ public class InetAddressUtils { * Increments an IP address by 1. */ public static InetAddress increment(InetAddress address) { + return modifyInetAddress(address, true); + } + + /** + * Decrements an IP address by 1. + */ + public static InetAddress decrement(InetAddress address) { + return modifyInetAddress(address, false); + } + + /** + * Increments or decrements an IP address by 1. + * + * @param address + * the IP address + * @param isIncrement + * @return incremented/decremented IP address + */ + private static InetAddress modifyInetAddress(InetAddress address, + boolean isIncrement) { try { byte[] newAddress = address.getAddress(); for (int i = newAddress.length-1; i >= 0; i--) { - if (++newAddress[i] != 0x00) - break; + if (isIncrement) { + if (++newAddress[i] != 0x00) { + break; + } + } else { + if (--newAddress[i] != 0x00) { + break; + } + } + } return InetAddress.getByAddress(newAddress); }