Jump to content
Reborn fórum

Reverzni inzenyrstvi


k3dT

Recommended Posts

Predstavuju si to tak, ze bych naprogramoval nejakou jednoduchou aplikaci kam by se zadavalo jmeno a heslo a nasim ukolem by bylo prijit na algoritmus vypoctu (bez zdrojaku samozrejme - jen z exe). Vsechno pekne krok za krokem pro uplny nooby. Pokud by zajem pretrval, mohli by jsme se pustit i do slozitejsich veci (packery, cryptory, komercni aplikace, jen krome RO klienta /heh )...

Link to comment
Share on other sites

Ok tak se pokusim neco sepsat. Trosku teorie na zacatek...Nejdulezitejsi instrukce assambleru co jsou pro crackera potreba:

 

Assembler pro Crackery 1.0 by [sK!dT, upravil k3dT]

==============================================

 

* REGISTRY *

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

Registry jsou zakladni definici mist v kterych jsou uchovana data, nas budou zajimat pouze tyto:

[E]AX,[E]BX,[E]CX,[E]DX

 

[E] je jen oznaceni pro 32 bitove registry. (EAX, EBX...).

 

Existuji takke pary registru:

DS:SI ; Mohou byt pouzity jako zdroj pro retezcove operace

ES:DI ; Mohou byt pouzity jako cil pro retezcove oprace

 

* FLAGY *

---------

Flagy jsou skoro to same jako registry, ale s tim rozdilem, ze mohou byt jen "true", nebo "false" a

obsahuji bud "1" (true), nebo "0" (false) jsou nastavovany instrukcemi jako CMP a jsou pouzivany pri

odskoku, nebo pri volani:

CMP AX,BX ; Porovnava AX s BX, jsou-li stejne nastavi se flag 0 na 1

JZ 00124531 ; Kdyz je nastaven flag 0, tak se provede skok na 001254531

 

* CALL *

--------

Pouziti: CALL adresa

Popis : Vyvola funkci na adrese

Priklad: CALL 10284312

 

Po ukonceni volane funkce (RET) se vraci na misto odkud bylo volano a program pokracuje dal

 

* CMP *

-------

Pouziti: CMP umistneni,hodnota

Popis : Porovnava umistneni s hodnotou a podle vysledku nastavuje flag 0 (nevyhovyje), nebo 1 (OK)

Priklad: CMP AX,03h

 

Toto je nejdulezitejsi instrukce, pri niz se porovnava zadane cislo s generovanym cislem

 

* JMP *

-------

Pouziti: JMP adresa

Popis : Je shodna s prikazem GOTO, skoci na adresu s kodem

Priklad: JMP 00402011

 

Dalsi varianty teto instrukce mohou vypadat takhle:

JZ - Skok je li nastaven flag 0 (Stejne jako instrukce JE)

JNZ - Skok neni-li nstaven flag 0 (Stejne jako instrukce JNE)

 

Tato instrukce se pouziva velmi casto ve spojeni s instrukci CMP, napriklad:

CMP seriove,zadane ; Porovnava seriove cislo, s cislem zadanym

JNE pryc ; Pokud to nevyhovuje, nasleduje skok pryc

 

* MOV *

-------

Pouziti: MOV umistneni,hodnota

Popis : Kopiruje byte nebo word hodnotu z hodnoty do umistneni

Priklad: MOV AX,DX

 

Pokud pri trasovani narazite na tuto instrukci, pripomente si ze je shodna s C+ (umisteni:=hodnota)

 

* RET *

-------

Pouziti: RET

Popis : Navrat z funkce

Priklad: RET

 

Tato instrukce slouzi pro navrat z funkce na adresu, odkud jsme volay tuto funkci

 

* NOP *

-------

Pouziti: NOP

Popis : Prazdny prikaz

Priklad: NOP

 

Tato instrukce nedela nic. Pouze vyplnuje prazdne misto v pameti. Nam se vsak bude hodit nejvic ze vsech :)

 

 

dal jsou potreba aritmeticky a logicky opetatory jako napr. ADD MUL, DIV, AND, OR, SHR, SHL, NOT...

 

 

Instrukce se neucte, staci si je jen procist. Ted si stahnete OllyDBG - zrejme nejlepsi debugger (freeware) z http://ollydbg.de/odbg110.zip. Stahnete si target (http://server.reborn.cz/CLINE95.exe - shareware program, ale v originalnim archivu chybi licenci ujednani, tak si budeme se souborem delat co chceme). Rozbalte oba archivy a spustte OllyDBG. Spustte si program a omrknete system registrace programu. Klasicke tlacitko register, 2x editbox pro jmeno/reg. cislo. To nebude nic tezkyho. Stisknete F3 (otevrit soubor) a vyberte target (CLINE95.EXE).

 

