W tym tutorialu postaram sie zwrócic uwage czytelnika na niekonwencjonalne podejscia do crackowania. Moja dewiza to - <<W crackowaniu najwazniejsze jest m y s l e n i e>>. Wiadomo, ze nie zawsze bedziesz mógl w stanie sobie poradzic, ale nie poddawaj sie zbyt szybko.
Cel : WinAce 1.0 Final Version (Szeroko uzywana byla jego dosowa wersja do pakowania zlamanych gier na tzw. plytach - skladankach, obecnie wyszla wersja pod W95/98/NT)
Gdzie znalezc : Prawdopodobnie bedzie na jakims Cover-CD - ostatnio nie nadazam za tym, ostatni numer kupilem ok. pól roku wstecz... - za to jest zawsze dostepny na www.winace.com - wersja instalacyjna 2 020 777 bajtów, plik 'winace1x.exe'
Narzedzia : Softice 3.xx - wazne, ze dobrze skonfigurowany :), moim poprzednim v1.9 BETA tez bym sobie poradzil...
Inne : Jesli nie wiesz co to SoftIce, czytanie reszty mozesz sobie odpuscic... Chociaz... Ja w koncu tez tak zaczynalem...
Musze sie przyznac, ze moja przygoda z crackowaniem zaczela sie, gdy nie mialem dostepu do internetu raz na tydzien (jak obecnie) i zaczynalem od czytania... Wtedy nie mialem zadnych polskich tutoriali i przeczytalem cala serie +ORC, SoftIce'a mialem wersje BETA, zadnej wiedzy o assemblerze (no moze jakies podstawy z C64) i wszystkiego nauczylem sie SAM, praktykujac 'reverse engineering'. Dopiero gdy trafilem na jakies materialy, dotarlo do mnie jak niewiele umiem...
Nie bede dalej zrzedzil, wiec -
Zaczynamy:
Nie sa to raczej instrukcje, jak zlamac WinAce'a, ale opis moich zmagan z tym programem (troche ponad 1h) i porada dla srednio zaawansowanych crackerów (ja nigdy nie uwazalem sie za kogos lepszego i nie jest mi to do szczescia potrzebne).
Przejde do konkretów - po zainstalowaniu widzimy:
Your AV - String :
___________________________
[___________________________]
Your registration key :
___________________________
[___________________________],
gdzie 'key' ma postac xxx-xxxx-xxxx-xxxx-xxxx
W registration menu czytamy, ze AV-String to nic innego, jak 'znak firmowy' - w archiwach znajdzie sie napis 'Spakowane by <<string>>' - Hmm, ciekawe. Po zalozeniu 'flagowych' bpx Hmemcpy i bpx GetWindowTextA dostalem sie do miejsca :
0137:0055F780 E8EB48EAFF CALL 00404070 0137:0055F785 50 PUSH EAX 0137:0055F786 E84546F6FF CALL 004C3DD0<-- !! sprawdzanie kodu 0137:0055F78B 8945F8 MOV [EBP-08],EAX<-- przechowaj eax 0137:0055F78E 33C0 XOR EAX,EAX<-- wyczysc EAX 0137:0055F790 5A POP EDX 0137:0055F791 59 POP ECX 0137:0055F792 59 POP ECX 0137:0055F793 648910 MOV FS:[EAX],EDX 0137:0055F796 EB0A JMP 0055F7A2 0137:0055F798 E9B73CEAFF JMP 00403454 0137:0055F79D E8563FEAFF CALL 004036F8 0137:0055F7A2 837DF800 CMP DWORD PTR [EBP-08],00 <-- porównanie... 0137:0055F7A6 7424 JZ 0055F7CC<-- jezeli OK, skacz 0137:0055F7A8 C60524A4560000 MOV BYTE PTR [0056A424],00 0137:0055F7AF 8D95F0FCFFFF LEA EDX,[EBP-0310] 0137:0055F7B5 A17C2C5700 MOV EAX,[00572C7C] 0137:0055F7BA E86159EAFF CALL 00405120 0137:0055F7BF 8B85F0FCFFFF MOV EAX,[EBP-0310] 0137:0055F7C5 E87606FEFF CALL 0053FE40 <-- w srodku MessageBoxA... 0137:0055F7CA EB26 JMP 0055F7F2 <-- omin zarejestrowanie... 0137:0055F7CC 6A00 PUSH 00 <-- dziekujemy za support... 0137:0055F7CE 8D95F0FCFFFF LEA EDX,[EBP-0310] 0137:0055F7D4 A104305700 MOV EAX,[00573004]
Moja rada : zawsze sprawdzaj ostatni CALL przed wywolaniem MessageBoxA, a zajdziesz daleko. Z latwoscia móglbym zrobic patcha, ale nie o to przeciez nam chodzi... Zreszta program dziekuje za rejestracje, a nadal jest 'unregistered' <-- sprawdz w menu 'About'. BTW - program jest zabezpieczony przed W32Dasm, wiec po co sie meczyc.
Autorzy podjeli niezly wysilek - twój 'AV-string' (kazda litera) jest XORowany tabela umieszczona w pamieci, ostatni hex jest ROL-owany i dodawany do EAX i tak po kolei... (przynajmniej ja tak to widze), natomiast jeszcze wieksze parodie sa przy 'key'. Okazuje sie, ze pierwsze trzy litery nie sa na nic przydatne, a pozostalych szesnascie moze tylko znajdowac sie wsród '34679ACDEFHKLMNPQRSTWXY' - chyba nie ufaja zbyt wielu samogloskom... koduje na '0123456789abcdef0123456
!Uwaga - kluczowy punkt - program 'przekodowuje' twój key na inny ciag znaków. Jako 3 traktuje 0, zamiast 4 jest 1, 6 jest 2 itd. Nastepnie wykonuje na nich rózne operacje matematyczne, a w koncu porównuje. Tylko popatrz :
0137:00629971 EB05 JMP 00629978 0137:00629973 49 DEC ECX 0137:00629974 85C9 TEST ECX,ECX 0137:00629976 7C37 JL 006299AF 0137:00629978 31D2 XOR EDX,EDX 0137:0062997A 6B442AF017 IMUL EAX,[EBP+EDX-10],17 !!!!!! 0137:0062997F 83C204 ADD EDX,04 0137:00629982 89442AEC MOV [EBP+EDX-14],EAX 0137:00629986 83FA0C CMP EDX,0C 0137:00629989 75EF JNZ 0062997A 0137:0062998B 0FB64429E0 MOVZX EAX,BYTE PTR [EBP+ECX-20] 0137:00629990 0145F0 ADD [EBP-10],EAX 0137:00629993 31C0 XOR EAX,EAX 0137:00629995 8B5428F0 MOV EDX,[EBP+EAX-10] 0137:00629999 83C004 ADD EAX,04 0137:0062999C C1EA18 SHR EDX,18 0137:0062999F C64428EF00 MOV BYTE PTR [EBP+EAX-11],00
Ciekawostka! - Patrz na linie oznaczona wykrzyknikami - jest to operacja mnozenia... To niesamowite na co mozna wpasc w kuchni jedzac jablko - a*b*0=0 ! - chyba kazdy to wie :) Skoro 3 daje nam 0 - nie wpisuj nic w polu AV, a jako kod np. BAC-3333-3333-3333-3333 I... zarejestrowane. Postanowilem to sprawdzic, wychodze z programu i uruchamiam ponownie... mina mi zrzedla - nic z tego... Program nie akceptuje pustego AV-String.
Trzeba poszukac innego sposobu - jak wspominalem myslenie ma przyszlosc. Po nieokreslonym czasie znalazlem takie cos: (gleboko schowane...)
0137:00629C0E 8902 MOV [EDX],EAX 0137:00629C10 3B4260 CMP EAX,[EDX+60] (*) !wskazówka - bpx 629c10 nie 0137:00629C13 7521 JNZ 00629C36 zadziala, dopóki jako 'key' 0137:00629C15 BB03000000 MOV EBX,00000003 nie wpiszesz dozwolonych 0137:00629C1A B8FFFFFFFF MOV EAX,FFFFFFFF znaków, które sa powyzej 0137:00629C1F 83C24C ADD EDX,4C np. 'BAC-3434-4334-4433-3443' 0137:00629C22 E87B560000 CALL 0062F2A2 0137:00629C27 8B55BC MOV EDX,[EBP-44] 0137:00629C2A 3A4266 CMP AL,[EDX+66] (**) 0137:00629C2D 7507 JNZ 00629C36 0137:00629C2F BE01000000 MOV ESI,00000001 0137:00629C34 EB02 JMP 00629C38 0137:00629C36 31F6 XOR ESI,ESI 0137:00629C38 89F0 MOV EAX,ESI 0137:00629C3A E9AF330000 JMP 0062CFEE
Gdy normalnie próbowalem zarejestrowac program przez zmiane jnz w 557fa6 (patrz na poczatku), program dziekowal za rejestracje i... nadal pozostawal niezarejestrowany. To co widzisz w linii oznaczonej (*) jest porównaniem EAX, w którym znajduje sie przeksztalcony AV-String z twoim falszywym 'key' (tez przeksztalconym). W moim wypadku EAX=6DB8CFB8, wiec wpisalem do edx+60 'na zywca' B8,CF,B8,6D (Dlaczego w odwrotnej kolejnosci chyba nie musze tlumaczyc...). W linii (**) sprawa ma sie podobnie, ale trzeba podmienic tylko jeden bajt. Spokojnie wykonalem 'bd *', program podziekowal za rejestracje, po ponownym uruchomieniu wszystko dziala nadal!
Zgadnijcie, co jest tego przyczyna?? - Otóz program generuje 256 bajtowy plik 'ace.key' i przed uruchomieniem go sprawdza. Gdy wpisalem prawidlowe wartosci, WinAce nagral to na plik i problem z glowy. Wygenerowal prawdziwy keyfile!! Mozesz teraz skopiowac w bezpieczne miejsce plik 'ace.key' - tylko on wystarczy, aby pozbyc sie klopotu :-) - na twoim komputerze ;)))) Po przegraniu pliku 'ace.key' na inny komputer program nadal pozostaje 'unregistered'. Nie podpowiem nic wiecej jak 'Regmon & Filemon'. A zreszta - skoro juz lamiecie program na podstawie tutorialu, to nie po to, aby go pózniej rozpowszechniac... A moze sie myle?
To juz koniec, teraz mozesz: Wyjsc na spacer, do kina, pobawic sie z psem, kotem, chomikiem, nakarmic rybki i odpoczac od siedzenia przed komputerem ;-)
Mam nadzieje, ze czegos sie nauczyles, a jezeli nie, to nic nie szkodzi - teoria teoria, tylko praktyka czyni mistrza.
<<EMO>>
emo@viper.pl
Greetings : Sir_THomasRE, Monter, MAX, CrackPL za inspiracje