Programm, das nach abgearbeiteter main Methode weiterläuft

Guenter123987

Bekanntes Mitglied
Mein Programm wartet via KeyListener auf Tastatureingaben und reagiert darauf. Das heißt, es hat keine main Methode, die feste Befehle abarbeitet. Es arbeitet also in diesem Aspekt ähnlich wie eine Nutzeroberfläche. Das Problem ist, dass ich das Programm zurzeit nicht starten kann, da schlicht und einfach die main Methode leer ist. Das muss doch irgendwie zu beheben sein, sonst gäbe es ja nicht JFrame. Oder?
 
Das heißt, es hat keine main Methode, die feste Befehle abarbeitet.
Jedes Programm braucht aber eine main-Methode, diese ist nun mal der Startpunkt. Bei einem JFrame erzeugt man auch ein entsprechendes Objekt und setzt dieses dann sichtbar.
Das Problem ist, dass ich das Programm zurzeit nicht starten kann, da schlicht und einfach die main Methode leer ist. Das muss doch irgendwie zu beheben sein, sonst gäbe es ja nicht JFrame. Oder?
Wie soll denn dein Programm auf Tastatureingaben reagieren? Wie schaut denn der aktuelle Code aus? (vereinfacht reicht auch)
Wo hängt der KeyListener dran? An einer UI Komponenten? Wenn du diese nicht anzeigst wird sie auch nie den Fokus bekommen.
 
Java:
public class Tastenreaktion implements KeyListener {
   @Override
   public void keyPressed(KeyEvent e) {
       reagiere;
   }
}
Ist stark vereinfacht, es sind ja nicht mal alle Methoden aus dem Interface vorhanden. Aber so ist bisher die Grundstruktur.
 
Ok, das ist das komplette bisherige Programm. Sicherlich nicht zu stark vereinfacht. Da es noch nicht fertig ist, könnten im Textdokument natürlich Dinge doppelt stehen wegen den beiden Methoden. Das soll später dort verhindert werden, wo jetzt if (true) steht.
Java:
package main;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class Main implements KeyListener {
 
   static long startMillis;
 
   @Override
   public synchronized void keyTyped(KeyEvent e) {
       char typedChar = e.getKeyChar();
       try {
           FileWriter fw = new FileWriter("C:\\Users\\Timon\\.p2\\Notizen.txt");
           BufferedWriter bw = new BufferedWriter(fw);
       
           bw.write(getRuntimeSeconds() + " " + typedChar);
       
           bw.close();
           fw.close();
       
       } catch (IOException exc) { exc.printStackTrace(); }
   }

   @Override
   public synchronized void keyPressed(KeyEvent e) {
       int typedKeyIndex = e.getKeyCode();
       String typedKeyString = KeyEvent.getKeyText(typedKeyIndex);
       try {
           FileWriter fw = new FileWriter("C:\\Users\\Timon\\.p2\\Notizen.txt");
           BufferedWriter bw = new BufferedWriter(fw);
       
           if (true) {
               bw.write(getRuntimeSeconds() + " " + typedKeyString);
           }
       
           bw.close();
           fw.close();
       
       } catch (IOException exc) { exc.printStackTrace(); }
   }
 
   public static void main(String[] args) throws InterruptedException {
       startMillis = System.currentTimeMillis();
   }
 
   static String getRuntimeSeconds() {
       return Long.toString((System.currentTimeMillis() - startMillis) / 1000);
   }

   @Override
   public void keyReleased(KeyEvent e) { /*nur wegen Interface nötig*/ }
}
 
Zuletzt bearbeitet:
Mir ist der Gedanke gekommen, dass ich vielleicht in der main Methode eine Instanz der eigenen Klasse erstellen muss, da die 3 Methoden aus dem Interface ja nicht statisch sind. Hat aber auch nicht geklappt.
 
Kann ich eine GUI nehmen, bei der visible false ist? So ein Keylogger sollte ja nicht unbedingt gesehen werden.
Ich mach den Keylogger nur, um zu gucken, obs in Java möglich ist. Ich mach keine schlimmen Sachen damit.
 
Mist. Das heißt, ich kann ohne sichtbares Fenster gar keine Tastatureingaben abfragen? Das ist irgendwie komisch, dann könnte man ja keinen Hintergrundprozess via Shortcut beenden.
 
Es muss möglich sein, dass man nur eine Instanz einer spezifischen Klasse erstellen muss und das Programm läuft durch, bis System.exit(0);. Es kann gar nicht anders sein, weil man JFrame ja auch einfach nur instanziiert und es läuft durch. Und JFrame ist ja auch eigentlich nur eine Klasse.
Dann könnte ich ja theoretisch einfach den Source Code von JFrame durchgucken und gucken, wie das funktioniert. Habe ich versucht, aber ich finde mich in der ewig langen Klasse nicht zurecht. Und sie erbt auch noch von Window (auch ewig lang) und Window erbt von Frame (ebenfalls kilometerlang). Hat irgendjemand von euch eine Idee, wie es funktionieren könnte? Ansonsten lese ich mir das alles durch, und wenn es Monate braucht.
 