Vyvolejte kontext menu podle obrazku - http://server.reborn.cz/1.jpg a zvolte "All referenced text strings". To vam zobrazi seznam vsech retezcu co aplikace obsahuje... Prohlidnete si seznam, a urcite vas zaujme radek "Thank you for registering Command Line95!". Kliknete na nej 2x a jsme tu: http://server.reborn.cz/2.jpg

 

Blok A ziskava z aplikace zadane registracni jmeno a ulozi ho na adresu 402461. Viz tento radek:

00402461 |. 68 E0934000 PUSH CLINE95.004093E0 ; |Buffer = CLINE95.004093E0

 

Blok B ziskava z aplikace zadane seriove cislo avsak ne jako retezec ale jako ciselnou konstantu. Vysledek se ulozi do registru EAX ( viz popis API funkce GetDlgItemInt napriklad v MSDN).

 

 

Blok C je samotny vypocet registracniho cisla.

 

Blok D je porovnani zadaneho serioveho cisla se spravnym (to uz predbiham).

 

Ted si nastavime Breakpoint (To je jakasi "zarazka". Az program k mistu kde je nastaven dojde, pozastavi se). Oznacte mysi radek 0040245B a stiknete F2. Adresa zcervena. Viz screenshot. Ted spustime program klavesou F9. JAk se program pusti, stiskneme tlacitko REGISTER a objevi se pole pro zadani jmena a registracniho kodu. Do poli napiseme napr "k3dt" a cislo "123456" a klikneme na OK. V tom momente se vykonavani programu pozastavi (= program se zastavil na beakpointu). Prepneme proto do okna OllyDBG.

 

 

Ted budeme program krokovat (tzn vykonavat jednotlive instrukce poporade). To se dela klavesou F8. Krokujeme tedy az dojdeme k adrese 00402487. Vsimneme si cervene hodnoty u registru EAX (okno Registers FPU). Klikneme 2x na to cislo. V poli "signed" vidite seriove cislo co jsme zadali :) Stiskneme Cancel a krokujeme dal.

 

Dalsi instrukce

MOV DWORD PTR DS:[4092CC],EAX

 

uklada zadane seriove cislo do pameti pro pozdejsi porovnani.

 

Instrukce

00402493 |. 2BC0 SUB EAX,EAX

00402495 |. F2:AE REPNE SCAS BYTE PTR ES:[EDI]

00402497 |. F7D1 NOT ECX

00402499 |. 49 DEC ECX

 

Pocitaji delku zadaneho jmena Vysledek je v ECX.

 

Instrukce

0040249A |. 0FBE05 E09340>MOVSX EAX,BYTE PTR DS:[4093E0]

 

prenese ascii hodnotu prvniho znaku ve jmene do EAX.

 

Instrukce

004024A1 |. 0FAFC8 IMUL ECX,EAX

Vynasobi registry ECX (delka jmena) a EAX (ascii hodnota 1. znaku jmena) mezi sebou a vysledek se ulozi do ECX.

 

Instrukce

004024A4 |. C1E1 0A SHL ECX,0A

Provede Shift Left (logicke posunuti doleva) o 0x0A a vysledek ulozi do ECX.

 

Instrukce

004024A7 |. 81C1 CCF80200 ADD ECX,2F8CC

Pricte k hodnote v ECX cislo 194764 (2F8CC v hex) a vysledek se opet ulozi do ECX.

 

 

Krokujeme az k

 

004024B3 |. 3BCA CMP ECX,EDX

 

coz je porovnani dvou cisel. V ECX mame vypocitane seriove cislo a v EDX nase zadane cislo (v hex samozrejme). Pokud se cisla rovnaji, tak instrukce

 

004024B5 |. /74 2F JE SHORT CLINE95.004024E6

 

(jump if equal = skoc kdyz se rovnaji) skoci na adresu 004024E6 coz je

 

004024E6 |> \6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL

004024E8 |. 68 7C824000 PUSH CLINE95.0040827C ; |Title = "REGISTRATION CODE ACCEPTED"

004024ED |. 68 50824000 PUSH CLINE95.00408250 ; |Text = "Thank you for registering Command Line95!"

