portlauscher

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
hallo, java gemeinde,
ich versuche gerade eine art portlauscher zu programmieren. es soll an einem bestimmten port, und zwar auf der clientseite, die packets die dort ankommen in der konsole ausgeben, sonst nichts!
Im moment bin ich soweit (es soll am port 80, auf dem localhost funktionieren):

Code:
package httpclient;

import java.io.*;
import java.net.*;

public class ProxyClient {
	public static void main(String args[])
	  {
	    Socket t = null;

	    try
	    {
	         t = new Socket("localhost", 80);

	         BufferedReader in = new BufferedReader(
	            new InputStreamReader(t.getInputStream()));

	         for(int i = 0; i < 100; i++)
	         {
		      String s = in.readLine();
		      System.out.println(s);		      
	         }

	    }
	    catch ( /* UnknownHostException is a */ IOException e ) {
	      e.printStackTrace();
	    }
	    finally
	    {
	      if ( t != null )
	        try { t.close(); } catch ( IOException e ) { }
	    }
	  }
	
}

das problem ist folgendes, dass ich am port 80 ein dienst anbieten muss. ich will aber, dass wenn in dem fall z.b. der browser eine verbindung aufgebaut hat und port 80 benutzt, dass ich sehe welche packets dort ankommen.
ist es möglich? (mir ist auch klar, dass ich so etwas wie ethereal benutzen kann. ich möchte das aber selber schreiben und das soll auch nicht nur am port 80 funktionieren und nicht nur für browser!)
irgend welche ideen?
ich danke euch für eure hilfsbereitschaft!
 

Bleiglanz

Gesperrter Benutzer
dann schreib dir doch einen ServerSocket, der jedes empfangene Byte einfach System.out.printet??

An die TCP/IP Pakete analog zu etherreal kommst du mit Java übrigens nicht ran, das ist völlig unmöglich - Java lebt im ApplicationLayer, du kannst also bestenfalls den HTTP Protokoll Traffic mitschneiden
 

dyrathror

Mitglied
Hallo Bleiglanz,

dazu habe ich gleich mal eine Frage, kennst Du eine lib die eine betriebsystemabhängige
low level Steuerung liefert?

Ich war schon mal am überlegen ob ich selbst eine schreibe, die z.B. für
Windows,Linux,FreeBSD eine direkte Steuerung der Netzwerkadapter ermöglicht um
z.B. unter Java die Netzwerkkarte in den Promiscuous Mode zu schalten und
den Netzwerktraffic mitzuschneiden (wie bei tcpdump oder ethereal).
Ist allerdings mangels Zeit erst einmal ad acta gelegt.

Gruß, Stephan
 
G

Gast

Gast
hallo, Bleiglanz,
konnte leider erst jetzt antworten.
Könntest Du ein paar Worte zum ServerSoket verlieren, wie man vorgeht, auf was man achten sollte oder evt. eine kurze Starthilfe ein Codefetzen oder so ähnlich.
Vielen Dank!
 

meez

Top Contributor
Hier:

Code:
	public static void main(String[] xxx) throws Exception {
		Socket socket = new ServerSocket(80).accept();
		BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		for (String s; (s = in.readLine()) != null; System.out.println(s));
	}
 

Bleiglanz

Gesperrter Benutzer
Code ist OK als Kurzbeispiel

OT

ich frage mich woher die readLine-Bessenheit kommt, gerade bei Sockets ist das nur unter sehr kontrollierten Bedingungen sinnvoll

- schickt der Server überhaupt Text?

- wenn ja in welchem CharacterEncoding?

- wenn ja hat die letzte Zeile noch ein Zeilenende?

- beim Transfer Windows/Linux wird das Original verändert?

Elliotte Rusty Harold

readLine() is evil
 

meez

Top Contributor
Bleiglanz hat gesagt.:
ich frage mich woher die readLine-Bessenheit kommt, gerade bei Sockets ist das nur unter sehr kontrollierten Bedingungen sinnvoll

Keine Ahnung...hab ich mich aber auch schon gefragt...readline() sollte wirklich nur ganz kontrolliert eingesetzt werden...

Bei seinem Problem kann man es aber durchaus brauchen, da er ja sehen will, was der Browser sendet (also den HTTP Header...und der ist halt nunmal Text....)
 
G

Gast

Gast
Vielen Dank für die Unterstützung!
Soviel ich weiß, muß der Port an dem Kommunikation stattfindet aber frei sein. Sprich, wenn eine Anwendung diesen Port bereits benutzt, kann ich die ganze Geschichte vergessen! Stimmt das?
Kann man dann aber trotzdem noch sehen was diese Anwendung verschickt. Ich hoffe, dass ich mich verständlich ausgedrückt habe.
 
G

Gast

Gast
Ich glaube, dass ich mich missverständlich ausgedrückt habe!
Ich versuch's nochmal.

Ich hab eine (belibige) Anwendung die eine Verbindung mit dem Internet (Server) aufbaut. Die Anwendung ist auf meiner Maschine. Ich will sehen was die Anwendung verschickt.

Ich hab mir das so vorgestellt, dass ich einen Socket implementiere und den an den richtigen Port anbinde: Und siehe da die Kommunikation sehen kann ;)

Hab ich's mir zu einfach gemacht?
 

Bleiglanz

Gesperrter Benutzer
du willst einen Sniffer? nimm etherreal...

sonst:

dazu machst du einen ServerSocket auf deinem localhost an irgeneinem Port

dieser nimmt alles, snifft es mit und schickt es dann an den richtigen Server:port im Internet

aber: dazu musst du deine "(beliebige) Anwendung" so konfigurieren, dass er tatsächlich auf localhost zugreift. wenn das möglich ist, dann gehts
 

meez

Top Contributor
Das Problem bei einem "richtigen" Sniffer ist, dass du nativ auf die Netzkarte/OS zugreifen müsstest, was mit Java aber nicht möglich ist...
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben