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:
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:
Ha karakterláncokat keresünk, láthatod, hogy minden érzékeny információnk látható:
Miután kijelölted a karakterláncot, megnyithatod a dekompiler nézetet és láthatod az összes vonatkozó kódot:
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:
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:
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:
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:
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:
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:
Ha megnyitjuk az új minta szoftvert IDA-ban (vagy Ghidra-ban), a titkosított karakterláncok nem láthatók:
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:
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:
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 😘
Hozzászólások