Blog literacki, portal erotyczny - seks i humor nie z tej ziemi
___________________________________________________________________________________
_________\ | __________
/ \ __-+- __ | /\
/___________/ /'( |_ )`\ |________/ \
| \ / / . \/^\/ . \ / /
\ \ / _)_`-'_(_ \ / /
\ \ /.-~ ).( ~-.\ / /
\ \ /' /\_/\ `\ / /
\ / __ ___ " __" __ _ _ \/ /
\/ / _)( ,) ( ) / _)( ) ) \__/_
( (_ ) \ /()\( (_ ) \
\__)(_)\_)(_)(_)\__)(_)\_)
___ __
( ,\o l a n d ( )
) _/ cRACKING )(__
(_) gROUP (____)
____ /\
/ \ / \
/\ \ / /
\ \ / /
\___\___/
_______________________________________________________________________________________
CrackPl presents
GetRight cracking tutorial
_______________________________________________________________________________________
Cel: Banner*Show 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
Someone was seeking for me. So I came.
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.