Futásidejű titkosított karakterláncok

Ma áttekintjük a futásidejű titkosított karakterláncok alapjait, miért kell titkosítanunk a karakterláncainkat, és megtanuljuk, hogyan hozhatjuk létre a sajátunkat.

Ebben a cikkben megérted és megtanulod:

  • Mi a futásidejű titkosítás és visszafejtés
  • Miért kell titkosítanod a karakterláncaidat
  • Láthatod, hogyan láthatja bárki az érzékeny adataidat
  • Saját egyedi titkosítás létrehozása

Mi a futásidejű titkosítás és visszafejtés

Ez a program (szoftver, alkalmazás) futása során titkosított és/vagy visszafejtett adatokra vonatkozik. Az adatok bármilyen típusúak lehetnek: memóriablokkok, hálózati forgalom, karakterláncok stb.

Az erre a célra használt leggyakoribb módszerek egyike az obfuszkáció (alapszintű). A másik (haladó) mechanizmusok a kompilált kód mutációját/virtualizációját foglalják magukban.

Ma egy XOR obfuszkáción alapuló mechanizmusra koncentrálunk.

Miért titkosítsuk a karakterláncokat?

Abban a pillanatban, amikor elindítod a szoftveredet, minden látható a memóriában. Ez a végfelhasználóidra is vonatkozik, ami azt jelenti, hogy mindent láthatnak.

Az első dolgok egyike, amit egy támadó tesz, az a karakterláncok keresése a szoftverben. Ez lehetővé teszi számára, hogy minimális erőfeszítéssel mindent megértsen a szoftverről.

Ha érzékeny adatokat (például jelszavakat vagy licenceket) tárolsz, kulcsfontosságú, hogy ne tartsd őket sima szövegként. A sima szöveg megkönnyíti a támadó dolgát.

Számos módszer létezik a szoftvered elemzésére. A legismertebb és leggyakoribb módszerek a statikus és a futásidejű elemzés.

Nézzünk egy egyszerű példát egy konzolalkalmazás segítségével:

Sample non-encrypted 1

Ezt Release módban fordítjuk (a debug információk elkerülése érdekében). Folytassuk és teszteljük a statikus és futásidejű elemzést.

Statikus elemzés teszt

A statikus elemzés során a szoftvernek nem kell futnia. Ennek megfelelően nyissuk meg a mintát a Ghidra programban.

Az alábbi képernyőképen láthatod, hogy a minta debug információk nélkül lett kompilálva:

Sample non-encrypted 1-1

Ha karakterláncokat keresünk, láthatod, hogy minden érzékeny információnk látható:

Sample non-encrypted 1-2

Miután kijelölted a karakterláncot, megnyithatod a dekompiler nézetet és láthatod az összes vonatkozó kódot:

Sample non-encrypted 1-3

Elég szomorú, ugye? 😕 Képzeld el, hogy hónapokig dolgoztál a csodálatos szoftvereden, és készen állsz az értékesítésre.

Azt hiszem, a többi magától értetődő, de biztos vagyok benne, hogy érted a lényeget.

Ami még szomorúbb, az az, hogy ez olyan egyszerű, hogy még egy 12 éves is meg tudja csinálni. (és néhányan valóban meg is csinálják)

Futásidejű elemzés teszt

A futásidejű elemzés során a szoftvernek futnia kell (végrehajtódnia). Ez azt jelenti, hogy szoftvert kell használnunk a folyamat megnyitásához és olvasásához (általában egy debuggert).

Azonban ehhez a célhoz valójában nincs szükség debuggerre. Egyszerűen letölthetünk egy ingyenes eszközt, mint a Process Hacker , és megnyithatjuk a folyamatot:

Sample non-encrypted 2

Ez elég egyszerű volt, ugye? És ne feledd, hogy még debuggert sem csatoltunk. Egy ügyes és eltökélt személy debuggert fog használni.

Amikor debuggert csatolsz, sokkal többet látsz, de ez a vita egy másik napra tartozik.

Futásidejű titkosított karakterláncok létrehozása

Számos módja van ennek elérésére:

  • Harmadik féltől származó szoftver használata, mint a VMProtect , Themida .
  • Fordításidejű karakterlánc-titkosítás, mint az xorstr .
  • Egyedi módszerek használata

Az első 2 lehetőség nem biztos, hogy megfelel az igényeidnek. Mindegyiknek sok előnye és hátránya van, amelyeket ezen a ponton nem tárgyalunk.

Egy dolgot meg kell értened: a népszerűség kockázatot jelent. Amikor a Google-on véletlenszerűen talált dolgokat használsz, valaki már tud róluk.

A legtöbb ember kifejlesztett egy eszközt a te eszközöd ellen. Így mennek a dolgok. Kihívásként teszik, vagy azért, hogy ellopják a munkádat, de megteszik.

