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 - literaPonizej 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
-----------------------------------------
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.