# JavaScript via Java ausführen



## StupidAttack (24. Dez 2010)

Hallo liebe Community 

Sitze nun schon seit längerem an einem Problem.

Ich habe folgendes JavaScript Skript, das, wenn ich es via Mozilla Browser aufrufe ohne Probleme funktioniert. Es extrahiert die FireFox Cookies via CookieManager Interface.

[XML]			netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
				try{
				 var cookieMgr = Components.classes["@mozilla.org/cookiemanager;1"]  
								  .getService(Components.interfaces.nsICookieManager);  				  
				 var sid = "sid"; 
				 for (var e = cookieMgr.enumerator; e.hasMoreElements() {  
				   var cookie = e.getNext().QueryInterface(Components.interfaces.nsICookie);   
					   if(cookie.name == sid){
							print("SID found :"+cookie.value);
					   }

				 }
				 print("Last Cookie :"+cookie.value);

				 }catch(err){ print(err.toString()); }
[/XML]

Ich möchte es jetzt in meinem Java Programm mit dem ScriptEngineManager ausführen. Das sieht so aus:

```
import java.io.FileReader;
import java.sql.SQLException;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class Main {
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) throws ClassNotFoundException, SQLException, ScriptException {

        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("js");
        try {
            FileReader reader = new FileReader("C:/Users/Nikolai/getTheseCookies.js");
            engine.eval(reader);
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

Wenn ich es compiliere bekomme ich folgenden Fehler:

```
javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "netscape" is not defined. (<Unknown source>#1) in <Unknown source> at line number 1
        at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:110)
        at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:232)
        at http_request.Main.main(Main.java:28)
```

Warum ist hier "netscape" nicht definiert? Warum kann Firefox es richtig interpretieren? Ich bin schier am verzweifeln, könnt ihr mir einen Denkanstoss geben, warum das nicht klappt? Normalerweise frage ich nicht so "offen", aber ich komme einfach nicht weiter...


----------



## AlexSpritze (24. Dez 2010)

Vermutlich definiert Firefox für sich selbst "netscape" und wenn du dein Skript in der JVM laufen lässt ist das nicht da.

Vielleicht kannst du die Cookies auch ohne JavaScript, sondern direkt mit Java auslesen?


----------



## StupidAttack (25. Dez 2010)

Ja, da habe ich auch schon mehrmals versucht und habe mir verschiedene packages gezogen, doch ich kriegs ned gebacken :/
Hier habe ich dafür schon einen Thread aufgemacht, leider konnte mir noch niemand ein Beispiel zeigen wie man direkt mit Java auf die Cookies zugreift 
Habe etwa schon 7 Java Foren und Mozilla Developer Foren durchsucht, aber nirgends ein konkretes Beispiel gefunden. Ich kann allerdings verstehen,warum mit niemand antwortet, ist auch ein extrem exotisches Gebiet...Vieleicht muss ich da paar Euronen dafür bieten, was wäre angeberacht für ein kurzes Beispielsprpgramm, das zeigt wie man die Packages richtig verwendet? 30 Euro?

Grüsse


Der Thread DA


----------



## planetenkiller (25. Dez 2010)

Is there a way to read the browser's cookie from a java applet? - Stack Overflow

Java Cookie Demo (siehe zip für Code)


----------



## kay73 (25. Dez 2010)

So wie ich es bislang verstanden habe, scheint es durchaus möglich auf die Cookies von Firefox (und nur Firefox per JavaXPCOM) in einer Standalone-Java-Applikation zuzugreifen. 

Der Weg dahin ist aber äußerst steinig und Einbinden von zwei JAR-Files ist das kleinste Problem: Du brauchst das XULRunner-SDK mit JavaXPCOM Support. Es gibt auf developer.mozilla.org in der Source Sektion ein paar Tests mit Sourcen, in denen man schauen kann wie das geht. Wahrscheinlich kann man dann per Mozilla.getServiceManager() Zugriff auf den CookieManager bekommen.

Was mir unklar ist:

Ob sich die Referenz von Mozilla auf den laufenden Firefox bezieht.
In dem Mozilla-Code scheint ein Aufruf von 
	
	
	
	





```
Moz.initialize(grePath);
```
 zu fehlen
Ich habe es leider nicht geschafft, JavaXPCOM ans Laufen zu bekommen, da unter Ubuntu das xulrunner-sdk hoffnungslos vermasselt ist (- JavaXPCOM fehlt, alte xulrunner-config wird angezogen) und ich zu doof bin, es ans Laufen zu bekommen. Als die nativen Libraries crashten, war ich es leid.

Viel Glück noch...

*Update:* Habe mal das bin-Verzeichnis eines XULRunner-19.2.13-SDKs als GRE-Path angegeben und konnte zumindest die Objekte instantiieren. Was aber nach wie vor nicht hinhaut, ist meine Firefox-3.6.13 Installation als XULRunner Basis zu nutzen, obwohl die XULRunner Version stimmt; da crasht die native Library noch wie vor.

Hier ist Code, den ich zum Laufen bekommen habe. Leider hats da keine Cookies...
	
	
	
	





```
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Properties;

