# In Router einloggen und PCs im Netzwerk erkennen



## moccajoghurt (18. Okt 2010)

Hi,
will jetzt mein erstes sinnvolles Programm schreiben.
Folgendes soll es tun:
Wenn ich es starte soll es die Router-Adresse aufrufen, sich einloggen und auf der Startseite des Routers in der Kategorie "Netzwerk" auslesen wieviele PCs momentan mit dem Router verbunden sind und die jeweiligen Computernamen ausgeben.

Welche Klassen sind dafür geeignet? Wie würdet ihr ungefähr vorgehen?

Gruß,

mocca


----------



## gman (18. Okt 2010)

Da der Router wahrscheinlich wie alle anderen auch über ein Web-Interface bedient wird, könntest du
mit Java eine solche Bedienung nachahmen. Z.B. mit HtmlUnit. Eigentlich ist das eher gedacht um 
Webseiten zu testen.


----------



## moccajoghurt (18. Okt 2010)

Danke erstmal für den link, ich denke das ist genau das richtige. Leider habe ich Probleme die nötigen Klassen in meinen workspace (ich benutze Eclipse) zu kopieren. Wohin muss ich die Jar Dateien (im lib Ordner) kopieren und wohin kommt der apidocs Ordner? Bin etwas überfordert... hat jemand Erfahrung mit HtmlUnit und kann mir ein wenig unter die Arme greifen?


----------



## XHelp (19. Okt 2010)

Hat eher weniger mit speziell HtmlUnit zu tun. Googlesuche nach "eclipse add library" liefert bestimmt die passende Lösung.

Wenn du aber gerade erst anfängst, würde ich nicht auf ein Haufen Frameworks zugreifen, versuch es lieber mit Standardmitteln umzusetzen. So wirst du imho mehr lernen. Kenne zwar deinen Router nicht, aber ich denke Google verrät dir unter "java send POST request" das wichtigste, was du dafür brauchst.


----------



## Gastredner (19. Okt 2010)

Und wenn du doch eine Bibliothek benötigst:
Erstelle dir in deinem Projekt am Besten einen Ordner namens "lib" und kopiere das .jar einach hinein. Anschließend Rechtsklick und im Kontextmenü unter Build Path auf "Add to Build Path" klicken. Die Bibliothek taucht nun unter unter einem Menüpunkt namens "Referenced Libraries" auf. Willst dann noch den Source-Code oder Javadoc hinzufügen, so kannst du dies über den Properties der Bibliothek (Rechtsklick -> Properties).
Beim Export als Runnable Jar bietet dir Eclipse zudem die Möglichkeit, verwendete Bibliotheken direkt mit in dein .jar zu packen.


----------



## timbeau (19. Okt 2010)

Und wenn mans ganz bequem haben will und noch für die Zukunft lernen kann man sich mal Maven2 anschauen. Da kannst du die libs ganz einfach in einem Online-Repository suchen und der packt sie dir an die richtige Stelle. Mit allen Abhängigkeiten. 

Für eclipse: 

Installing m2eclipse | Sonatype


----------



## moccajoghurt (19. Okt 2010)

Also ich hab mich dafür entschieden das Programm mit Standardmitteln umzusetzen, damit ich mehr lerne. Habe mir die das Klassenarchiv java.net.*; angeschaut und stelle fest, dass das Programm nicht auf das Inet zugreifen kann, weil es den Zugang zum Internet nicht findet... also muss ich wohl die Proxyeinstellungen in Java festlegen... weiß leider nicht wie das gehen soll. Habe folgendes Programm geschrieben um mich mit java.net.*; vertraut zu machen:


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