Liegt im Framekonstruktor Zeile 419. Verweist auf die "init"-Methode Zeile 449. Und da komme ich nicht weiter. Kann mir da jemand helfen? Ich weiß nicht, was this in Zeile 450 und 451 bedeutet. Wäre sehr dankbar.
Kann es sein, dass this auf die Instanz verweist, die gerade erstellt wird?
 
Wenn dem so wäre, würde es Sinn ergeben. Dann würde nichts zum gewünschten Effekt führen können, außer dass
Java:
sun.awt.SunToolkit.checkPolicy(<Frame-Instanz, die gerade erstellt wird>, false)
aufgerufen wird.
 
Zuletzt bearbeitet:
Das hier ist die Methodendeklaration.
Java:
   public static void checkAndSetPolicy(Container cont, boolean isSwingCont)
   {
       FocusTraversalPolicy defaultPolicy = KeyboardFocusManager
           .getCurrentKeyboardFocusManager().getDefaultFocusTraversalPolicy();

       String toolkitName = Toolkit.getDefaultToolkit().getClass().getName();
       // if this is not XAWT then use default policy
       // because Swing change it
       if (!"sun.awt.X11.XToolkit".equals(toolkitName)) {
           cont.setFocusTraversalPolicy(defaultPolicy);
           return;
       }

       String policyName = defaultPolicy.getClass().getName();

       if (DefaultFocusTraversalPolicy.class != defaultPolicy.getClass()) {
           // Policy was changed
           // Check if it is awt policy or swing policy
           // If it is Swing policy we shouldn't use it in AWT frames
           // If it is AWT policy  we shouldn't use it in Swing frames
           // Otherwise we should use this policy
           if (policyName.startsWith("java.awt.")) {
               // AWT
               if (isSwingCont) {
                   // Can't use AWT policy in Swing windows - should use Swing's one.
                   defaultPolicy = createLayoutPolicy();
               } else {
                   // New awt policy.
               }
           } else if (policyName.startsWith("javax.swing.")) {
               if (isSwingCont) {
                   // New Swing's policy
               } else {
                   defaultPolicy = new DefaultFocusTraversalPolicy();
               }
           }
       } else {
           // Policy is default, use different default policy for swing
           if (isSwingCont) {
               defaultPolicy = createLayoutPolicy();
           }
       }
       cont.setFocusTraversalPolicy(defaultPolicy);
   }
Man könnte auf jeden Fall eine Frame-Instanz übergeben, weil Frame von Window erbt und Window von Container. Also ist Container eine Mutterklasse von Frame.
Und wer sich das fragt: policy heißt in dem Fall Regel oder Verfahrensweise.
 
Zuletzt bearbeitet:
Um "nur mal zu gucken, obs überhaupt geht", investierst du aber ziemlich viel Mühe.
Am Ende dürfte die Erkenntnis stehen, dass ein Java KeyListener nicht global/windowsweit arbeitet, sondern nur innerhalb einer Java GUI.
 
Ich sehs ja schon ein, dass es nicht geht. Aber wie ein Programm funktioniert, das laufend reagiert und nicht etwas Festes abarbeitet, möchte ich trotzdem herausfinden. Da suche ich weiter, bis ichs weiß.
 
Ok, danke, Joose. Habe mir das angeguckt. Es wird ein Thread gestartet, der die Fensterkomponente erstellt. Das Programm tut dann nichts, bis du auf einen Knopf drückst. Und wie man dieses Nichtstun, ohne dass der Dienst sich beendet, hinkriegt, das interessiert mich. Bisher kriege ich Nichtstun nur für eine gewisse Zeitspanne hin und nicht bis eine boolsche Bedingung eintrifft. Also hat mir der Link leider nicht geholfen. Vielleicht habe ich ihn aber auch nur nicht richtig verstanden.
 
Habe es jetzt begriffen. Eignet sich irgendwie nicht gut für meine Zwecke. Ich glaube, was ich machen möchte, fehlt noch komplett in Java.
Wenn man eine Taste drückt, geht davon ein elektrisches Signal aus. Und ein Signal kann einen Vorgang starten. Sonst könnte man ja Windows nicht booten. Der Vorgang ist einfach eine Methode. Dann muss nicht dauerhaft ein Dienst laufen, der guckt, was gedrückt wird. Das muss man doch irgendwie verwirklichen können. Oder sind da schon die Grenzen von Java erreicht?
 
