La façon la plus rapide pour numériser les ports avec Java
J'ai fait très simple scanner de port, mais il fonctionne trop lent, donc je suis à la recherche de moyen d'en faire des analyses plus rapides. Voici mon code:
public boolean portIsOpen(String ip, int port, int timeout) {
try {
Socket socket = new Socket();
socket.connect(new InetSocketAddress(ip, port), timeout);
socket.close();
return true;
} catch (Exception ex) {
return false;
}
}
ce code ici de tester si un port est ouvert sur ip spécifique. Pour les délais d'attente-je utiliser la valeur minimale de 200 parce que quand je vais à la baisse, il n'a pas assez de temps pour tester le port. Eh bien, Il fonctionne bien, mais prend trop de numérisation à partir de 0 à 65535. Est-il un autre moyen qui pourrait peut-être scan de 0 à 65535 en moins de 5 minutes?
- Avez-vous essayé avec des threads?
Vous devez vous connecter pour publier un commentaire.
Si vous avez besoin de 200ms pour chacun des 65536 ports (dans le pire des cas, un pare-feu bloque tout, et donc de faire de vous frapper votre délai d'attente pour chaque port), le calcul est assez simple: vous devez 13k secondes, soit environ 3 heures et demi.
Vous avez 2 (non-exclusif) les options pour le rendre plus rapide:
Depuis l'opération I/O bound (contrairement à la CPU, -- qui est, vous passez du temps d'attente pour les I/O, et non pas pour un énorme calcul à compléter), vous pouvez utiliser de nombreux, de nombreux threads. Essayez de démarrer avec 20. Ils divisent les 3 heures et la moitié d'entre eux, donc le maximum prévu est d'environ 10 minutes. Juste rappelez-vous que cela va mettre de la pression sur l'autre côté, c'est à dire, l'hôte scanné verrez d'énormes activité réseau de "déraisonnable" ou "étrange" de motifs, de faire de l'analyse extrêmement facile à détecter.
La façon la plus simple (c'est à dire, avec un minimum de modifications) est d'utiliser la ExecutorService et l'Avenir d'Api:
Ensuite, vous pouvez faire quelque chose comme:
Si vous avez besoin de savoir quels ports sont ouverts (et pas seulement combien de, comme dans l'exemple ci-dessus), vous aurez besoin de changer le type de retour de la fonction à
Future<SomethingElse>
, oùSomethingElse
tiendrait le port et le résultat de l'analyse, quelque chose comme:Puis, changement
Boolean
àScanResult
dans le premier extrait, et le retournew ScanResult(port, true)
ounew ScanResult(port, false)
au lieu de simplementtrue
oufalse
EDIT: en Fait, je viens de remarquer: dans ce cas particulier, vous n'avez pas besoin de la ScanResult classe afin de conserver résultat + port, et toujours savoir sur quel port est ouvert. Puisque vous ajoutez les contrats à terme pour un Liste, qui est commandé, et, plus tard, vous les traiter dans le même ordre que vous les avez ajoutés à, vous pourriez avoir un compteur qui vous auriez incrémenter à chaque itération, à savoir le port auquel vous avez affaire. Mais, hé, c'est juste pour être complet et précis. Ne jamais essayer de faire que, c'est horrible, je suis la plupart du temps de la honte que j'ai pensé à cela... à l'Aide de la ScanResult objet est beaucoup plus propre, le code est plus facile à lire et à maintenir, et vous permet, plus tard, par exemple, utiliser un
CompletionService
pour améliorer le scanner.(src-ip, src-port, dest-ip, dest-port)
qui est immuable (c'est à dire, vous ne pouvez pas modifier les adresses ou les ports au moyen d'une connexion); depuis chaque port de test est une autre destination-port, vous voyez que vous avez besoin d'un autre Socket TCP pour chaque port de test, donc, pas de mise en commun peut aider.En dehors de la parallélisation de l'analyse, vous pouvez utiliser plus de port avancés de numérisation des techniques comme celles TCP (TCP SYN et FIN de la numérisation) expliqué ici: http://nmap.org/nmap_doc.html. Code VB de la mise en œuvre peut être trouvé ici: http://h.ackack.net/spoon-worlds-fastest-port-scanner.html
Afin d'utiliser ces techniques, cependant, vous avez besoin d'utiliser des sockets TCP/IP. Vous devez utiliser RockSaw bibliothèque pour cela.
Exemple de Code est inspiré par "Bruno Reis"
Pour Android essayez cette Impressionnante Bibliothèque
https://github.com/stealthcopter/AndroidNetworkTools
Si vous décidez d'utiliser le Nmap option et que vous voulez continuer avec Java, vous devriez regarder Nmap4j sur SourceForge.net (http://nmap4j.sourceforge.net). C'est une API simple qui vous permet d'intégrer Nmap dans une application java.
--Jon
J'ai écrit mes propres asynchrone portscanner java service qui permet de scanner les ports via TCP-SYN-Scan comme Nmap ne. Elle soutient également des IMCP ping analyses et permet de travailler avec un très haut débit (en fonction de ce que le réseau peut supporter):
https://github.com/subes/invesdwin-webproxy
En interne, il utilise java liaison ppce et expose ses services via JMS/AMQP. Mais vous pouvez également l'utiliser directement dans votre application si vous n'avez pas l'esprit en ayant les permissions root.