Cracking4neWBies - Lekce č.5

Zdroj: SOOM.cz [ISSN 1804-7270]
Autor: DjH
Datum: 14.8.2007
Hodnocení/Hlasovalo: 1/2

Cracking pro začátečníky... popáté :-)

Cracking4neWBies

Lekce č.5

Cracknutí našeho prvního programu



Pár slov předem: Zde uvedený návod slouží pouze pro osobní, studijní účely!!! Autor článku chce akorát demonstrovat příklad cracknutí programu. Článek v žádném případě nenabádá k nějaké nelegální činnosti!! Autor nenese zodpovědnost za zneužití článku!

Balíček pro článek je zde

Říkáte si že už je dost CMeček? Tak tedy jdeme cracknout skutečný program, který něco dělá. Crackneme si prográmek Delphi to C++Builder, který překonvertuje Delphi kód co C++ kódu. Provádí to tzv. „simply“ tzn.že se na výsledek nedá 100% spolehnout, ale na jednoduché úpravy to stačí.

Spustíme ho...oooh :-D...klikneme na register..napíšeme nějaký blábol...
Kliknem na Registrer a hle.. Invalid register :-D…

Hupnem s tím do Ollyho…hledáme stringy…a najdeme pěkný ho*no…
Šup s tím do DeDe…
Kliknem na Procedures a najdeme Unit2 (ClassName= TRegForm) a mrknem se na DisAsm výpis toho, co se skrývá pod tlačítkem Button1 (poklepem na něj…)..
A hle, otevřelo se mi podobný okýnko jak v W32Dasmu…napadlo mě že sem měl najít stringy nejdřív v W32Dasmu…no…ale co už...
Čítáme…a vidíme nějaký…fakt drsný string:-):


* Possible String Reference to: 'Thislicenseappliestoanysoftwarecont
| aininganoticeplacedbythecopyrightho
| ldersayingthatitmaybedistributedund
| erthetermsoftheQtNon-CommercialLice
| nseversion1.0.Suchsoftwareishereinr
| eferredtoastheSoftware.Thislicensec
| oversdistributionoftheSoftware,useo
| fthird-partyapplicationprogramsbase
| dontheSoftware,andnon-commercialdev
| elopmentoffreesoftware,whichusesthe
| Software.C++Builder6extendsthepower
| ofBorland'sacclaimedANSIC++rapidapp
| licationdevelopmenttoolwithawealtho
| fnewfeaturesandenhancements'


Omg..ignorujeme a čteme dál…



Narazíme na toto:

* Reference to control Edit3 : TEdit
|
00408252 8B86F4020000 mov eax, [esi+$02F4]
|
00408258 E8D7430500 call 0045C634

Procedura čtení z Edit3 (to je to kam zadáváte seriál)

……

* Possible String Reference to: 'OK,thank you for your supportŁˇ'
|
00408636 BA91BE4800 mov edx, $0048BE91
0040863B 8D45A0 lea eax, [ebp-$60]

Když to regnem Sucessfully…

……..

* Possible String Reference to: 'Invalid registerŁˇ'
|
004086DF BAE2BE4800 mov edx, $0048BEE2

…..

Když to neregnem…

Už toho víme dost… natáhneme to do znovu do Olly a dáme BP na adresy 00408252 a 004086DF


Spustíme F9
Kliknem na Register
zadáme opět nějaký blábol (‚1234‘)
a kliknem na Register

Olly se nám instinktivně zastaví na adrese 00408252

Krokujem pomocí F8…

00408271 . 8D55 E4 LEA EDX, DWORD PTR SS:[EBP-1C]
00408274 . 58 POP EAX
00408275 . E8 EECE0600 CALL d2c.00475168
0040827A . 8985 68FFFFFF MOV DWORD PTR SS:[EBP-98], EAX //nahrávání zadaného s/n do EAX
00408280 . FF4B 1C DEC DWORD PTR DS:[EBX+1C]
00408283 . 8D45 E4 LEA EAX, DWORD PTR SS:[EBP-1C]

…nějaké bláboly, nerozumim vela :-)

Krokuju dál a sleduju registry, jestli se tam neobjeví něco zajímavého
Furt vidím v EDI string „HyA“ je to provokativní, ale správné s/n to není…na to je to moc krátký string…


A tady je to:


