BannerShow 2 by Ptasiek

Cel  : BannerShow 2
Skad : PC Shareware 2/98
Czym : SI+W32dasm
Efekt: Serial&keygenerator

Dzis na warsztacie dosc stary prog (plyta sprzed roku) no ale coz: money rulez. Nasz cel jest fajnie zabepieczony i dlatego wart uwagi (nie konwencjonalny sposob generowania seriala). Jak juz wspomnialem procka ta jest niecodzienna wiec zabiezemy sie do niej od innej strony niz zwykle. Ale po kolei: Uruchamiamy proga.... Spostrzezenia: button Register i info o trialu na pasku tytulowym oraz na poczatku trialinfo Wnioski: Procka sprawdzajaca warunki full version jest na 100% uruchamiana przy starcie proga. Oczywiscie jeszcze przed messageboxem infromujacym o trialu itp. so zastawiamy na niego pulapke w SI:

bpx messageboxa
bpx dialogxbox
bpx dialogboxparama

Dziwne nie dziala. Zdisassemblujmy cod w Wd32asm i w String References poszukajmy stringu z powitalnego messageboxa:"Note, this is an Unregistered...". Mamy go pod adresem 40839e:

|
:00408383 8B4DD0                  mov ecx, dword ptr [ebp-30]
:00408386 64890D00000000          mov dword ptr fs:[00000000], ecx
:0040838D EB48                    jmp 004083D7

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040834C(C)
|
:0040838F 833D9473440000          cmp dword ptr [00447394], 00000000;ciekawe
:00408396 7535                    jne 004083CD;czyzby checking bad/good???:)
:00408398 FF353C734400            push dword ptr [0044733C]

* Possible StringData Ref from Data Obj ->"   Note: This is an unregistered "
                                        ->"evaluation copy. %d days remaining."
                                  |
:0040839E 68BC794400              push 004479BC
:004083A3 68A0844500              push 004584A0
:004083A8 E8BFFE0000              call 0041826C
:004083AD 83C40C                  add esp, 0000000C

Zapiszmy sobie uw adres skoku i wyjdzmy z w32dasm. Listing bedzie potrzebny so zasejwuj go. Ladujemy BannerShow do SI i ustawiamy na ten adres breakpointa:

bpx 408396

No i po uruchomieniu i F5 jestesmy w zadanym fragmencie codu: Wow suprise: SI pokazuje nazwy zmiennych wewnetrznych. Cos mi tu C++ zalatuje (WinMain) - moge sie mylic bo nie tworze w tym jezyku. No to chyba juz wiesz co robic widzac porownanie:

cmp dword ptr [_registeredversion],0
jne ....

oczywiscie mozna zmienic flage, a potem skoki we wszystkich takich fragmentach albo przypisac na poczatku zmiennej registeredversion wartosc, rozna od zera, ale nam chodzi o cos szlachetniejszego - zarejestrowanie proga bez modyfikacji kodu. Oczywiscie nie zawsze jest to mozliwe ale sprobowac mozna. Aby mialo sens porownywanie zmiennej registeredversion (przedrostek '_' to wymog compilatora) z czyms, to najpierw cos do tej zmiennej musi byc wstawione. Ustawmy wiec pulapke wychwytujaca operacje na tej zmiennej:

bpm registeredversion rw

I zapuscmy proga od nowa: No i jestesmy pod 408738. Co dalej? Looknijmy co pokaze nam w32dasm w tej okolicy. Przejrzyjmy ponownie listing i zahaczmy o ten adres:

:00408729 E89EBF0000              call 004146CC
:0040872E 83C408                  add esp, 00000008

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00408528(C), :00408539(C), :0040854A(C), :0040855B(C), :0040856C(C)
|:0040857D(C), :0040858A(C), :0040859B(C), :004085AC(C), :004085BD(C)
|:004085CE(C), :004085DF(C), :004085EC(C), :004085FD(C), :0040860E(C)
|:0040861F(C), :00408630(C), :00408641(C), :0040864E(C), :0040865F(C)
|:00408670(C), :00408681(C), :00408692(C), :004086A3(C), :004086B0(C)
|:004086BD(C), :004086CA(C), :004086D7(C), :004086E4(C), :004086F1(C)
|:004086FE(C), :0040870B(C), :00408717(U)
|
:00408731 833D9473440000          cmp dword ptr [00447394], 00000000
:00408738 7570                    jne 004087AA
:0040873A 6804010000              push 00000104
:0040873F 6870E84600              push 0046E870

Mein Gott!!!. Ile skokow. Cieplo, cieplo, coraz cieplej. Zauwazmy skad nastepuje I-y skok. Najprawdopodobniej jest to poczatej procedury sprawdzajacej seriala. Wyjdzmy do SI i ustawmy breakpointa na ten adres. (pamietaj, aby Si siedzial pod naszym progiem).

bpx 408528

