WinZip 7.0 SR-1 by McKiler

Cel    : WinZip 7.0
Skad   : http://www.winzip.com, prawie kazda plyta shareware
Rozmiar: 943KB
Czym   : SoftIce 3.20

Wstep:

WinZip 7.0 jest najpopularniejszym i chyba najlepszym programem do obslugi archiwow zip. Wygodne pakowanie i rozpakowywanie, obsluga archiwow cab, menu kontekstowe umozliwiajace spakowanie rozpakowanie kazdego pliku/katalogu bez koniecznosci wchodzenia do archiwum. Program w wersji niezarejestrowanej "uprzyjemnia" nam czas wyswietlajac nag-screeny. Do WinZipa powstalo mnostwo kodow rejestracyjnych i keygenow, wiec jesli szukasz tu tylko kodu to lepiej przestan to czytac. Klasyczne, bardzo proste zabezpieczenie Nazwa/Serial. Prosta procedura, standardowe pulapki, szybkie znalezienie kodu - idealny do nauki crackowania.

Opis:

W tym tutorialu poznasz podstawy obslugi SoftIce oraz jeden z najprostszych (i co najdziwniejsze najczesciej spotykanych) schematow znajdowania kodu rejestracyjnego. Jest to praktycznie zadne zabezpieczenie, haslo sie znajduje wykonujac schematycznie okreslone czynnosci - dlatego idealnie nadaje sie do nauki tego pieknego fachu :) Jesli widziesz tutaj jakies niezrozumiale symbole, nie zrazaj sie, bo to jest naprawde proste, poprowadze cie krok po kroku.

Newbies Note!

Zanim cokolwiek zaczniesz robic w SoftIce upewnij sie ze w pliku winice.dat dokonales niezbedne poprawki, mianowicie sprawdz czy nie masz srednikow przed liniami

EXP=c:\windows\system\kernel32.dll
EXP=c:\windows\system\user32.dll
EXP=c:\windows\system\gdi32.dll

Jesli ich nie usuniesz SoftIce nie zalozy pulapek na funkcje z ktorych za chwile skorzystamy!

Linijke INIT=costam zamien na ponizsza, ulatwi to analize kodu:

INIT="lines 60; wd 22; wc 25; wr; code on; X;"

1. W pole Name wpisujemy McKiler/CrackPL'99 zas w pole Code 123456 (lub inny dowolny numerek). Nie naciskamy OK !

2. Wchodzimy do SoftIce (CTRL+D) i wpisujemy:

bpx getdlgitemtexta

W tym momecie zastawilismy pulapke (breakpoint). Wykonywanie programu zostanie przerwane jesli skorzysta on z tej funkcji. Funkcja getdlgitemtexta podobnie jak getwindowtexta pobiera dane z pola tekstowego. Wychodzimy z SI (naciskamy CTRL+D lub F5), naciskamy OK w programie i jestesmy spowrotem w SoftIce. Widzimy mniej wiecej cos takiego:

Break due to BPX USER32!GetDlgItemTextA  (ET=3.42 seconds)

USER32!GetDlgItemTextA

Oznacza to ze wlasnie program skorzystal z funkcji getdlgitemtexta. Naciskamy jeszcze raz F5 aby pozwolic programowi dalej sie wykonywac. Po chwili znowu jestesmy w SI

Break due to BPX USER32!GetDlgItemTextA  (ET=207.96 microseconds)

USER32!GetDlgItemTextA

Dlaczego? Poniewaz dane wpisywalismy do dwoch pol tekstowych, a wiec musza one byc dwa razy odczytane. Pierwszy raz name, drugi raz serial. Mozesz spotkac program, ktory juz po pobraniu name generuje serial, jednak wiekszosc (takze WinZip) serial generuje dopiero po pobraniu naszego wpisanego seriala, nastepnie je porownuje.

3. Jestesmy w momencie pobrania danych z drugiego pola tekstowego. Naciskamy F11 aby wyjsc z funkcji i przejsc do procedur, ktore beda cos z naszymi danymi robic. Na ekranie widzimy linie kodu:

UWAGA! Wartosci moga sie roznic. Tutaj niezbedne sa przynajmniej podstawy assemblera. Jesli ich nie znasz, bedziesz mial trudniejszy start, ale po przerobieniu kilku tutoriali mozna zalapac co i jak.

015F:0040803C  56                  PUSH    ESI       | wloz ESI na stos
015F:0040803D  E857160200          CALL    00429699  | skok do funkcji
015F:00408042  59                  POP     ECX       | zdejmij ECX ze stosu
015F:00408043  56                  PUSH    ESI       | wloz ESI na stos
015F:00408044  E879160200          CALL    004296C2  | skok do funkcji

4. Wyraznie widzimy zaznaczona linie w ktorej sie znajdujemy. Aby przejsc dalej mozemy nacisnac F10 (przejscie bez wchodzenia w funkcje wywolywane CALLem) lub F8 (przejscie z wchodzeniem w funkcje).