public class Router {
    public static void main(String[] args) throws Exception {

        URL router = new URL("http://fritz.box");
        BufferedReader in = new BufferedReader(new InputStreamReader(
                router.openStream()));

        String inputLine;
        while ((inputLine = in.readLine()) != null) {
            System.out.println(inputLine);
            in.close();
        }
    }
}
```


----------



## moccajoghurt (19. Okt 2010)

ok mein prog war fehlerhaft, hab den fehler gefunden, hat nix mit proxyeinstellungen zu tun^^
sorry nächstes mal schau ich genauer


----------



## moccajoghurt (20. Okt 2010)

Ich versuche gerade herauszufinden wie ich das Passwort an den Router übermittle, weil die Passwortübergabe am Router über in javascript geregelt ist. Wie kann mein Programm jetzt die Passwort-Daten an den Server übermitteln, damit mein Programm auf den Router zugreifen kann...? Hier mein bisheriger Code:


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

public class Router1 {
    public static void main(String[] args) throws Exception {
        String passwd = "admin";

        URL router = new URL("http://fritz.box/login.lua?page=/home/home.lua");
        URLConnection rc = router.openConnection();
        rc.setDoOutput(true);

        OutputStreamWriter writer = new OutputStreamWriter(rc.getOutputStream());

        writer.write(passwd);
        writer.flush();

        BufferedReader buffer = new BufferedReader(new InputStreamReader(
                rc.getInputStream()));
        
        String inf;
        
        while ((inf = buffer.readLine()) != null) {
            System.out.println(inf);
        }
    }
}
```


----------



## moccajoghurt (20. Okt 2010)

Kann niemand einen Tipp geben? Ich brauche wenigstens einen Anhaltspunkt auf dem ich aufbauen kann^^


----------



## XHelp (20. Okt 2010)

Dazu muss man ja das Anmeldefenster sehen...
Hast du schon mal nach "java POST request" gesucht?


----------



## moccajoghurt (20. Okt 2010)

ja danach habe ich gesucht und soweit ich das verstanden habe sendet man den POST request über dem OutputStreamWriter... oder sehe ich das falsch? ich kann den sourcecode vom login leider nicht soweit verstehen, dass ich den richtigen POST request senden könnte...
hier mal das javascript, dass den login regelt:

```
<script type="text/javascript" src="/js/md5.js"></script>
<script type="text/javascript">
var challenge = "f56c6b05";
function makeDots(str) {
var newStr = "";
for (var i = 0, len = str.length; i < len; i++) {
if (str.charCodeAt(i) > 255) newStr += ".";
else newStr += str.charAt(i);
}
return newStr;
}
function uiDoOnMainFormSubmit()
{
var resp = challenge + "-" + makeDots(jxl.getValue("uiPass"));
jxl.setValue("uiResp", challenge + "-" + hex_md5(resp));
jxl.disable("uiPass");
jxl.disable("uiSubmitLogin");
jxl.setStyle("uiMainForm", "cursor", "wait");
return true;
}
function getWaitStr(mSec)
{
var sec = Math.ceil(mSec/1000);
if (sec === 1) {
return "Bitte warten Sie 1 Sekunde.";
}
else {
return "Bitte warten Sie %1 Sekunden.".replace(/%1/,sec);
}
}
function doBlockLogin(time)
{
jxl.disable("uiPass");
jxl.disable("uiSubmitLogin");
var start = (new Date()).getTime();
var timer = timer || null;
if (timer) {
window.clearTimeout(timer);
timer = null;
}
function f () {
var now = (new Date()).getTime();
var wait = time - (now - start);
if (wait > 0) {
jxl.setHtml("uiWait", getWaitStr(wait));
timer = window.setTimeout(f,500);
}
else {
jxl.hide("uiWait");
jxl.enableWithFocus("uiPass");
jxl.enable("uiSubmitLogin");
}
}
f();
}
function init()
{
var form = jxl.get("uiMainForm");
if (form)
{
jxl.hide("jswarning");
jxl.enable("uiSubmitLogin");
jxl.focus("uiPass");
form.onsubmit = uiDoOnMainFormSubmit;

}
}
ready.onReady(init);
</script>
```


----------



## moccajoghurt (20. Okt 2010)