import org.mozilla.interfaces.nsICookieManager;
import org.mozilla.interfaces.nsIServiceManager;
import org.mozilla.interfaces.nsISimpleEnumerator;
import org.mozilla.interfaces.nsISupports;
import org.mozilla.xpcom.GREVersionRange;
import org.mozilla.xpcom.Mozilla;

public class Main {

    public static void main(String[] args) throws FileNotFoundException{

        GREVersionRange[] range = new GREVersionRange[1];
        range[0] = new GREVersionRange("1.8", true, "1.9+", true);
        Properties props = null;

        final File grePath = Mozilla.getGREPathWithProperties(range, props);
		
        final Mozilla Moz = Mozilla.getInstance();
        Moz.initialize(grePath);        
        Moz.initXPCOM(grePath, null);
                
        final nsIServiceManager sm = Moz.getServiceManager();
        
        nsICookieManager cm = (nsICookieManager) sm.getServiceByContractID("@mozilla.org/cookiemanager;1", 
        					nsICookieManager.NS_ICOOKIEMANAGER_IID);

        final nsISimpleEnumerator en = cm.getEnumerator();
        while(en.hasMoreElements()) {               	
        	final nsISupports s = en.getNext(); 
        	System.out.println(s.toString());
        }

        Moz.shutdownXPCOM(null);
    }
}
```


----------



## StupidAttack (25. Dez 2010)

kay73 hat gesagt.:


> So wie ich es bislang verstanden habe, scheint es durchaus möglich auf die Cookies von Firefox (und nur Firefox per JavaXPCOM) in einer Standalone-Java-Applikation zuzugreifen.
> 
> Der Weg dahin ist aber äußerst steinig: Du brauchst das XULRunner-SDK mit JavaXPCOM Support. Es gibt auf developer.mozilla.org in der Source Sektion ein paar Tests mit Sourcen, in denen man schauen kann wie das geht. Wahrscheinlich kann man dann per Mozilla.getServiceManager() Zugriff auf den CookieManager bekommen.
> 
> ...


GENAU mit diesem Problemen habe ich auch zu kämpfen. Gestern habe ich alles 1 zu 1 durchgenmacht, war bis um 4:30 auf :/
Das ist so wiederlich, da freut man sich dass man Javaxpcom gefunden hat, bindet alles ein wie es hier steht und fängt mit dem Tut an: Erstes Problem,der Location Manager ist nicht dabei, ich suche ihn stundenlang via Netz und finde einen im selben Package aber mit einem falschen Konstruktor von 2006 :/
Halb so schlimm, denke ich, kann ja den Pfad manuell suchen, ist ja keine Hexerei und dann findet mein System den GRE nicht und klicke auf folgende Seite um zu gucken wie man den GRE registriert, doch ich kann die Registry gar nicht ändern, da sie gar nicht existieren :/
Wer hat da noch Bock, ausserdem ist JAVAXPCOM sowieso schon veraltet 

Alles was ich brauche ist eine Möglichkeit an die Cookies zu kommen. 

Jetzt die wirklich dümmste Art: Ist es Möglich Via Java ein JavaScript Programm im FirefoxBrowser auszuführen, dass die Cookies (die ich brauche) in eine txt schreibt und dann könnte mein Java Programm sie einlesen...auf was anderes habe ich echt kein Bock mehr, ist ja schauderhaft 

Liebe Grüsse und danke für eure lieben Antworten


----------



## kay73 (25. Dez 2010)

StupidAttack hat gesagt.:


> Erstes Problem,der Location Manager ist nicht dabei,


Dieser LocationManager ist eine "selbstgeschriebe" Klasse, die ein bestimmtes Interface implementiert, mit dem sich diese doofe GRE irgendwelche Pfade zu obskuren Verzeichnisse und Files beschaffen kann. In diesem Testverzeichnis liegt eine solche, aber ich wurde auch nicht daraus schlau. Und meines Wissens braucht man den nur, wenn man Mozilla in eigene Instanz einbetten will. Ich vermute, dass man da nichts einbetten muss/darf, wenn man mit einer laufenden Firefox-Instanz interagieren will. 

Ich meine es aber so verstanden zu haben, dass JavaXPCOM die einzige Möglichkeit ist, sich auf eine laufende XUL-Instanz per Java Zugriff zu verschaffen; die "Java-XPCOM-Bridge" ist veraltet.

Grundsätzlich scheint das ja sogar zu laufen (siehe *Update:* oben); ich probier noch mal was weiter. Ist vielleicht eine interessante Möglichkeit, um Java-basierte Firefox-Plugins zu schreiben.



StupidAttack hat gesagt.:


> Ist es Möglich Via Java ein JavaScript Programm im FirefoxBrowser auszuführen, dass die Cookies (die ich brauche) in eine txt schreibt und dann könnte mein Java Programm sie einlesen...


Mit reinem JavaScript eher weniger, denn das wäre eine gigantische Sicherheitslücke. 

Wenn es um rein pragmatisches "Herausholen" der Cookies geht, schreib' doch ein Applet, das signiert ist und eine public-Methode hat, die Strings entgegen nimmt. Die rufst Du dann aus JS mit den Cookies als Argument auf; an die Cookies bist Du per JS ja schon herangekommen und ein signiertes Applet darf ja alles machen, u. a. natürlich auch Plattenzugriffe.

Dann gibt es da noch "LiveConnect" (https://developer.mozilla.org/en/LiveConnect), mit dem man aus JavaScript heraus Java aufrufen kann. Aber ich habe davon 0 Ahnung...

Und hier hat noch einer das Problem und es wird vorgeschlagen, das über eine Firefox Erweiterung zu lösen.
cookies - Calling Firefox XPCOM from external app? - Stack Overflow


----------



## StupidAttack (25. Dez 2010)

kay73 hat gesagt.:


> Ich meine es aber so verstanden zu haben, dass JavaXPCOM die einzige Möglichkeit ist, sich auf eine laufende XUL-Instanz per Java Zugriff zu verschaffen; die "Java-XPCOM-Bridge" ist veraltet.
> 
> Grundsätzlich scheint das ja sogar zu laufen (siehe *Update:* oben); ich probier noch mal was weiter. Ist vielleicht eine interessante Möglichkeit, um Java-basierte Firefox-Plugins zu schreiben.



Der Firefox Browser basiert ja auf XulRunner, müsste man nicht einfach den XulRunner unter C:/Programme/Mozilla Firefox anzapfen? Der GRE path sucht doch den XulRunner den man sich heruntergeladen hat und der in der Registry ist (sein sollte, bei mir finde ich den ned^^). Der JS Code funktioniert auch nur, wenn man ihn mit FF aufruft. Also müssen wir das gleiche mit unsereren javaxpcom interfaces machen...Aber ich bin verwirrt, als Anfänger etwas komplex für mich :/



> Wenn es um rein pragmatisches "Herausholen" der Cookies geht, schreib' doch ein Applet, das signiert ist und eine public-Methode hat, die Strings entgegen nimmt. Die rufst Du dann aus JS mit den Cookies als Argument auf; an die Cookies bist Du per JS ja schon herangekommen und ein signiertes Applet darf ja alles machen, u. a. natürlich auch Plattenzugriffe.



Aber dann muss meine Desktop Applikation ein Applet steuern, dass ein JS Programm steuert. Kann ich überhaupt ein Applet in einer DesktopAplikation einbinden? (sorry für diese Anfängerfragen,  aber Java Webanwendungen habe ich bisher noch überhaupt nicht angeschaut). 



> Dann gibt es da noch "LiveConnect" (https://developer.mozilla.org/en/LiveConnect), mit dem man aus JavaScript heraus Java aufrufen kann. Aber ich habe davon 0 Ahnung...


Mhh, wird mir nich helfen, eher umgekehrt mir ScriptEngine von rhino, habe ich aber auch schon durch, da Rhino Firefox Packages nicht hat und sowieso nicht auf FF zugreifen kann.




> Und hier hat noch einer das Problem und es wird vorgeschlagen, das über eine Firefox Erweiterung zu lösen.


Mhh, dachte ich auch schon. Aber hilft mir auch nicht wirklich weiter. 

Weisst du was ich jetzt machen werde? Firefox kann mich mal, da ich offensichtlich zu plöd bin, gehe ich jetzt ne Stufe tiefer und sniffe jetzt einfach den TCP Verkehr, bzw werde auf Port 80 die setCookies packete sniffen, kopieren und weiterleiten 

Ob das einfach wird ist dahingestellt, ich denke ich schreibe mir ne eigene C Klasse, die die enstprechenden Packete snifft und binde das ganze gelumpe dann in Java ein, Raw Sockets ich komme :rtfm::rtfm::rtfm:

Ich danke dir für deine Hilfe, hätte nicht gedacht, dass es Coder mit dem gleichen Problem gibt...

Edit: Noch viel besser und ich muss nicht mit C rummurksen: Jpcap - Install

Mal schauen wie mich Firefox jetzt daran hindern will, die Cookies zu bekommen :bae:


----------



## StupidAttack (25. Dez 2010)

DONE.

Warum auf ne vermurkste Anwendung verlassen, wenn man schnüffeln kann :bae:

Hier drauf gehen:
Jpcap - Install

die Installer fürs OS downloaden, installieren, neustarten, jpcap.jar einbinden und das Tut auf selbiger Seite lesen. Das Tut ist gut geschrieben, verständlich und lässt keine einzige Frage offen. Für Anfänger bestens geeignet. So verdammt einfach kanns sein 

Hier der Code, mit dem ich die Cookies sniffe 

Main Klasse:

```
import jpcap.*;
import java.io.*;

