Cracking4neWBies - Lekce č.10

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

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

Cracking4neWBies

Lekce č.10

Keygenning…



Balík je zde

Než jsem došel alespoň na úplné základy keygenningu, dalo mě to moc a moc práce. Velou pauzu mezi lekcí 9 a touto, zapříčinil i začátek nového školního roku, kde se na nás usmívají naše milé paní učitelky, s ještě hodnějšími pány učitely. Promiňte mi hrubky jestli nějaké jsou… Ale nebudeme odbočovat…
Keygenning mě hodně vzal… jednak se mi zdá asi vrcholem samotného RE, protože vlastně musíme opravdu porozumět kódu, který vidíme… Tudíž se naučíme pár nových příkazů:


IMUL EAX,EAX, 5 – Vynásobí EAX * 5 a uloží do EAX

SUB EAX, 5 – Zmenší EAX o 5 (Eax := Eax – 5)

ADD EAX, 5 – Zvětší EAX o 5 (Eax := Eax + 5)

SHL EAX, 5 – Posune EAX o pět číslic do leva… je to těžké vysvětlit, ale dám příklad: SHL EAX, 5… Eax = 12345678 a po operaci bude 67800000

SHR EAX, 5 – Posune EAX o pět číslic do prava… je to těžké vysvětlit, ale dám příklad: SHR EAX, 5… Eax = 12345678 a po operaci bude 00000123

Jestli nechápete, nebojte, až na ně narazíte v Olly, pochopíte to :-)

A víte co? Pojďte si hnedka jedno Cme keygennout :-). Ztáhl jsem ho z www.crackmes.de a obtížnost je nejlehčí. Keygenovat fakt ještě, dalo by se říct, skoro vůbec neumim :-(, ale naučím se to :-)…

-------
A jupí to cracknout :-)
…………………
Takže Cme 3 od kaiZera si otevřeme v PeiDu. Naskočí nám, že je to made in Delphi. Takže tentokráte vynecháme DeDe, a jdeme na Olly :-)

V Olly vyhledáme stringy a úplně dóle najdeme zajímavé stringy… Třeba „Solved…“… A mrkáme nahoru… V Delphi většinou procedury začínají „Pushem“…ale na to pak příjdete :-)… Takže nalezli jsme určitě adresu…

00458814 . 55 PUSH EBP
To je ten první PUSH, táím začíná procedura. My si ale nastavíme BP na první Call (00458840) a spustíme si Cme a dáme jako jméno třeba „DjH2oo7“ a s/n „1234567890“ a klikneme na „OK“. Olly se nám zastaví na callu, který přeskočíme a krokujeme dál…