Ich poste mal den gesamten HTML-Quellcode. Wie sende ich dieses doofe Passwort an die richtige Stelle ;(


```
<!DOCTYPE html>
<html>
<head>
<meta http-equiv=content-type content="text/html; charset=utf-8">
<title>Willkommen bei FRITZ!Box</title>
<link rel="stylesheet" type="text/css" href="/css/default/main.css"/>
<link rel="stylesheet" type="text/css" href="/css/default/print.css" media="print"/>
<!--[if lte IE 7]>
<link rel="stylesheet" type="text/css" href="/css/default/ie_fix.css"/>
<![endif]-->
<!--[if IE]>
<style type="text/css">
.hide_ftp_link {display: none;}
</style>
<![endif]-->
<script type="text/javascript" src="/js/jxl.js"></script>
<script type="text/javascript" src="/js/ready.js"></script>
<script type="text/javascript" src="/js/help.js"></script>
<script type="text/javascript" src="/js/popup.js"></script>

<script type="text/javascript" src="/js/globalonclick.js"></script>
<script type="text/javascript">
//Click Waitcourser anzeigen
//ready.onReady(globalOnClick.init);
if (window.location.search.indexOf("&popupwnd=1")!=-1) {
ready.onReady(popup.prepareHeader);
}
ready.onReady(help.show);
</script>

<script type="text/javascript" src="/js/md5.js"></script>
<script type="text/javascript">
var challenge = "e4f5fc9e";
function makeDots(str) {
var newStr = "";
for (var i = 0, len = str.length; i < len; i++) {
if (str.charCodeAt(i) > 255) newStr += ".";
else newStr += str.charAt(i);
}
return newStr;
}
function uiDoOnMainFormSubmit()
{
var resp = challenge + "-" + makeDots(jxl.getValue("uiPass"));
jxl.setValue("uiResp", challenge + "-" + hex_md5(resp));
jxl.disable("uiPass");
jxl.disable("uiSubmitLogin");
jxl.setStyle("uiMainForm", "cursor", "wait");
return true;
}
function getWaitStr(mSec)
{
var sec = Math.ceil(mSec/1000);
if (sec === 1) {
return "Bitte warten Sie 1 Sekunde.";
}
else {
return "Bitte warten Sie %1 Sekunden.".replace(/%1/,sec);
}
}
function doBlockLogin(time)
{
jxl.disable("uiPass");
jxl.disable("uiSubmitLogin");
var start = (new Date()).getTime();
var timer = timer || null;
if (timer) {
window.clearTimeout(timer);
timer = null;
}
function f () {
var now = (new Date()).getTime();
var wait = time - (now - start);
if (wait > 0) {
jxl.setHtml("uiWait", getWaitStr(wait));
timer = window.setTimeout(f,500);
}
else {
jxl.hide("uiWait");
jxl.enableWithFocus("uiPass");
jxl.enable("uiSubmitLogin");
}
}
f();
}
function init()
{
var form = jxl.get("uiMainForm");
if (form)
{
jxl.hide("jswarning");
jxl.enable("uiSubmitLogin");
jxl.focus("uiPass");
form.onsubmit = uiDoOnMainFormSubmit;

}
}
ready.onReady(init);
</script>
</head>
<body>
<!-- pagename:/login.lua-->
<div id="main_page_all">
<div id="intro_bar_box">
<div id="intro_bar_left">
<img src="../html/de/images/leer.gif" width="140" height="70" usemap="#logo" style="border:0px;">
<map name="logo">

<area shape="rect" coords="30,0,135,80" href="/home/home.lua?sid=0000000000000000">
</map>
</div>
<div id="intro_bar_right"></div>
<div id="intro_back">
<div id="intro_bar_middle"></div>
</div>
</div>
<div class="clear_float"></div>


<div id="page_content_no_menu_box">
<div class="blue_bar_left_edge"></div>
<div class="blue_bar_right_edge"></div>
<div class="blue_bar_back">
<h2>Willkommen bei FRITZ!Box</h2>

</div>
<div id="page_content">



<p>Die Benutzeroberfläche der FRITZ!Box ist mit einem Kennwort geschützt. Melden Sie sich mit dem Kennwort an.</p>
<form class="close" method="POST" action="/login.lua" id="uiMainForm">
<div class="formular">
<label for="uiPass">Kennwort</label>
<input type="password" id="uiPass" name="password">

<p id="jswarning">Achtung! Für die Anmeldung ist aus Sicherheitsgründen zwingend Javascript erforderlich. Bitte aktivieren Sie Javascript in den Einstellungen Ihres Browsers.</p>
</div>
<p>

Wenn Sie Ihr Kennwort vergessen haben, können Sie die FRITZ!Box auf die Werkseinstellungen <a href="/vergessen.lua">zurücksetzen</a>.
</p>

<div id="btn_form_foot">
<input type="hidden" id="uiResp" name="response">
<input type="hidden" name="get_page" value="/home/home.lua">
 
<button type="submit" id="uiSubmitLogin" disabled>Anmelden</button>
</div>
</form>
</div>
<div class="clear_float"></div>
<div class="page_bottom_container">
<div class="page_left_bottom"></div>

<div class="page_right_bottom"></div>
<div class="page_back_bottom" style="">
<div id="MainPagebottom">
</div>
</div>
</div>

<div id="foot_menu_box">

</div>

</div>
</div>

</body>
</html>
```


----------



## XHelp (20. Okt 2010)

Auf den ersten Blick ist für dich folgendes relevant:

```
<form class="close" method="POST" action="/login.lua" id="uiMainForm">
<input type="password" id="uiPass" name="password">

<input type="hidden" id="uiResp" name="response">
<input type="hidden" name="get_page" value="/home/home.lua">
 
<button type="submit" id="uiSubmitLogin" disabled>Anmelden</button>
</form>
```


----------



## moccajoghurt (20. Okt 2010)

ok. Also was muss ich in den String schreiben, den ich als POST method versende? 
	
	
	
	





```
String passwd = "uiPass=\"admin\"";
```
 ?

kann man das aus diesem quellcode herauslesen oder muss ich rumprobieren?


----------



## JohannisderKaeufer (20. Okt 2010)

Ein Tip.

Wenn du den Firefox verwendest, dann besorge dir das Plugin Firebug.
Dort gibt es einen Reiter Netzwerk, dort wird protokolliert was der Browser sendet und empfängt. Und wie die jeweiligen Header aussehen.

Hier würde ich erstmal manuell versuchen mich einzuloggen und schauen was denn da für Daten überhaupt gesendet werden.


----------



## moccajoghurt (20. Okt 2010)

Ok, danke für den Tipp. Dadurch hab ich einige Infos, jetzt muss ich nurnoch wissen, wie ich sie auswerten kann^^





weiß jemand welcher teil davon jetzt in den String muss?


----------



## XHelp (20. Okt 2010)

Keiner von dennen, die auf dem Bild sind... es könnte evtl sein, dass der Router den Referer überprüft, aber ich bezweifle es stark.
Du brauchst die Daten. Wie gesagt, such nach der Post-Anfrage, da gibt es mit Sicherheit auf dem 1. Link ein Beispiel wie du Daten sendest und die Antwort bekommst.


----------



## heinzHerbert (20. Okt 2010)

Für dich ist folgendes aus dem Quelltext relevant:


```
<script type="text/javascript">
var challenge = "e4f5fc9e";
function makeDots(str) {
var newStr = "";
for (var i = 0, len = str.length; i < len; i++) {
if (str.charCodeAt(i) > 255) newStr += ".";
else newStr += str.charAt(i);
}
return newStr;
}
function uiDoOnMainFormSubmit()
{
var resp = challenge + "-" + makeDots(jxl.getValue("uiPass"));
jxl.setValue("uiResp", challenge + "-" + hex_md5(resp));
jxl.disable("uiPass");
jxl.disable("uiSubmitLogin");
jxl.setStyle("uiMainForm", "cursor", "wait");
return true;
}

...
```

Wenn du dir deine beiden geposteten Quelltexte mit dem JavaScript anschaust, wirst du sehen, dass der Wert der Variable "challenge" immer verschieden ist. Du brauchst immer diesen Wert. Und dann wird, bevor der POST-Request versendet wird, noch die Funktion "uiDoOnMainFormSubmit" ausgeführt. Die setzt den Wert von einem Eingabefeld im Formular neu. Dieses Feld ist das:

```
<input type="hidden" id="uiResp" name="response">
```

Das machen diese beiden Zeilen in der Funktion:

```
var resp = challenge + "-" + makeDots(jxl.getValue("uiPass"));
jxl.setValue("uiResp", challenge + "-" + hex_md5(resp));
```

"makeDots" ist auch hier im JavaScript definiert. "hex_md5" nicht. Du musst den Wert des Formular-Feldes auf die selbe Weise bestimmen.

Und dann kannst du alles, was in diesem Formular steht (inkl. des für "uiResp" berechneten Wertes) in deinen POST-Request einpacken und das ganze abschicken:


```
<form class="close" method="POST" action="/login.lua" id="uiMainForm">
<input type="password" id="uiPass" name="password">

<input type="hidden" id="uiResp" name="response">
<input type="hidden" name="get_page" value="/home/home.lua">
 
<button type="submit" id="uiSubmitLogin" disabled>Anmelden</button>
</form>
```


----------