/**
 *
 * @author Nikolai
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) throws IOException {


        //Obtain the list of network interfaces
        NetworkInterface[] devices = JpcapCaptor.getDeviceList();

        //for each network interface
        for (int i = 0; i < devices.length; i++) {
            //print out its name and description
            System.out.println(i + ": " + devices[i].name + "(" + devices[i].description + ")");

            //print out its datalink name and description
            System.out.println(" datalink: " + devices[i].datalink_name + "(" + devices[i].datalink_description + ")");

            //print out its MAC address
            System.out.print(" MAC address:");
            for (byte b : devices[i].mac_address) {
                System.out.print(Integer.toHexString(b & 0xff) + ":");
            }
            System.out.println();

            //print out its IP address, subnet mask and broadcast address
            for (NetworkInterfaceAddress a : devices[i].addresses) {
                System.out.println(" address:" + a.address + " " + a.subnet + " " + a.broadcast);
            }

            JpcapCaptor captor = JpcapCaptor.openDevice(devices[0], 65535, false, 20);
            captor.setFilter("ip and tcp", true);

            PacketPrinter printer = new PacketPrinter(captor);
            printer.run();

            captor.close();
        }

    }
}
```

Und hier der packetPrinter als Therad:

```
import jpcap.JpcapCaptor;

/**
 *
 * @author Nikolai
 */
class PacketPrinter implements Runnable {

    private JpcapCaptor captor;

    public PacketPrinter(JpcapCaptor captor) {
        this.captor = captor;
    }

    public void run() {
        while (true) {
            try {
                printBytes(captor.getPacket().data);
            } catch (Exception e) {
            }
        }
    }

    private void printBytes(byte[] bytes) {
        String decodedString = new String(bytes);
        System.out.println(decodedString);
        System.out.println("\n");
    }
}
```


Warum nen ganzen Xulrunner simulieren, wenn man sich die Infos holt bevor so CodeMonster wie Xulrunner die Cookies verstecken 

Euch allen wunderschöne Weihnachten!!!


----------