Vídíme toto:
00458848 . E8 87B9FAFF CALL CrackMe_.004041D4
0045884D . 8BF0 MOV ESI, EAX
0045884F . 83FE 01 CMP ESI, 1 //zjistime, zda-li jmeno obsahuje aspon 1 znak
00458852 . 7D 12 JGE SHORT CrackMe_.00458866
00458854 . 33D2 XOR EDX, EDX
00458856 . 8B83 44030000 MOV EAX, DWORD PTR DS:[EBX+344]
0045885C . E8 BB9EFDFF CALL CrackMe_.0043271C
00458861 . E9 09010000 JMP CrackMe_.0045896F
00458866 > 83FE 63 CMP ESI, 63 //maximalne muze mit 63h znaku
00458869 . 7E 12 JLE SHORT CrackMe_.0045887D
0045886B . 33D2 XOR EDX, EDX
0045886D . 8B83 44030000 MOV EAX, DWORD PTR DS:[EBX+344]
00458873 . E8 A49EFDFF CALL CrackMe_.0043271C
00458878 . E9 F2000000 JMP CrackMe_.0045896F //Pod timto zacina vypocet… (vsimnete si, jak porovnavane cislo, kolik znaku obsahuje nick, bylo v ESI, nyni tedy pracujeme s poctem pismen v nasem zadanem nicku…)
0045887D > 6BFE 75 IMUL EDI, ESI, 75 //Do Eax uloz Esi * 75h (Eax := Esi *5) (Esi := Length(nick.text))
00458880 . 81C7 3E150000 ADD EDI, 153E //Edi := Edi+153Eh
00458886 . 81EF 74150000 SUB EDI, 1574 //Edi := Edi – 1574h
0045888C . 8BC6 MOV EAX, ESI //Eax := pocet pismen v zadanem nicku
0045888E . 83E8 22 SUB EAX, 22 //Eax := Eax – 22h
00458891 . 69C0 F0110000 IMUL EAX, EAX, 11F0 //Eax := Eax * 11F0h
00458897 . 03F8 ADD EDI, EAX //Edi := Edi + Eax (Edi z minula :-))
00458899 . 81C7 4C520E00 ADD EDI, 0E524C //Edi := Edi + E524Ch
0045889F . 68 BC894500 PUSH CrackMe_.004589BC ; ASCII "668r9\\5233"
004588A4 . 8D55 EC LEA EDX, DWORD PTR SS:[EBP-14]
004588A7 . 8BC7 MOV EAX, EDI
004588A9 . E8 C6F5FAFF CALL CrackMe_.00407E74 //Pricist na zacatek "668r9\\5233" ("668r9\\5233" + Edi)
004588AE . FF75 EC PUSH DWORD PTR SS:[EBP-14]
004588B1 . 68 D0894500 PUSH CrackMe_.004589D0
004588B6 . 68 DC894500 PUSH CrackMe_.004589DC ; ASCII "k329[43}"
004588BB . 8D45 F0 LEA EAX, DWORD PTR SS:[EBP-10]
004588BE . BA 04000000 MOV EDX, 4
004588C3 . E8 CCB9FAFF CALL CrackMe_.00404294 //Pricist na konec "k329[43}" ("668r9\\5233" + Edi + "k329[43}")



004588D6 . 85F6 TEST ESI, ESI
004588D8 . 0F8E 91000000 JLE CrackMe_.0045896F
004588DE . BF 01000000 MOV EDI, 1
004588E3 > 8B45 FC MOV EAX, DWORD PTR SS:[EBP-4]
004588E6 . 0FB64438 FF MOVZX EAX, BYTE PTR DS:[EAX+EDI-1] //První znak z nicku do eax
004588EB . 8945 F4 MOV DWORD PTR SS:[EBP-C], EAX
004588EE . 8D4D F8 LEA ECX, DWORD PTR SS:[EBP-8]
004588F1 . BA 02000000 MOV EDX, 2
004588F6 . 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C]
004588F9 . E8 8AF6FAFF CALL CrackMe_.00407F88
004588FE . 8D55 E4 LEA EDX, DWORD PTR SS:[EBP-1C]
00458901 . 8B83 44030000 MOV EAX, DWORD PTR DS:[EBX+344]
00458907 . E8 E09DFDFF CALL CrackMe_.004326EC
0045890C . FF75 E4 PUSH DWORD PTR SS:[EBP-1C] //Pushne si aktualni s/n ("668r9\\5233" + Edi + "k329[43}")
0045890F . FF75 F8 PUSH DWORD PTR SS:[EBP-8] //Pushne si ten první znak (resp. jeho hex. Hodnotu)
00458912 . 68 F0894500 PUSH CrackMe_.004589F0
00458917 . 8D45 E8 LEA EAX, DWORD PTR SS:[EBP-18]
0045891A . BA 03000000 MOV EDX, 3
0045891F . E8 70B9FAFF CALL CrackMe_.00404294 //Pricte se to aktualni s/n + ta hodnota prvniho pismena z nicku + znak „$“
00458924 . 8B55 E8 MOV EDX, DWORD PTR SS:[EBP-18]
00458927 . 8B83 44030000 MOV EAX, DWORD PTR DS:[EBX+344]


Potom ještě dělá Cme cosi se s/n (přiítá další hex hodnoty písmen…) ale bylo na crackmes.de, že jde o autorův nechtic bug.
Myslím, že by to mělo být všecko potřebné, co jsme chtěli vědět :-)

Můžeme jít na Keygen… a aby to nebylo jen tak, tak Vám zkusím přiblížit Delphi v API f-cích. Jde o to, že se do výsledné exace, nelinkuje VCL (kvůli které má výsledné exečko kolem 400 kB). Ale počítejte s tím, že je to o to těžší…

Vypíšu tedy celý popsaný zdroják (je to jen jeden soubor :-) (+ rsrc.res ale to je v balíčku :-))