Die Klasse ist interessant. Ich habe gerade nicht die Ressourcen, mir ein JNI Buch zu kaufen, also werde ich mit Robot arbeiten. Obwohl das eigentlich nicht ganz das ist, wonach ich gesucht habe.
 
Also funktioniert java.awt.Robot nicht? Wenn er funktioniert, dann kann ich damit theoretisch sogar Passwörter knacken und das korrekte Passwort aufschreiben.
Funktioniert so: Die Farbwerte vom aktuellen Pixel von der Maus werden am Anfang ausgelesen und in einer Variablen gespeichert. Solange der aktuelle Farbwert dem Startfarbwert entspricht, werden Strings erstellt, die dann in einer Textdatei aufgeschrieben und danach eingetippt werden. Im nächsten Durchlauf wird noch am Anfang die Textdatei geleert.
 
Ich glaube das "Keylogger nur zum test" langsam nicht mehr... bin mal raus...
Ich möchte herauskriegen, wie man an ein Administratorpasswort kommt und es dann an Microsoft und Oracle schicken. Ich hoffe, dass ich dadurch viel lerne, auch in Hinsicht auf Accountsicherheit in meinem eigenen Compterspiel. Aber das glaubt einem kein Schwein, deshalb habe ich am Anfang versucht, es zu verbergen.
Nicht für das was du willst. Mit dem Robot() kannst du Tastendrücke und MouseMoves erzeugen aber keine Events zu Tastendruck bzw. Mouse-Bewegung abfangen.
Aber das dokumentieren, was der Robot eingibt, müsste doch gehen, oder? Dann könnte man das Passwort ähnlich knacken wie bei alten PINs. Wäre eine noch viel größere Lücke.
 
Aber das dokumentieren, was der Robot eingibt, müsste doch gehen, oder? Dann könnte man das Passwort ähnlich knacken wie bei alten PINs.
Keine Ahnung was du damit meinst ? Warum willst du das dokumentieren ? Du musst den Robot ja eh programmieren und ihm sagen was er tun soll, jeden Tastendruck, jede Mausbewegung. Also weisst du dann ja schon alles.
 
Ich möchte herauskriegen, wie man an ein Administratorpasswort kommt und es dann an Microsoft und Oracle schicken. Ich hoffe, dass ich dadurch viel lerne, auch in Hinsicht auf Accountsicherheit in meinem eigenen Compterspiel. Aber das glaubt einem kein Schwein, deshalb habe ich am Anfang versucht, es zu verbergen.

Und was willst du daraus lernen? An nem Keylogger gibts nicht allzu viel zu lernen...da kommst du vermutlich weiter, wenn du einfach fragst, was du wissen willst...
 
Es sollen Strings generiert werden, sodass nach und nach alle Möglichkeiten durchgegangen werden. Diese Strings tippt der Robot in die Zeile und drückt Enter. Irgendwann ist er dann ja durch. Aber damit er nicht jedes Mal neu alles durchprobieren muss, schreibt er das richtige Passwort in ein Textdokument. Das kann ich ja nicht wissen, wie dann das richtige Passwort lautet.
 
Und was willst du daraus lernen? An nem Keylogger gibts nicht allzu viel zu lernen...da kommst du vermutlich weiter, wenn du einfach fragst, was du wissen willst...
Endlich mal ein Programm, das funktioniert und einen Sinn hat, gescheit auf ein Textdokument zugreifen, mit Lesemethoden für Tastaturanschläge beziehungsweise mit dem Robot arbeiten.
 
Braucht das so lange? Ich meine, wenn es 48 Stunden braucht, wäre es immer noch eine größere Lücke und irgendwie sinnvoll, weil man ja den Vorgang abbrechen und später fortsetzen kann. Aber dann irgendwann nicht mehr.
Edit: Es gibt ja auch Heim-PCs mit i7, die müssten das doch recht schnell durchrechnen können.
 
Endlich mal ein Programm, das funktioniert und einen Sinn hat, gescheit auf ein Textdokument zugreifen, mit Lesemethoden für Tastaturanschläge beziehungsweise mit dem Robot arbeiten.

Also einen Keylogger, um lernen, wie man einen Keylogger schreibt, und der Sinn des Programms ist dann, mal einen Keylogger geschrieben zu haben 😉

Ganz ehrlich - mach mit deiner Zeit was sinnvolleres 😉 "Richtig" funktionieren wird das bei deinem jetzigem Kenntnisstand vermutlich nie.
 
Weiß eigentlich jemand ne Antwort auf Post 43?
Ja, es kann so lange dauern.
Die meisten Programme sind gegen solch primitive Angriffe geschützte, mit jedem Fehlversuch steigt die Wartezeit zum nächsten versuch.

Sei es nur, die Wartezeit steigt jeweils eine Sekunde, dann brauchst du für die ersten 100 Versuche über eine Stunde 😉
 

Zurück
Oben