NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Keylogger a com port

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Sperhak
Člen
Avatar
Sperhak:31.1.2018 7:02

Som začiatočník ale poreboval by som sa predbehnúť vo vedomostiach a spraviť jeden projekt.
Mal som zle založené vlákno v inej kategórii tak mi niečo už poradili.No teraz poslednú radu som dostal že potrebujem nato čo chcem GUI a s tím ešte nemám žiadne skúsenosti. Chel by som aby program čakal na pozadí na stlačenie klávesy a po jej stlačení sa pošle príkaz na com port. Zatial sa mi podarilo to že po zadaní a potvrdení do konzoli sa pošle na port a potom sa spustí keylogger.

package balik;

import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Scanner;

public class Console {

    /**
     * Serial version UID
     */
    private static final long serialVersionUID = 6206875506469171849L;

    /**
     * Seial port
     */
    SerialPort serialPort;
    private OutputStream serialOut;

    /**
     * Constructor Build all interface elements
     */
    public Console() {

        Scanner sc = new Scanner(System.in, "Windows-1250");
        float a = Float.parseFloat(sc.nextLine());
        float b = 79;

        if (a == b) {

            try {
                serialOut.write("L1".getBytes());
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }

    public void begin() throws Exception {

        // Open port
        CommPortIdentifier port = CommPortIdentifier.getPortIdentifier("COM8");
        CommPort commPort = port.open(this.getClass().getName(), 2000);
        serialPort = (SerialPort) commPort;
        serialPort.setSerialPortParams(115200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
        serialOut = serialPort.getOutputStream();
        serialPort.notifyOnDataAvailable(true);

    }

}
package balik;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Properties;
import java.util.logging.FileHandler;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;

/**
 * Logs keystrokes in a log file.
 *
 * @author Samir Joglekar
 */
public class KeyLogger implements NativeKeyListener {

    String configFilePath = null;
    Logger logger = null;
    FileHandler fileHandler = null;
    SimpleFormatter simpleFormatter = null;
    InputStream inputStream = null;
    Properties properties = null;
    Path currentRelativePath = null;

    public KeyLogger() throws IOException {
        logger = Logger.getLogger("Key Log");
        currentRelativePath = Paths.get("");
        inputStream = new FileInputStream("Config.properties");
        properties = new Properties();
        properties.load(inputStream);
        configFilePath = properties.getProperty("FilePath");
        fileHandler = new FileHandler(configFilePath);
        logger.addHandler(fileHandler);
        simpleFormatter = new SimpleFormatter();
        fileHandler.setFormatter(simpleFormatter);


    }

    /**
     * Overridden method to capture the pressed keys.
     */
    @Override
    public void nativeKeyPressed(NativeKeyEvent nativeKeyEvent) {
        logger.info("Key pressed: " + NativeKeyEvent.getKeyText(nativeKeyEvent.getKeyCode()));
    }

    /**
     * Overridden method to capture released keys.
     */
    @Override
    public void nativeKeyReleased(NativeKeyEvent nativeKeyEvent) {
    }

    /**
     * Overridden method to capture the typed keys.
     */
    @Override
    public void nativeKeyTyped(NativeKeyEvent nativeKeyEvent) {
    }

}
import gnu.io.CommPortIdentifier;
import java.util.Enumeration;
import balik.Console;
import balik.KeyLogger;
import java.io.IOException;
import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;

/**
 * Stand alone starter
 *
 * @author Diego Cueva
 *
 */
public class Final {

    public static void main(String arg[]) throws IOException, NativeHookException, Exception {

        @SuppressWarnings("unchecked")
        Enumeration<CommPortIdentifier> ports = CommPortIdentifier.getPortIdentifiers();
        while (ports.hasMoreElements()) {
            CommPortIdentifier port = ports.nextElement();

        }

        Console console = new Console();

        console.begin();
        GlobalScreen.registerNativeHook();
        GlobalScreen.addNativeKeyListener(new KeyLogger());
    }

}
 
Odpovědět
31.1.2018 7:02
Avatar
Robert Michalovič:1.2.2018 7:06

No jak vidím, tak jsi přidal do projektu framework řešící nativní listener na konzolu.
Máš ho správně zaregistrován.

GlobalScreen.registerNativeHook();
GlobalScreen.addNativeKeyListener(new KeyLogger());

A zde v těchto metodách si naprogramuješ co vlastně chceš udělat po stisku každé klávesy.

public void nativeKeyReleased(NativeKeyEvent e) {
        System.out.println("Klavesa uvolnena: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
}
@SuppressWarnings("static-access")
public void nativeKeyTyped(NativeKeyEvent e) {
        System.out.println("Klavesa stiskla: " + e.getKeyText(e.getKeyCode()));
}

Vše funguje v pořádku. Jen si ověř, že OS který používáš je podporován v daném frameworku.

 
Nahoru Odpovědět
1.2.2018 7:06
Avatar
Sperhak
Člen
Avatar
Odpovídá na Robert Michalovič
Sperhak:3.2.2018 12:23

No hej len dalej neviem ako tam pridám ten if aby mi po stlačení klávesy num 1 ktorú ten listener vypíše ako Key 0X4F pressed. poslal príkaz na serial port.

ja som to dal takto ale je to zrejme zle

Scanner sc = new Scanner(System.in, "Windows-1250");
float a = Float.parseFlo­at(sc.nextLine());
float b = 79;

if (a == b) {

try {
serialOut.wri­te("L1".getBy­tes());
} catch (IOException e1) {
e1.printStackTra­ce();
}
}
}

 
Nahoru Odpovědět
3.2.2018 12:23
Avatar
Sperhak
Člen
Avatar
Sperhak:3.2.2018 19:49

Tak som zase pokročil.Program som dosť skrátil a keď stlačím hocijakú klávesu pošle sa príkaz na serial port.Potreboval by som však aby to fungovalo len na numpad1. Viete mi s tím pomôcť.

import gnu.io.CommPortIdentifier;
import java.util.Enumeration;
import balik.KeyLogger;
import java.io.IOException;
import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;

public class Final {

    public static void main(String arg[]) throws IOException, NativeHookException, Exception {

        @SuppressWarnings("unchecked")
        Enumeration<CommPortIdentifier> ports = CommPortIdentifier.getPortIdentifiers();
        while (ports.hasMoreElements()) {
            CommPortIdentifier port = ports.nextElement();

        }

        GlobalScreen.registerNativeHook();
        GlobalScreen.addNativeKeyListener(new KeyLogger());
    }
}
package balik;

import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Path;
import java.util.Properties;
import java.util.logging.FileHandler;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;

public class KeyLogger implements NativeKeyListener {

    private static final long serialVersionUID = 6206875506469171849L;
    SerialPort serialPort;
    private OutputStream serialOut;
    String configFilePath = null;
    Logger logger = null;
    FileHandler fileHandler = null;
    SimpleFormatter simpleFormatter = null;
    InputStream inputStream = null;
    Properties properties = null;
    Path currentRelativePath = null;

    public KeyLogger() throws Exception {

        CommPortIdentifier port = CommPortIdentifier.getPortIdentifier("COM4");
        CommPort commPort = port.open(this.getClass().getName(), 2000);
        serialPort = (SerialPort) commPort;
        serialPort.setSerialPortParams(115200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
        serialOut = serialPort.getOutputStream();
        serialPort.notifyOnDataAvailable(true);

    }

    @Override
    public void nativeKeyPressed(NativeKeyEvent nativeKeyEvent) {

        try {
            serialOut.write("L1".getBytes());
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }

    @Override
    public void nativeKeyReleased(NativeKeyEvent nativeKeyEvent) {
    }

    @Override
    public void nativeKeyTyped(NativeKeyEvent nativeKeyEvent) {
    }

}
 
Nahoru Odpovědět
3.2.2018 19:49
Avatar
Robert Michalovič:4.2.2018 6:37

Takže klavesové zkratky jsou zde zde

No a zdrojak si uprav takto + Zohledni si to pro všechy čísla 0 .. 9.

public void nativeKeyPressed(NativeKeyEvent nativeKeyEvent) {
        switch(e.getKeyCode()){
                case NativeKeyEvent.VC_0: {
                        //System.out.println("Vypis 0");
                        try {
                                serialOut.write("0".getBytes());
                        } catch (IOException e1) {
                        System.err.println("Chyba pri zapisu na serial port "+e1)
                        }
                        break;  }
                case NativeKeyEvent.VC_1: {
                        //System.out.println("Vypis 1");
                        try {
                                serialOut.write("1".getBytes());
                        } catch (IOException e1) {
                        System.err.println("Chyba pri zapisu na serial port "+e1)
                        }
                        break;  }
                }
    }

nebo použij toto řešení, v tvem pripade bych tipl ze to vyjde na stejno.

public void nativeKeyPressed(NativeKeyEvent nativeKeyEvent) {
        try {
                switch(e.getKeyCode()){
                        case NativeKeyEvent.VC_0: {
                                //System.out.println("Vypis 0");
                                serialOut.write("0".getBytes());
                                break;  }
                        case NativeKeyEvent.VC_1: {
                                //System.out.println("Vypis 1");
                                serialOut.write("1".getBytes());
                                break;  }
                        }
        } catch (IOException e1) {
                System.err.println("Chyba pri zapisu na serial port "+e1)
        }

}

Samozřejmě vyjimku si pokryj podle toho jak ty potřebuješ a tak aby to zohlednovalo koncepci tvého návrhu.

 
Nahoru Odpovědět
4.2.2018 6:37
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.