10 února, 2022

reverzní inženýrství dongle chráněný software

byl jsem mladý, internet právě začal a mohli jsme získat spoustu softwaru zdarma. Bylo to zdarma, protože někdo tam byl“ laskavý “ dost crack / oprava .exe soubor.

dal jsem mezi uvozovky“ laskavý“, protože to byl názor, který jsem měl, když jsem byl dítě. Nyní jsem softwarový inženýr a vím, kolik úsilí je zapotřebí k vytvoření softwaru. Takže prosím, nestahujte cracked software. Podpořte vývojáře a kupte si licenci!

použití takové trhliny, Oprava exe, vždycky jsem chtěl vědět, jak udělat takovou věc. Ukázalo se, že musíte porozumět assembleru, strojovému jazyku, kterému rozumí pouze váš procesor (a někteří další pitomci). Protože to bylo příliš obtížné, nikdy jsem se to nenaučil. Donedávna (asi o 20 let později).

Foto Patrick Hendry na Unsplash

před rokem jsem si koupil software (s licencí!), který potřebuje USB dongle k práci. Je opravdu těžkopádné mít s sebou tento dongle po celou dobu. Zvláště když jste na cestách. Tak jsem hledal způsoby, jak to obejít. První věc, na kterou jsem narazil, byl tento emulátor klíčů s názvem MultiKey. Vypíše paměť vašeho dongle do registru a poté emuluje váš dongle čtením z registru. To fungovalo dobře, dokud jsem ho nechtěl spustit v systému Windows 10. Zdá se, že Microsoft není tak velkým fanouškem MultiKey. Ve skutečnosti to není velký fanoušek nepodepsaných ovladačů a MultiKey používá nepodepsaný ovladač. Takže jsem potřeboval jiné řešení. Je čas se ponořit do té věci zvané assembly code!

vždycky jsem věděl, že existuje nástroj pro reverzní inženýrství, nazvaný IDA. Je schopen dekompilovat vaše .exe soubor a ukázat, co se děje. Bohužel, rozhraní je opravdu těžké pochopit. Také jsem věděl o OllyDbg. Je to debugger. Debugger vám umožní projít kód assembleru, když je program spuštěn! To znamená, že pokud byste například ladili aplikaci kalkulačky, mohli byste ji skutečně vidět při manipulaci s stisknutím tlačítka, při výpočtu a zobrazení výsledku na obrazovce. Peklo, můžete dokonce pauzeovat a měnit jeho paměť, aby se kalkulačka vrátila 5, když se ptáte, co je 2 + 2!

ale nejsem tu, abych změnil počet (i když by to bylo v pohodě). Chci se zbavit toho dongle. Tak jsem otevřel svou aplikaci s OllyDbg.

OllyDbg

to bylo opravdu ohromující. Neměl jsem tušení, co všechny tyto kódy znamenají. Natož vědět, kde začít. Tak jsem se vrátil k rýsovacímu prknu. Ukázalo se, že existuje něco, co se nazývá RetDec, dekompilátor, který se snaží vytvořit kód C ze strojového kódu. Trvalo mi nějaký čas, než jsem to nastavil a spustil dekompilaci, ale vynaložené úsilí. Výsledek byl obrovský .soubor c, více než 2 miliony řádků kódu s poločitelným kódem.

ve skutečnosti jsem mohl najít kód čtení bajtů dongle poměrně snadné:

výstup RetDec: některé názvy proměnných jsem již změnil na něco čitelnějšího.

s touto informací jsem se obrátil zpět na svůj debugger. Mezitím jsem zjistil, že OllyDbg je opravdu starý (od roku 2000) a od roku 2013 nebyl aktualizován. Tak jsem našel tento nový, vylepšený debugger, nazvaný x64dbg. Je to open source a má velkou komunitu vývojářů, kteří na něm pracují.

čtení strojového jazyka

v strojovém jazyce má každá instrukce paměťovou adresu. Takže s adresami nalezenými v kódu RetDec jsem se obrátil na x64dbg a hle, kód, který čte dongle:

Assembler kód čtení z 2 bajtů paměti dongle je.

v kódu sestavy jsou argumenty funkce načteny do paměti pomocí ESP ukazatele zásobníku. V našem kódu se to stane těsně před voláním funkce. (instrukce 3 mov naznačují, že hovor trvá 3 argumenty). Po volání se náš ukazatel zásobníku resetuje a provede se kontrola (test), pokud bylo volání funkce úspěšné. Pokud ne, vidíme, že kód dělá skok (jne). Tento skok ukazuje na kus kódu označující dongle není přítomen.

jak můžete vidět, tam volání na konkrétní funkci číst ven dongle. Vyhledal jsem referenční příručku, abych zjistil, co tato funkce dělá:

funkce čte 2 bajty paměti (slovo) z dongle. Jak se uhodlo, funkce trvá 3 argumenty, kde posledním argumentem je ukazatel na 2 bajty, který bude obsahovat některá data z dongle.

v kódu sestavy jsou argumenty načteny v opačném pořadí. Poslední argument je tento:

poslední argument ukazuje na esi, což znamená, že data z dongle budou uložena na paměťové adrese, na kterou esi ukazuje.

opravdu, když se pozastavíme těsně po uskutečnění hovoru, můžeme vidět výsledek v paměti:

0x74. To je to, co je přečteno z dongle a uloženo v paměti hlavního programu.

Chcete-li tento hovor přeskočit, stačí napsat 0x74 do paměti, na kterou ESI ukazuje. To je stejně jednoduché jako nahrazení 7 řádků výše:

jak můžete vidět, také jsem nop-ed zbytek instrukcí assembleru, včetně testu, zda byla výzva k funkci platná. To znamená, že skok nebude proveden a program bude pokračovat v práci bez kontroly.

po opravě všech hovorů zahrnujících dongle jsem uložil nový .exe. Vytáhl jsem dongle, běžel svůj zvyk .exe a k mému vlastnímu úžasu to fungovalo! Úspěšně jsem popraskal kus softwaru.

další věc, kterou jsem překročil ze svého seznamu kbelíků 😊

Ps: většina věcí byla zmatená, jako 0x74 a název aplikace. To není poškodit tvrdě pracující vývojáře, kteří vytvořili tento software v žádném případě. Také jsem měl velké štěstí, že dongle vrátil pouze bajty a neudělal žádné šifrování sám.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.