Kratky uvod do lamania softwarovych ochran15.feb 2012
Uz par krat som sa snazil o prelomenie softwarovej ochrany v niektorych programoch. Urcite to poznate, nainstalujete si nieco ako free verziu, program sa vam zapaci, no po 30 dnoch odmieta fungovat. Mozno to raz pride, ale doteraz som nikdy za ziadny software neplatil (s vynimkou predinstalovaneho Win Vista ktory vsak pred prvym nabootovanim bol uz preinstalovany na W7). Clovek je tvoj zvedavy a vynaliezavy, a obcas nie je na skodu zoznamit sa s tym ako softwarove ochrany pracuju, predsalen pri navrhu nejakeho noveho komercneho softwaroveho produktu budu tieto vedomosti dolezite... Zoznamte sa prosim s programom Trackpad++. Je to alternativny driver pre Macbook Air touchpad, ktory implementuje zopar uzitocnych giest. Featury nie su zdaleka tak dobre navrhnute ako originalny driver pre OSX, ale urcite je to lepsie ako oficialny driver poskytnuty prostrednictvom BootCampu.



Tento program vsak po tyzdni od instalacie zacne vyhadzovat hlasku, aby som stiahol aktualizaciu. Taktiez ponuka moznost zrusenia tejto otravnej hlasky v pripade zaplatenia nejakej malej sumy prostrednictvom PayPalu. Tento manual bude pisany po Slovensky a predpokladam ze to teda nebude ohrozovat zisky autora, takze by sa na to nikto nemusel stazovat :) Ok, takze pozrime sa ako to cele funguje. Dole je tlacitko Register..., po kliknuti na neho, sa nam zobrazi maly text edit pre zadanie aktivacneho kluca. Ak tam zadam nejaky balast zobrazi to okienko s textom "Wrong serial number"



Za beznych okolnosti by som sa teda pozrel do instalacneho adresara a dal vyhladavat vo vsetkych enkodovaniach prave tento retazec. Zial, pocet najdenych suborov 0. Mozno sa este niekto pozastavi nad pojmom "vo vsetkych enkodovaniach", nuz tak jedna sa o to ze tento text moze byt ulozeny ako ASCII, cize jeden bajt na znak, UTF8, a kedze ten retazec neobsahuje ziadne narodne specificke znaky, tak to bude identicke s variantou ASCII, ale zase moze byt ulozeny v 16bitovom enkodovani, ktore je vyvojarmi pracujucimi pod windowsom velmi oblubene. Na vyhladavanie pouzivam program FAR. Ale co nam tato skutocnost s poctom najdenych suborov 0 naznacuje? Bud som vyhladaval retazec v zlom adresari, alebo bol tento retazec jednoducho nejako zakodovany. Ak by som retazec nejako objavil, dalsi krok by bolo spustenie disassembleru IDA a vyhladanie referencii na tento retazec, atd atd... Ked sa vsak pozriem na instalacny adresar tejto aplikacie, je tu mnozstvo EXE suborov, DLL suborov, a este aj nejake drivery. Su tu aj podozrive exe subory s nazvom do_not_run.exe, ale radsej nebudem pokusat stastie :).
Moj pohlad zaujme kniznica s nazvom ComponentFactory.Krypton.Toolkit.dll, po kratkom googleni vysvitne ze je to .NET kniznica pre GUI. Takze automaticky odhadujem ze hlavna spustacia aplikacia je naprogramovana v .NET, pouzijem nastroj Reflector a skusim otvorit hlavny spustaci subor "Trackpad++ Control Module.exe".



Razom vidime vsetky classy, aj ked ich nazvy su spracovane zjavne nejakym obfuscatorom a miesto zmysluplnych mien tu najdeme len kombinacie ASCII znakov nizkej hodnoty. Z ponuky programu Reflector vyberam Export Assembly Source Code. Dalej uz Reflector nepotrebujem, pracujem uz len so subormi ktore mi vygeneroval. Je ich dokopy 22 a dokopy to dava 221 kB. Vygenerovalo to este nejaky adresar, ale ten nas nezaujima.



Skusme sa teda zamerat na samotny fakt, ze ak spustim aplikaciu po tyzdni (resp. inom casovom intervale) od instalacie, vyhlasi sa mi nejaka chybova hlaska. Program teda musi spracovavat aktualnu hodnotu datumu. Ked dam hladat "Date" v jeho zdrojovych kodoch, odkaze ma to iba na jeden subor s velkostou 132kB. Najdeme tu pekny podozrivy kus kodu:



Na uvod testuje verziu operacneho systemu, takze asi to bude nieco co sa spusta hned na zaciatku. Nacita to 4 cisla z registrov, a vykona jednoduchy numericky test. Ak tieto styri cisla splnaju tuto podmienku, tak sa preskoci kusisko kodu a nieco sa nastavi na true. Ak nie, zacne to citat nieco zo suboru co by mala byt MD5 suma nejakeho retazca a ak mu to nesedi tak skonci. Potom je tam porovnanie a ak premenna presiahne nejaky interval tak sa zobrazi message box a aplikacia sa vypne. Ten messagebox bude podla vsetkeho zobrazovat prave informaciu o expirovani produktu. Este mala poznamka, ze vyznacena sekvencia znakov je sucastou obfuskatora, cize v aplikacii nenajdeme ziadny surovy string, vsetky su zakodovane v akomsi 13 kilobajtovom zhluku dat, dekryprovat to nebudeme, bola by to zbytocna strata casu, aj ked zdrojovy kod mame k dispozicii :) Skusme konfrontovat toto zistenie so skutocnou aktivitou aplikacie po starte pomocou Process Monitora:



No to je nam nahoda! Takze nacita to obsah styroch registrov GUID_H, GUID_B, GUID_S, GUID_C, potom to nieco robi so suborom id_nt_hw.bin, potom so suborom installer.dat. Pozornemu oku urcite neujde, ze zdrojovy kod pouzival dva krat StreamReader na nacitanie obsahu nejakeho suboru. Prvy krat to nacitava hexadecimalne cislo zo suboru, druhy krat to nacita cely riadok a porovnava to s vygenerovanou MD5 sumou (prave bcrypt.dll je provider pre MD5 algoritmus). Ked sa pozrieme na obsah id_nt_hw.bin, v mojom pripade to obsahovalo "448A1D3F\x0D\x0A", a subor installer.dat obsahovat 32 hexadecimalnych digitov. Vsetko teda korektne sedi a sme na spravnej ceste...
Ak by sme teda chceli vyradit cely usek kodu ktory sleduje ci datum presiahol nejaky interval, staci nam obsah registrov nastavit na hodnoty ktore budu splnat tieto tri podmienky:
num4 == (num3 + 0xbfac) % 0xffff 
num5 == (num3 * num4) % 0xffff 
num6 == (num3 + num5 + 0xeaba) % 0xffff
Riesime teda sustavu troch rovnic, pricom ked za num3 dosadime cislo, automaticky vieme urcit num4, num5 a num6. Trosku sklamania pre mna :) cakal som viacej roboty... Skusme teda dosadit za num3 to najjednoduchsie, teda nulu, dostaneme ze num4 = 0xbfac, num5 = 0, num6 = 0xeaba. Keby sme tieto 4 hodnoty ulozili do registrov, aplikacia by sa mala chovat ako registrovana...
Zvedavemu oku vsak neujde fakt, ze podobny kus kodu sa tam nachadza este raz. Rovnaka podmienka, akurat ze znegovana. Namiesto registrov pracuje so substringami:



Cize vstupom je retazec minimalnej dlzky 19 znakov a z neho substringom zoberieme 4 stvorice znakov oddelene lubovolnym znakom. Tieto skonvertujeme cez Convert.ToInt32 zo 16tkovej sustavy na decimalne cislo, a vykoname pre nas uz znamy test... Co myslite co to asi bude? No predsa overenie aktivacneho kluca... Ak zadany retazec vyhovuje podmienke, spusti sa nejaka pomocna aplikacia s parametrom ktory je prave zlozeny zo zadanych cisel ale este pred tym sa nam zobrazi varovne okno, ze pocitac mozno bude vyzadovat UAC konfirmaciu, cize bude vyzadovat administratorsky pristup. Spustana aplikacia je tpphelper.exe. Skusime teda vyrobit jednudochy program ktory zobrazi vo forme MessageBoxu obsah jednotlivych parametrov a tymto programom nahradme tpphelper.exe, len tak zo zvedavosti... Po zadani validneho aktivacneho kluce 0000-BFAC-0000-EABA sa objavi spominane informacne okno...



A potom umelo vytvorena aplikacia nas informuje o volanych parametroch "init 0 49068 0 60090" co predsavuje decimalnu hodnotu zadaneho kluca. Ze dokaz namiesto slubov? Nech sa paci...



Autor predstavovanej aplikacie (Trackpad++) spravil kopec tazkej roboty aby dotiahol svoj produkt tam kde je, zit s oficialnym BootCamp driverom by bolo naozaj utrpenie. Je vsak skoda, ze nezverejnil zdrojove kody jeho low level driveru. Takto by sa komunita postarala o naprogramovanie plnohodnotnej nahrady za oficialny trackpad driver. Vymto mu patri moja vdaka a budem dalej pracovat na tom aby som pochopil ako jeho driver funguje aby som podla neho mozno navrhol svoj vlastny.
Pre mna to bola dalsia skusenost s crackovanim programov ku ktorym je dostupny zdrojovy kod v citatelnej aj ked obfuscated podobe, bolo celkom zabavne sledovat ako su vyriesene bezpecnostne prvky v .NET aplikaciach a mozno aj ponaucenie pre pripadnych citatelov...