# portlauscher



## Guest (5. Jan 2006)

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):


```
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 (6. Jan 2006)

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 (6. Jan 2006)

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


----------



## Bleiglanz (6. Jan 2006)

der Standard ist wohl die libpcap (auch etherreal beruht darauf)

http://www.tcpdump.org/

es gibt aber wohl schon einen Wrapper für Java?

http://sourceforge.net/projects/jpcap


----------



## Gast (9. Jan 2006)

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!


----------



## Bleiglanz (9. Jan 2006)

http://javaalmanac.com/egs/java.net/pkg.html

oder forumssuche nach "ServerSocket"


----------



## meez (9. Jan 2006)

Hier: 


```
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 (10. Jan 2006)

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 (10. Jan 2006)

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....)


----------



## Bleiglanz (10. Jan 2006)

stimmt schon, wenn nur ASCII-Zeugs rumfliegt dann ist das meistens OK


----------



## Gast (10. Jan 2006)

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.


----------



## Gast (10. Jan 2006)

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 (10. Jan 2006)

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 Serverort 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


----------



## Gast (10. Jan 2006)

Ich danke Dir!
Werde das gleich mal ausprobieren.


----------



## meez (10. Jan 2006)

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...


----------