Ezt szem előtt tartva, egyedivé kell válnod. Létrehozhatod a saját karakterlánc-titkosításodat az alap szinttől a haladó szintig.

A terv

  • Könnyen használható megoldás létrehozása
  • Karakterláncok mindig titkosítva tartása
  • Visszafejtés csak szükség esetén
  • Karakterláncok véletlenszerű helyre helyezése (opcionális - nem tárgyalt)
  • Karakterláncok megsemmisítése használat után (opcionális - nem tárgyalt)

A megoldás

Kezdjük a karakterláncaink egyenkénti tömbként való definiálásával:

Step 1

A tömb korlátlan számú karakterláncot tartalmazhat 256-os hosszúsági korláttal.

Tudom, hogy ez ijesztő feladat, különösen ha a karakterláncaid hosszúak. Ez csak demonstrációs célú, és később egy praktikusabb megoldást fogunk létrehozni.

Az ötlet az, hogy a karakterlánc minden egyes karakterét titkosítjuk. Ehhez egyszerű XOR titkosítást fogok használni.

Alább láthatsz egy példát arra, hogyan működne ez:

Step 2

A fentiben semmi bonyolult nincs, egyszerű és könnyed, mégis elég hatékony. Használhatod egy konzolalkalmazáson belül.

A fordítás és futtatás után az eredmény az emberi szem számára olvashatatlan bájtok:

Step 3

Tessék, a saját kis szoftvered futásidejű titkosított karakterláncok létrehozásához. 😏

Az eredmény

Ideje a megoldásunkat a gyakorlatba ültetni. Hozzunk létre egy másik mintát erre a célra és adjuk hozzá a kódunkat:

Step 4

Figyelj meg 2 fontos dolgot:

  • Szándékosan hagytam néhány karakterláncot sima szövegben, hogy lásd a különbséget
  • A visszafejtő függvénynek szüksége van a hosszra (erről később)

A fentieket Release módban fordítjuk és futtatjuk. Az új minta normálisan működik:

Step 5

Ha megnyitjuk az új minta szoftvert IDA-ban (vagy Ghidra-ban), a titkosított karakterláncok nem láthatók:

Step 6

Említettem, hogy ebben a mintában szándékosan hagytam néhány karakterláncot sima szövegben. Az ok az, hogy követhetjük őket a kód megtekintéséhez:

Step 7

Le kellett görgetnem, hogy elérjem a szöveget a fenti képen. Láthatod, mennyire különbözik a kompilált kód.

Megoldottuk a statikus elemzés problémáját, térjünk át a futásidejűre.

Nyissuk meg a Process Hacker-ben:

Step 8

Voila! A futásidejű elemzés problémáját is megoldottuk 😎

Több a titkosított karakterláncokról

A fenti példa nem túl praktikus. Minden karakterlánc manuális definiálása fárasztó feladat, csakúgy, mint a karakterlánc hosszának minden egyes alkalommal történő megadása.

Ideális esetben a következőkre lenne szükségünk:

  • Szöveges fájl olvasása a karakterláncokhoz
  • Az eredményül kapott karakterláncok szöveges fájlba írása
  • Escape szekvenciák hozzáadása a karakterláncokhoz a hossz minden egyes alkalommal történő megadásának elkerüléséhez.
  • Összetettebb XOR vagy más módszer hozzáadása (opcionális)
  • Karakterláncok véletlenszerű helyekre helyezése (opcionális)

Készítettem egy szép megoldást a kísérletezéshez. Mindent tesztelhetsz, amit ebben a cikkben írtam, és saját, használatra kész eszközöd is lehet a futásidejű titkosított karakterláncok létrehozásához.

4 projektet tartalmaz:

  • RuntimeStringEcryptor amely szöveges fájlból olvas karakterláncokat, titkosítja őket, majd egy másik szöveges fájlba írja őket.
  • Sample az egyszerű konzol, amelyet az IDA-val való demonstrációhoz használunk.
  • SampleEncryptedStrings az egyszerű konzol titkosított karakterláncokkal az IDA-val való demonstrációhoz.
  • SimpleRuntimeStringEncryption a kezdeti játszótér, ahol tesztelheted ezt a módszert.

Megjegyzések:

  • Ha nem adsz hozzá escape szekvenciát, a visszafejtés nem fogja tudni, mikor kell “megállnia”. Az eredmény értelmetlen/null adatok lesznek, amíg el nem éri a definiált tömbméretet.
  • Győződj meg róla, hogy megváltoztatod a példámban használt XOR kulcsokat.
  • Kerüld ugyanazoknak a szavaknak a többszöri használatát. Ugyanazokat a bájtokat generálják, és fennáll a felismerés veszélye.

Letöltés

A használatra kész megoldás letöltéséhez kérlek, fontold meg ennek a blognak a támogatását 😘

Become a Patron