:004084FC E8CBC10000              call 004146CC
:00408501 83C408                  add esp, 00000008
:00408504 E82EF9FFFF              call 00407E37
:00408509 8D9781040000            lea edx, dword ptr [edi+00000481]
:0040850F 52                      push edx
:00408510 53                      push ebx


* Reference To: KERNEL32.lstrcmpA, Ord:0000h;sprawdzenie

;czy zostal wpisany ; jakis serial: porownanie 'UNREGISTERED' z wpisanym ;numerem(przechowywanym w pliku ini bez szyfrowania)

                                  |
:00408511 E8F4AD0300              Call 0044330A
:00408516 85C0                    test eax, eax
:00408518 0F84FB010000            je 00408719

I tu zaczyna sie wlasciwa procka sprawdzajaca. Jest ona bardzo dluga, wiec zamiescilem jej czesciowy listing w celu dokladnej analizy codu:

;W [EBX] nasz serial:

zaladuj I-y znak do cl

:0040851E 8A0B                    mov cl, byte ptr [ebx]
:00408520 51                      push ecx

* Reference To: USER32.IsCharAlphaA, Ord:0000h
                                  |
:00408521 E818B00300              Call 0044353E ;sprawdz czy I-y znak jest 
:00408526 85C0                    test eax, eax ;litera
:00408528 0F8403020000            je 00408731   ;jesli nie to bad skok
:0040852E 8A4301                  mov al, byte ptr [ebx+01] ;zaladuj II-i znak
:00408531 50                      push eax; do al
* Reference To: USER32.IsCharAlphaA, Ord:0000h
                                  |
:00408532 E807B00300              Call 0044353E;sprawdz czy jest litera
:00408537 85C0                    test eax, eax
:00408539 0F84F2010000            je 00408731;jesli nie to papa
:0040853F 8A5302                  mov dl, byte ptr [ebx+02]
:00408542 52                      push edx;zaladuj III-i znak do dl

* Reference To: USER32.IsCharAlphaNumericA, Ord:0000h
                                  |
:00408543 E806AF0300              Call 0044344E;sprawdz czy jest CYFRA
:00408548 85C0                    test eax, eax
:0040854A 0F84E1010000            je 00408731;jesli nie to zegnaj Ameryko
:00408550 8A4B03                  mov cl, byte ptr [ebx+03]
:00408553 51                      push ecx

* Reference To: USER32.IsCharAlphaNumericA, Ord:0000h;i tak dalej 
                                  |
:00408554 E8F5AE0300              Call 0044344E
:00408559 85C0                    test eax, eax
:0040855B 0F84D0010000            je 00408731
:00408561 8A4304                  mov al, byte ptr [ebx+04]
:00408564 50                      push eax

* Reference To: USER32.IsCharAlphaNumericA, Ord:0000h
                                  |
:00408565 E8E4AE0300              Call 0044344E
:0040856A 85C0                    test eax, eax
:0040856C 0F84BF010000            je 00408731
:00408572 8A5305                  mov dl, byte ptr [ebx+05]
:00408575 52                      push edx

* Reference To: USER32.IsCharAlphaNumericA, Ord:0000h
                                  |
:00408576 E8D3AE0300              Call 0044344E
:0040857B 85C0                    test eax, eax
:0040857D 0F84AE010000            je 00408731;      ALE!!!!!!!!!!
:00408583 0FBE4B06                movsx ecx, byte ptr [ebx+06];zaladuj znak do ECX
:00408587 83F92D                  cmp ecx,0000002D;iporownaj z 2d ('-') myslnikiem
:0040858A 0F85A1010000            jne 00408731;jesli rozne to papa
:00408590 8A4307                  mov al, byte ptr [ebx+07]
:00408593 50                      push eax

I tak dalej;

Gdy IsCharAlphaA to znak ma byc LITERA Gdy IsCharAlphaNumericA to znak ma byc CYFRA, a gdy znak jest porownywany z 2d MYSLNIK Po dojsciu do konca procedury i sprawdzeniu wszystkich znakow oto wniosek: Serial ma wygladac tak:

L - litera
C - cyfra
LLCCCC-LLCCC-CCLCC-CCCCC-CCCLLLC

Ponizej znajduje sie source keygeneratora do tego proga. Jesli czegos nie rozumiesz, a naprawde chcesz zdobyc podstawy nt. crackingu to napisz a chetnie Ci pomoge.

Ptasiek (newbie)
dreadpl@polbox.com

Acha obiecany source: (TP only)
-----------------------------------------
const
tablica:array[1..32] of byte=((1),(1),(2),(2),(2),(2),(3),(1),(1),(2),(2),(2),
(3),(2),(2),(1),(2),(2),(3),(2),(2),(2),(2),(2),(3),(2),(2),(2),(1),(1),(1),(2));
var index:byte;
begin;
writeln('BannerShow2 keyGenerator by Ptasiek');
writeln('Polish Crack - born to be wild');
writeln('Someone was seeking for me. So I came');
randomize;
for index:=1 to 32 do
case tablica[index] of
1:write(chr(65+random(26)));
2:write(chr(48+random(10)));
3:write('-');
end;
end.