program KeyGen;

uses Windows, Messages,sysutils,BeRoXM; //BeRoXM – this is pckg, where are components for playing music in *.xm. The format use a few keygens, cracks and trainers. Pckg is included v balíčku :-D

{$R rsrc.res}

const
id_name = 102; //id of EditBox "Name"
id_sn = 103; //id of EditBox "Serial no"
id_gen = 101; //id of Button "GEN!"

var
mWnd: HWnd; //HWND
i: integer; //i := Length(id_name)
sn2, sn3: integer; //sn :-)
XM:TBeRoXM;

function GetText: string; //id_name.text
begin
i := SendDlgItemMessage(mWnd, id_name, WM_GETTEXTLENGTH, 0, 0);
SetLength(result, i);
i := GetDlgItemTextA(mWnd, id_name, pchar(result), i + 1);
SetLength(result, i);
end;

function sn: string; //Computing s/n
begin
gettext; //get "i" :-)
if (i >= 3) then
begin
sn2:=0;
sn3:=0;
sn3:=i;
sn3:=sn3 * $75;
sn3:=sn3 + $153e;
sn3:=sn3 - $1574;
sn2:=i;
sn2:=sn2 - $22;
sn2:=sn2 * $11f0;
sn3:=sn3 + sn2;
sn3:=sn3 + $0e524c;
sn := '668r9\5233' + IntToStr(sn3) + '-k329[43}' + inttohex(ord(GetText[1]),2) + '$'; //:-)
end else
begin
sn := 'Input at least 3 chars!!!';
end;
end;
function engine(wnd, wmsg, wParam, lParam: dword): dword; stdcall;
begin
mWnd:=wnd;

case wmsg of

WM_COMMAND:
case loword(wparam) of
id_gen: SetDlgItemTextA(mWnd, id_sn, Pchar(sn)); //Jestli je stisknuto tlacitko, vykonej funkci sn a nastav ji jako "id_sn.text"
end;

WM_INITDIALOG:
begin
Randomize;
SetDlgItemTextA(mWnd, id_name, 'DjH2oo7'); //Implicitni…
SetDlgItemTextA(mWnd, id_sn, '668r9\5233815353-k329[43}44$'); //…Hodnoty
SetFocus(mWnd);
end;

WM_CLOSE:
begin
EndDialog(wnd, 0);
MessageBoxA(mWnd,pchar('Hi all rockers!!!' +#13+ 'Keygen programmed by: DjH2oo7' +#13+ 'Relase: 9.September 2oo7'+#13+#13+#13+'Thx to kaiZer-by for CrackMe =)!!'), pchar('Keygen by DjH...'), 0); //When we click „X“ button :-)
result := 1
end;
end;
end;

begin
XM:=TBeRoXM.Create(41000,2048,4,TRUE,10); //Music...
XM.ResamplingMethod:=BeROXMMixerWindowedFir;
XM.Clipping:=TRUE;
XM.Module.MasterVolume:=256;
XM.Module.LoadFromResource(hInstance,'MSC',RT_RCDATA);
XM.Play;

DialogBox(hinstance, pchar(200), 0, @engine); //Application.run
end.


//Sorry for my English :-(

Komponenta pro přehrávání je jen „na okrasu“ :-), Keygeny ji mívají. Tak jsem Vám chtěl přinést tajemství, kterým se to dělá (googlil jsem kvuli tomu asi 2 hodiny…).
Hudbu uložíte do resource (třeba pomocí ResHackeru) pod jménem „MSC“ a funkcí XM.Module.LoadFromResource(hInstance,'MSC',RT_RCDATA);
ji loadnete.
To byla taková třešnička na dortu (bohužel to moc zvětší binárku (cca o 100 kB) ale UPX to napraví (asi na 56 kB)). Můžete ji vymazat z uses a ty příkazy před DialogBoxem a binárka bude mít 56 kB samotná (po UPX zásahu, i 20kB :-))…
V balíku, jak je již řečeno, je CMe + Keygen + Sources na keygen + komponenta XM
Příště bych se chtěl mrknout na ochranu proti crackování, a vytvořím Cme, pokusíte se ho překonat :-). Pokusím se přiblížit i pár antidebugových triků…