004024F2 |. 56 PUSH ESI ; |hOwner = 002D04AE ('Command Line95 Registration',class='#32770',parent=00B90450)

004024F3 |. FF15 C4B24000 CALL NEAR DWORD PTR DS:[; \MessageBoxA

 

Co je prave to co potrebujeme ;) zapamatujeme si proto cislo v ECX (pro jmeno k3dt je to 633036) a restartujeme program pomoci CTRL+F2. Opet stiskneme tlacitko REGISTER ale ted misto fake serialu zadame cislo co bylo v ECX. Stiskneme OK a opet se nam zastavi program na breakpointu. Ted ale nebudeme krokovat a proto pustime aplikaci dal pres F9. Objevi se okno "Thank you for registering Command Line95!" a mame zaregistrovano ;)) Jeste pro kontrolu stiskneme tlacitko INFO, a opravdu vidime ze je program registrovany.

 

Hotovo. Pokud to pochopi alespon jedna chytra hlava, budu rad :) dotazy sem.

Link to comment
Share on other sites

Trosku postradam smysl vyuziti takovych znalosti...

 

Edit: budeme snad napomahat procentuelnimu mnozstvi piratskych kopii u nas?

17373[/snapback]

 

Vyuziti? Beta tester u firmy co vyviji software. Musim priznat ze mi to vynasi celkem dost. Nejde o to delat cracky / keygeny ale o pochopeni jak aplikace pracujou a neco se priucit.

Link to comment
Share on other sites

Trosku postradam smysl vyuziti takovych znalosti...

 

Edit: budeme snad napomahat procentuelnimu mnozstvi piratskych kopii u nas?

17373[/snapback]

nevim jak ses starej a jak do ty problematiky vidis, ale crackovani a piratstvi bylo, je a bude uplne neco odlisneho. pirati jen chudacci, kteri bud nemaji prachy, nebo je (a to spis) mit nechteji. crackovani je stary uz dlouho a cracky se delaly jen pro lidi z grup kteri se drzeli hesla ze warez neni na obzivu a kopie sirili jen mezi sebou a bez zisku

Link to comment
Share on other sites

ad. assembler - kdysi jsem mel (mozna je jeste funkcni) Didaktika Gamu. V te dobe urcite naslaply to stroj (2Mhz, 2x 40kB RAM). Mel jsem to stesti, ze jsem k nemu mel i dve 5.25'' mechaniky (ale taky jsem si uzil nahravani z magnetofonu). Nicmene, kdyz me omrzely hry tak jsem zkousel programovat v Basicu. Kdyz me to omrzeli Basic nekde jsem si schrastil tutorial na Assembler. Hrozne me v te dobe fascinovali 'soundtracky' od Frantiska Fuky, tak jsem zacal delat podobne blbosti. Takze registru a zasobniku jsem si uzil dost a dost. Nejlepsi bylo, kdyz clovek zjistil ze diky assembleru je schopny generovat ruzne tony a pul tony a ne jako Basic ktery znal jen CDEFGAHI ve trech oktavach nahoru a dvou dolu.

 

Takze Assembler rulezzz.

Link to comment
Share on other sites

Ne nic ve zlym. Jen jsem zvedav jake to bude mit ohlasy...

17383[/snapback]

 

Ja osobne se rad neco priucim, oproti nekterym 14-ti letym detem jsem sto roku za opicema o:). Tedy az se na to vyspim, abych vubec pochopil o co jde :hypocrite:

Link to comment
Share on other sites

nevim jak ses starej a jak do ty problematiky vidis, ale crackovani a piratstvi bylo, je a bude uplne neco odlisneho. pirati jen chudacci, kteri bud nemaji prachy, nebo je (a to spis) mit nechteji. crackovani je stary uz dlouho a cracky se delaly jen pro lidi z grup kteri se drzeli hesla ze warez neni na obzivu a kopie sirili jen mezi sebou a bez zisku

17385[/snapback]

 

No... stredni skolu uz mam par let za sebou. A co programovani se tyce tak mam za sebou par programovacich jazyku od Basicu pres Delphi a ted uz par let tvrdnu nad PHP a MySQL. Vish ono resit tady problematiku ne/legalniho softu by bylo na dlouho. Kazdy na to mame svuj nazor, ale od te doby co jsem si zridil firmu si nedovolim na komp nainstalovat cokoli cerneho. A diky tomu je muj nazor na tuto problematiku trosku tvrdsi. Takze as tak...

 