Zauwazmy ze na stos jest wkladane ESI. Mozemy zobaczyc co jest pod ESI wpisujac:

d ESI

Zobaczymy w oknie kodu nasz wpisany serial! Idziemy dalej naciskajac F10 - nie wchodzimy w zadne funkcje

015F:00408049  CMP    BYTE PTR [0047D928],00 | porownaj dlugosc name z zero
015F:00408050  POP    ECX
015F:00408051  JZ     004080B2               | jesli nasz name jest pusty to skok
015F:00408053  CMP    BYTE PTR [0047D958],00 | porownaj dlugosc seriala z zero
015F:0040805A  JZ     004080B2               | jesli nasz serial jest pusty to skok
015F:0040805C  CALL   00407B4B <----- wejscie do procedury weryfikacji kodu

5. W ta funkcje wywolana CALL-em nalezy wejsc - inaczej "rozminiemy" sie z procedura porownujaca nasze seriale. Najprostsza metoda to wchodzic we wszystkie procedurki, w tym tutorialu jednak poprowadze cie tylko przez te ktore musimy "odwiedzic".Tak wiec naciskamy F8.

015F:00407B4B  55                  PUSH    EBP
015F:00407B4C  8BEC                MOV     EBP,ESP
015F:00407B4E  81EC08020000        SUB     ESP,00000208
015F:00407B54  53                  PUSH    EBX
015F:00407B55  56                  PUSH    ESI

6. Sprawdzmy co jest pod ebx i esi, wpisujac:

d ebx

Widzimy nasz Name! (McKiler/CrackPL'99)

d esi

Widzimy nasz Serial! (123456)

Idziemy dalej naciskajac F10 Przechodzimy przez rozne instrukcje ktorych nie musimy analizowac, z ciekawosci mozna jedynie posprawdzac wartosci rejestrow, przez ktore beda sie przewijac nasz username oraz serial (ale tylko ten nasz wpisany hehe). Dochodzimy do:

015F:00407C0E  8D85C0FEFFFF        LEA     EAX,[EBP-0140]
015F:00407C14  50                  PUSH    EAX
015F:00407C15  57                  PUSH    EDI
015F:00407C16  E8AB000000          CALL    00407CC6
015F:00407C1B  59                  POP     ECX
015F:00407C1C  BE58D94700          MOV     ESI,0047D958
015F:00407C21  59                  POP     ECX
015F:00407C22  8D85C0FEFFFF        LEA     EAX,[EBP-0140]
015F:00407C28  56                  PUSH    ESI        | wrzuc ESI na stos
015F:00407C29  50                  PUSH    EAX        | wrzuc EAX na stos
015F:00407C2A  E8D1FC0400          CALL    00457900

7. A to co to? Program cos przerzuca do rejestrow i wrzuca cos na stos. Zobaczmy:

d edi

Widzimy nasz wpisany name.

d esi

Widzimy nasz wpisany serial

d eax

Hmmm... chyba to jest nasz wlasciwy kod!

Nastepnie wywolywana jest CALL-em procedurka ktora porowna wartosci zapisane w ESI oraz w EAX. Wprawdzie nasz kod pojawia sie w pamieci juz troche wczesniej, jednak w tym momencie jest on juz latwy do odnalezienia. Wystarczylo podejrzec wartosc rejestru EAX.......

8. Ciekawostka. Podczas analizy kodu mozna znalezc porownania naszego wpisanego kodu z jakimis innymi nazwami w pamieci. Jest to tzw. shitlista. Po prostu jesli program zauwazy ze nasz wpisany name jest taki jak ten w shitliscie skacze od razu do procedury generujacej blad i nawet nie sprawdza kodu. Czyli nawet jesli wpiszemy kod prawidlowy dla takich name i tak nie zarejestrujemy programu! W WinZip-ie 7.0 na shitliscie sa tylko dwa name: MuradMeraly oraz bcom.

9. Kolejna ciekawostka. W prawie identyczny sposob mozna znalezc serial do programu WinZip Self-Extractor. Potwierdza to twierdzenie ze programy z jednej firmy sa zabezpieczone niemal identycznie.

9. Podsumowanie

Program: WinZip 7.0 SR-1
Name   : McKiler/CrackPL'99
Code   : BCAxxxD5 (patrz ponizej)

Jezeli szukasz tu jedynie seriali, to zle trafiles. Dzialania opisane powyzej maja na celu analize kodu programu i poznanie schematu jego zabezpieczenia. Jezeli masz zamiar uzywac tego programu dluzej, kup go (nie dotyczy M$). Pozwoli to producentom udoskonalac oferowane programy, jak rowniez ich zabezpieczenia.

1999.04.02 by McKiler (mck@zg.home.pl)