004083E0 . 51 PUSH ECX ; /Arg1
004083E1 . E8 16EFFFFF CALL d2c.004072FC ; \d2c.004072FC
004083E6 . 59 POP ECX
004083E7 . 8D85 CCFDFFFF LEA EAX, DWORD PTR SS:[EBP-234]
004083ED . 66:C743 10 08>MOV WORD PTR DS:[EBX+10], 8 // a hle! V EAXu je správné s/n! :-)
004083F3 . 66:C743 10 5C>MOV WORD PTR DS:[EBX+10], 5C
004083F9 . 8D55 F4 LEA EDX, DWORD PTR SS:[EBP-C]

…správné s/n je „ovmfSdsilo“


0040840A . 8D55 F4 LEA EDX, DWORD PTR SS:[EBP-C]
0040840D . 66:C743 10 08>MOV WORD PTR DS:[EBX+10], 8
00408413 . 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8]
00408416 . E8 DDCB0600 CALL d2c.00474FF8 //tady zavolá proceduru která zkotroluje jestli je s/n správné
0040841B . 84C0 TEST AL, AL //otestuje
0040841D . 0F84 B6020000 JE d2c.004086D9//a jestli je tak pokračuj, jestli ne tak skoč na 4086D9
00408423 . 6A 01 PUSH 1
00408425 . BA 6DBE4800 MOV EDX, d2c.0048BE6D ; ASCII "registed"
0040842A . 8D45 CC LEA EAX, DWORD PTR SS:[EBP-34]
0040842D . E8 DAC90600 CALL d2c.00474E0C
00408432 . FF43 1C INC DWORD PTR DS:[EBX+1C]



No nic, znovu pouštím F9, zadám s/n „ovmfSdsilo“ trochu krokuju a dívám se kde a jak se to počítá…
…s/n se nejspíš přepočítává nějakým výpočtem, co si hraje se stringem „Delphi to C++Builder“ jinak nic moc nevím…potom když vstoupíte do CALLu na adrese 00408416 a potom do CALLu na adrese 00475000 uvidíte nádhernou procedurku:



0042B378 /$ 53 PUSH EBX
0042B379 |. 56 PUSH ESI
0042B37A |. 57 PUSH EDI
0042B37B |. 89C6 MOV ESI, EAX
0042B37D |. 89D7 MOV EDI, EDX
0042B37F |. 39D0 CMP EAX, EDX //Zde se porovnávají správné s/n a zadané s/n
0042B381 |. 0F84 8F000000 JE d2c.0042B416 //jestli je s/n správné, pokračuj jestli ne, okamžitě RETURNuj zpátky
0042B387 |. 85F6 TEST ESI, ESI
0042B389 |. 74 68 JE SHORT d2c.0042B3F3
0042B38B |. 85FF TEST EDI, EDI
0042B38D |. 74 6B JE SHORT d2c.0042B3FA
0042B38F |. 8B46 FC MOV EAX, DWORD PTR DS:[ESI-4]
0042B392 |. 8B57 FC MOV EDX, DWORD PTR DS:[EDI-4]
0042B395 |. 29D0 SUB EAX, EDX
0042B397 |. 77 02 JA SHORT d2c.0042B39B
0042B399 |. 01C2 ADD EDX, EAX
0042B39B |> 52 PUSH EDX
0042B39C |. C1EA 02 SHR EDX, 2
0042B39F |. 74 26 JE SHORT d2c.0042B3C7
0042B3A1 |> 8B0E /MOV ECX, DWORD PTR DS:[ESI]
0042B3A3 |. 8B1F |MOV EBX, DWORD PTR DS:[EDI]
0042B3A5 |. 39D9 |CMP ECX, EBX
0042B3A7 |. 75 58 |JNZ SHORT d2c.0042B401
0042B3A9 |. 4A |DEC EDX
0042B3AA |. 74 15 |JE SHORT d2c.0042B3C1
0042B3AC |. 8B4E 04 |MOV ECX, DWORD PTR DS:[ESI+4]
0042B3AF |. 8B5F 04 |MOV EBX, DWORD PTR DS:[EDI+4]
0042B3B2 |. 39D9 |CMP ECX, EBX
0042B3B4 |. 75 4B |JNZ SHORT d2c.0042B401
0042B3B6 |. 83C6 08 |ADD ESI, 8
0042B3B9 |. 83C7 08 |ADD EDI, 8
0042B3BC |. 4A |DEC EDX
0042B3BD |.^ 75 E2 \JNZ SHORT d2c.0042B3A1
0042B3BF |. EB 06 JMP SHORT d2c.0042B3C7
0042B3C1 |> 83C6 04 ADD ESI, 4
0042B3C4 |. 83C7 04 ADD EDI, 4
0042B3C7 |> 5A POP EDX
0042B3C8 |. 83E2 03 AND EDX, 3
0042B3CB |. 74 22 JE SHORT d2c.0042B3EF
0042B3CD |. 8B0E MOV ECX, DWORD PTR DS:[ESI]
0042B3CF |. 8B1F MOV EBX, DWORD PTR DS:[EDI]
0042B3D1 |. 38D9 CMP CL, BL
0042B3D3 |. 75 41 JNZ SHORT d2c.0042B416
0042B3D5 |. 4A DEC EDX
0042B3D6 |. 74 17 JE SHORT d2c.0042B3EF
0042B3D8 |. 38FD CMP CH, BH
0042B3DA |. 75 3A JNZ SHORT d2c.0042B416
0042B3DC |. 4A DEC EDX
0042B3DD |. 74 10 JE SHORT d2c.0042B3EF
0042B3DF |. 81E3 0000FF00 AND EBX, 0FF0000
0042B3E5 |. 81E1 0000FF00 AND ECX, 0FF0000
0042B3EB |. 39D9 CMP ECX, EBX
0042B3ED |. 75 27 JNZ SHORT d2c.0042B416
0042B3EF |> 01C0 ADD EAX, EAX
0042B3F1 |. EB 23 JMP SHORT d2c.0042B416
0042B3F3 |> 8B57 FC MOV EDX, DWORD PTR DS:[EDI-4]
0042B3F6 |. 29D0 SUB EAX, EDX
0042B3F8 |. EB 1C JMP SHORT d2c.0042B416
0042B3FA |> 8B46 FC MOV EAX, DWORD PTR DS:[ESI-4]
0042B3FD |. 29D0 SUB EAX, EDX
0042B3FF |. EB 15 JMP SHORT d2c.0042B416
0042B401 |> 5A POP EDX
0042B402 |. 38D9 CMP CL, BL
0042B404 |. 75 10 JNZ SHORT d2c.0042B416
0042B406 |. 38FD CMP CH, BH
0042B408 |. 75 0C JNZ SHORT d2c.0042B416
0042B40A |. C1E9 10 SHR ECX, 10
0042B40D |. C1EB 10 SHR EBX, 10
0042B410 |. 38D9 CMP CL, BL
0042B412 |. 75 02 JNZ SHORT d2c.0042B416
0042B414 |. 38FD CMP CH, BH
0042B416 |> 5F POP EDI
0042B417 |. 5E POP ESI
0042B418 |. 5B POP EBX
0042B419 \. C3 RETN //z5 :-)

…nějaké bláboly zase…


Takže…
s/n=
ovmfSdsilo



A teď patch…nejjednoduší to bude přes registry…tedy přes *.reg soubor…v Ollym ste si určitě všimli nápadného stringu :

00408806 . BA 30BF4800 MOV EDX, d2c.0048BF30 ; ASCII "software\\ahao's softwares\\wenku\\d2c"

No a to je ten klíč, kam se ukládá s/n…


Takže výsledný crack bude Reg.reg soubor :-D…
Bude vypadat asi takto…:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\ahao's softwares\wenku\d2c\smtp]
"registed"="1"
"sc"="ovmfSdsilo"
"installed"="1"
"times"="0"
"stime"="2.8.2007"
"ltime"="2.8.2007"
"n1"=""
"n2"="Delphi To C++Builder"
"rc"=""


Jak jsem k tomu došel? Normálně, prostě jsem dumpnul registry :-) ---ne..najel jsem do adresy :
HKEY_LOCAL_MACHINE\SOFTWARE\ahao's softwares\wenku\d2c\smtp
a tu jsem pomocí funkce Exportovat, exportoval…
Soubor spusťte a máte registrovaný program :-)

Tento článek byl taky psaný mimo tuto knížku, tak prosím omluvte zase nějaké úlety :-)… Jinak jsem ještě zjistil kde se s/n počítá…
...Na adrese 004083E1 se nachází CALL, ten trasujte, dostanete se mezi kupu instrukcí, a to je právě výpočet s/n. Nakonec na adrese 00407526 – 00407530 se nachází sled instrukcí, který zapisuje do paměti 0012E6F7. Když se na toto místo v paměti podíváme (Dumpneme v Olly) a krokujeme, vidíme jak jednotlivá písmena se generují, a nakonec uloží do ESI a pak do EAX.



A příště se mrkneme, jak takové ochrany pracují...