Edit: zazil jsem to u kopirovani mag. kazet na Didaktika, tehda se v novinach normalne otiskovaly inzeraty typu 'nahraji kazety pro Didaktika, 300 kazet, velky vyber od her az po programy....'

Link to comment
Share on other sites

Edit: zazil jsem to u kopirovani mag. kazet na Didaktika, tehda se v novinach normalne otiskovaly inzeraty typu 'nahraji kazety pro Didaktika, 300 kazet, velky vyber od her az po programy....'

17388[/snapback]

 

To si asi dlho necital noviny kde su inzeraty priamo na kopie DVD alebo CD verzie od filmov cez hudbu a programy az po hry. Ja osobne si kupim len hru ktora za to stoji.

Link to comment
Share on other sites

Moc pekny kenny, pochopil jsem to i ja :)

Jen jestli se muzu zeptat co dela

 

REPNE SCAS BYTE PTR ES:[EDI]

 

:hypocrite:

 

Edit:

Jeste jsem si vsiml radku 004024B7

 

CMP EDX, 361DECA

JE SHORT CLINE95.004024E6

 

Pokud EDX je nase zadane cislo a porovnavame ho s danym cislem pricemz skok je na blok uspesne registrace tak se asi jedna o univerzalni klic, nebo se pletu? :)

(v assembleru moc zkusenosti nemam)

Link to comment
Share on other sites

 

Tady je napoveda k instrukcim: http://server.reborn.cz/Asm.hlp

 

Instrukce

00402495  |.  F2:AE      REPNE SCAS BYTE PTR ES:[EDI]

00402497  |.  F7D1          NOT ECX

00402499  |.  49            DEC ECX

Pocitaji pocet znaku v retezci na ktery ukazuje pointer z EDI. Pred tim nez se vykona, tak mame v EDI ukazatel na zadane jmeno (viz screenshot). Z napovedy instruci vis, ze REPNE znamena opakuj dokud se nerovna. SCAS ES- Scan String = prohledej retezec. Dal v popisu REPNE mas, ze CX [ECX] se snizuje pokazdy uspesny operaci. Pred provedenim instrukce mame v ECX -1 (0xFFFFFFFF) minus (delka jmena + ukoncovaci 0x00). Proto po vykonani intrukce bude v ECX -6 (0xFFFFFFFA) coz se zneguje (v ECX mame 5) a odecte se jednicka pomoci DEC ECX. Takhle "jednoduse" prekladace prekladaj funkci strlen :hypocrite: Staci si zapamatovat posloupnost techto instrukci a vzdycky kdyz je uvidis budes vedet ze to pocita velikost retezce.

 

 

CMP EDX, 361DECA

JE SHORT CLINE95.004024E6

 

Sikovnej :) Presne jak rikas /no1 Cislo 0x361DECA (to je 56745674 desitkove) je univerzalni seriovy cislo fungujici s jakymkoliv jmenem.

 

 

Jinak registrace se uklada do /Windows do souboru CLine95.ini tak pokud chcete program odregistrovat, staci tenhle soubor smazat.

Link to comment
Share on other sites

Pocitaji pocet znaku v retezci na ktery ukazuje pointer z EDI. Pred tim nez se vykona, tak mame v EDI ukazatel na zadane jmeno (viz screenshot). Z napovedy instruci vis, ze REPNE znamena opakuj dokud se nerovna. SCAS ES- Scan String = prohledej retezec. Dal v popisu REPNE mas, ze CX [ECX] se snizuje pokazdy uspesny operaci. Pred provedenim instrukce mame v ECX -1 (0xFFFFFFFF) minus (delka jmena + ukoncovaci 0x00). Proto po vykonani intrukce bude v ECX -6 (0xFFFFFFFA) coz se zneguje (v ECX mame 5) a odecte se jednicka pomoci DEC ECX. Takhle "jednoduse" prekladace prekladaj funkci strlen :hypocrite: Staci si zapamatovat posloupnost techto instrukci a vzdycky kdyz je uvidis budes vedet ze to pocita velikost retezce.

17470[/snapback]

 

Hmm, to je chytry, dik za vysvetlneni /thx

Link to comment
Share on other sites

Super thread, dufam ze budu aj dalsie lekcie, pracoval som v assembleri pod DOSom zopar rokov na celkom slusnej urovni trufam si povedat, a rad sa naucim triky vo win asm od profika, clovek nikdy nevie kedy sa mu to moze hodit :clap:

Link to comment
Share on other sites

  • 2 months later...

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...