Co : Mp3 CD Maker 1.1 Gdzie : ENTER CD (IX 99),www.zy2000.com Czym : SoftICE 3.2 (w dalszej czesci nazywany SI)
Musze przyznac, ze program posiada jedno z ciekawszych zabezpieczen, które udalo mi sie spotkac. Zazwyczaj natykamy sie na cos takiego :
mov ebx,[edi]
mov ecx,[esi]
cmp ebx,ecx
jne xxxxxxxx
Nie uwazam tego za zle zabezpieczenie, ale malo twórcze. Jezeli progamisci chca dobrze zabezpieczyc swoje programy, to nie powinni pisac jakis skomplikowanych procedur konczacych sie prostym porównaniem, ale ruszyc glowa. Dlatego tez zywie pewien respekt dla programisty MP3 CD Maker za sam pomysl na zabezpieczenie.
Koniec gledzenia ( rozgadalem sie jak stara baba ), bierzmy sie do pracy !
Uruchamiamy program.Po krótkiej chwili oczekiwania pojawia sie okno progarmu - mily niebieski interfejsik ( wczesniejsze wersje go nie posiadaja),a w prawym dolnym rogu dwa napisy : BUY NOW i REGISTER. Nas interesuje to drugie - klikniecie - i kolejne okienko z naszym upragnionym REGISTRATION NAME & CODE.
A wiec do rzeczy. Wystukujemy nasze ulubione dane ( sIR tHomasRE , 12341234 ) i wpadamy na chwilke do SoftICE'a, aby ustawic breakpoint'a :
bpx GetWindowTextA
Teraz tylko Ctrl-D, OK i jestesmy w kodzie programu. Ponownie Ctrl-D i program dokonuje wczytania danych rejestracyjnych po raz drugi. Nastepnie wyszukujemy nasz nickname :
s 0 l ffffffff 'sIR tHomasRE'
i ustawiamy breakpoint'a na znalezionym adresie. W moim przypadku bylo to : bpm B242F0
I znowu Ctrl-D. Program zatrzymuje sie. Opuszczamy call, w którym aktualnie jestesmy, i widzimy cos takiego :
:00414DC0 8D8574FDFFFF lea eax, dword ptr [ebp-028C] :00414DC6 50 push eax :00414DC7 E8841C0100 call 00426A50 :00414DCC 83C408 add esp, 00000008 <---- tu jestesmy :00414DCF C68594FDFFFF00 mov byte ptr [ebp-0026C], 00 :00414DD6 8D4DE8 lea ecx, dword ptr [ebp-0018] :00414DD9 E8223B0000 call 00418900 :00414DDE 50 push eax :00414DDF 8D8D74FEFFFF lea ecx, dword ptr [ebp-018C] :00414DE5 51 push ecx :00414DE6 E8651C0100 call 00426A50 :00414DEB 83C408 add esp, 00000008 :00414DEE C68594FEFFFF00 mov byte ptr [ebp-018C], 00 :00414DF5 8D9574FEFFFF lea edx, dword ptr [ebp-028C] :00414DFB 52 push edx :00414DFC 8D8574FDFFFF lea eax, dword ptr [ebp-0088] :00414E02 50 push eax :00414E03 8B8D78FFFFFF mov ecx, dword ptr [ebp-0088] :00414E09 81C1E0E90000 add ecx, 0000E9E0 :00414E0F E8FE7D0000 call 0041CC12 :00414E14 8B8D78FFFFFF mov ecx, dword ptr [ebp-0088] :00414E1A 81C1E0E90000 add ecx, 0000E9E0 :00414E20 E8F07B0000 call 0041CA15 :00414E25 E816D0FEFF call 00401E40 :00414E2A 898578FFFFFF mov dword ptr [ebp-0088], eax :00414E30 8B8D78FFFFFF mov ecx, dword ptr [ebp-0088] :00414E36 81C1E0E90000 add ecx, 0000E9E0 :00414E3C E8D0790000 call 0041C811 <---- (!) :00414E41 898574FFFFFF mov dword ptr [ebp-008C], eax :00414E47 8B8574FFFFFF mov eax, dword ptr [ebp-008C] :00414E4D 99 cdq :00414E4E B906000000 mov ecx, 00000006 <---- :00414E53 F7F9 idiv ecx :00414E55 898574FFFFFF mov dword ptr [ebp-008C], eax :00414E5B 8D8D7CFFFFFF lea ecx, dword ptr [ebp-0084] :00414E61 E8DAD8FEFF call 00402740 :00414E66 8D957CFFFFFF lea edx, dword ptr [ebp-0084] :00414E6C 52 push edx :00414E6D 8B8DC8FCFFFF mov ecx, dword ptr [ebp-0338] :00414E73 81C120010000 add ecx, 00000120 :00414E79 E83253FFFF call 0040A1B0 :00414E7E 8B8574FFFFFF mov eax, dword ptr [ebp-008C] :00414E84 83E864 sub eax, 00000064 <---- :00414E87 898574FFFFFF mov dword ptr [ebp-008C], eax :00414E8D 83BD74FFFFFF0B cmp dword ptr [ebp-008C], 0000000B <---- :00414E94 0F8558010000 jne 00414FF2 <---- :00414E9A 6A20 push 00000020
Usuwamy poprzednie breakpoint'y i ustawiamy nowy :
bc * bpx 414dc7
Sprawdzamy pierwszy napotkany skok (0137:00414E94). Widzimy,ze program wykonuje go. Zmieniamy flage Z. Zatem...
r fl z
i opuszczamy SI(Ctrl-D). Zauwazamy, ze napisy BUY NOW i REGISTER zniknely. A wiec restartujemy program i nasze napisy pojawiaja sie znowu. Wiemy juz, w którym miejscu dokunuje sie porównanie GOOD CODE/BAD CODE. Przyjrzyjmy sie tej linii :
:00414E8D 83BD74FFFFFF0B cmp dword ptr [ebp-008C], 0000000B
Jakas wartosc porównywana jest z 0Bh(11). Wartosc ta nie jest dlugoscia naszego kodu ani imienia. Zmieniamy nickname/code i za kazdym razem uzyskujemy cos innego. Spróbujmy teraz zrozumiec zamiary programisty.
Nie chcial on generowac poprawnego kodu, aby namierzenie go nie bylo tak proste jak w wielu innych programach. Postanowil wiec sprawdzac jego poprawnosc wedlug schematu :
name + code = okreslona wartosc
Oczywiscie program nie dodaje naszego nickname'a i kodu. Laczy je w pewien nieznany ( jak na razie ) dla nas sposób. Zajmiemy sie teraz jego odtworzeniem od tylu. Program porównuje wartosc [ebp-8C] z B. Pierwszy raz pojawia sie ona w tym miejscu:
:00414E3C E8D0790000 call 0041C811 :00414E41 898574FFFFFF mov dword ptr [ebp-008C], eax
Latwo sie domyslic,ze to "call 0041C811" bedzie generowal ja. A wiec zobaczmy co sie dzieje miedzy "call 0041C811" a "cmp dword ptr [ebp+FFFFFF74], 0000000B"
:00414E4E B906000000 mov ecx, 00000006 :00414E53 F7F9 idiv ecx <---- dzielenie przez 6h :00414E7E 8B8574FFFFFF mov eax, dword ptr [ebp-008C] :00414E84 83E864 sub eax, 00000064 <---- odejmowanie 64h
Zatem najpierw nasza wartosc zostaje podzielona przez 06h, a nastepnie zostaje odjete od niej 64h. Tak wiec do 0Bh, które mamy uzyskac z naszego kodu, dodajemy 64h, a otrzymany wynik mnozymy przez 6h.
0Bh + 64h = 6Fh
6F * 6h = 29Ah
Juz wiemy jaka wartosc (29Ah) powinnismy uzyskac po "call 0041C811". Zajmiemy sie teraz tym call'em. F8 i jestesmy w srodku (kod pochodzi z W32Dasm, w SI zapis bedzie troche inny):
:0041C811 55 push ebp :0041C812 8BEC mov ebp, esp :0041C814 81EC10010000 sub esp, 00000110 :0041C81A 898DF0FEFFFF mov dword ptr [ebp+FFFFFEF0], ecx :0041C820 6A23 push 00000023 :0041C822 8B85F0FEFFFF mov eax, dword ptr [ebp+FFFFFEF0] :0041C828 05B4010000 add eax, 000001B4 :0041C82D 50 push eax :0041C82E 8D4D88 lea ecx, dword ptr [ebp-78] :0041C831 51 push ecx :0041C832 E879A80000 call 004270B0 :0041C837 83C40C add esp, 0000000C :0041C83A 6A47 push 00000047 :0041C83C 68C8070000 push 000007C8 :0041C841 8D5588 lea edx, dword ptr [ebp-78] :0041C844 52 push edx :0041C845 8B8DF0FEFFFF mov ecx, dword ptr [ebp+FFFFFEF0] :0041C84B E814060000 call 0041CE64 :0041C850 C645A800 mov [ebp-58], 00 :0041C854 8D4588 lea eax, dword ptr [ebp-78] :0041C857 50 push eax :0041C858 E8C5A40100 call 00436D22 :0041C85D 83C404 add esp, 00000004 :0041C860 6A20 push 00000020 :0041C862 8B8DF0FEFFFF mov ecx, dword ptr [ebp+FFFFFEF0] :0041C868 81C1A5020000 add ecx, 000002A5 :0041C86E 51 push ecx :0041C86F 8D95F8FEFFFF lea edx, dword ptr [ebp+FFFFFEF8] :0041C875 52 push edx :0041C876 E835A80000 call 004270B0 :0041C87B 83C40C add esp, 0000000C :0041C87E 6A53 push 00000053 :0041C880 6849020000 push 00000249 :0041C885 8D85F8FEFFFF lea eax, dword ptr [ebp+FFFFFEF8] :0041C88B 50 push eax :0041C88C 8B8DF0FEFFFF mov ecx, dword ptr [ebp+FFFFFEF0] :0041C892 E8CD050000 call 0041CE64 :0041C897 8D8DF8FEFFFF lea ecx, dword ptr [ebp+FFFFFEF8] :0041C89D 894DFC mov dword ptr [ebp-04], ecx :0041C8A0 8B55FC mov edx, dword ptr [ebp-04] :0041C8A3 33C0 xor eax, eax :0041C8A5 8A02 mov al, byte ptr [edx] :0041C8A7 83F820 cmp eax, 00000020 :0041C8AA 750B jne 0041C8B7 :0041C8AC 8B4DFC mov ecx, dword ptr [ebp-04] :0041C8AF 83C101 add ecx, 00000001 :0041C8B2 894DFC mov dword ptr [ebp-04], ecx :0041C8B5 EBE9 jmp 0041C8A0 :0041C8B7 8B55FC mov edx, dword ptr [ebp-04] :0041C8BA 8955F8 mov dword ptr [ebp-08], edx :0041C8BD 8B45FC mov eax, dword ptr [ebp-04] :0041C8C0 83C006 add eax, 00000006 :0041C8C3 3945F8 cmp dword ptr [ebp-08], eax :0041C8C6 7329 jnb 0041C8F1 :0041C8C8 8B4DF8 mov ecx, dword ptr [ebp-08] :0041C8CB 33D2 xor edx, edx :0041C8CD 8A11 mov dl, byte ptr [ecx] :0041C8CF 83FA30 cmp edx, 00000030 :0041C8D2 7C0C jl 0041C8E0 :0041C8D4 8B45F8 mov eax, dword ptr [ebp-08] :0041C8D7 33C9 xor ecx, ecx :0041C8D9 8A08 mov cl, byte ptr [eax] :0041C8DB 83F909 cmp ecx, 00000009 :0041C8DE 7E11 jle 0041C8F1 :0041C8E0 8B55F8 mov edx, dword ptr [ebp-08] :0041C8E3 C60230 mov byte ptr [edx], 30 :0041C8E6 8B45F8 mov eax, dword ptr [ebp-08] :0041C8E9 83C001 add eax, 00000001 :0041C8EC 8945F8 mov dword ptr [ebp-08], eax :0041C8EF EBCC jmp 0041C8BD :0041C8F1 8D4D88 lea ecx, dword ptr [ebp-78] :0041C8F4 51 push ecx :0041C8F5 E866AD0000 call 00427660 :0041C8FA 83C404 add esp, 00000004 :0041C8FD 8985F4FEFFFF mov dword ptr [ebp+FFFFFEF4], eax :0041C903 C78578FFFFFF00000000 mov dword ptr [ebp+FFFFFF78], 00000000 :0041C90D C7857CFFFFFF00000000 mov dword ptr [ebp+FFFFFF7C], 00000000 :0041C917 EB0F jmp 0041C928 :0041C919 8B957CFFFFFF mov edx, dword ptr [ebp+FFFFFF7C] :0041C91F 83C201 add edx, 00000001 :0041C922 89957CFFFFFF mov dword ptr [ebp+FFFFFF7C], edx :0041C928 8B857CFFFFFF mov eax, dword ptr [ebp+FFFFFF7C] :0041C92E 3B85F4FEFFFF cmp eax, dword ptr [ebp+FFFFFEF4] :0041C934 7D2D jge 0041C963 :0041C936 8B8D7CFFFFFF mov ecx, dword ptr [ebp+FFFFFF7C] :0041C93C 33D2 xor edx, edx :0041C93E 8A540D88 mov dl, byte ptr [ebp+ecx-78] :0041C942 83FA20 cmp edx, 00000020 :0041C945 741A je 0041C961 :0041C947 8B857CFFFFFF mov eax, dword ptr [ebp+FFFFFF7C] :0041C94D 33C9 xor ecx, ecx :0041C94F 8A4C0588 mov cl, byte ptr [ebp+eax-78] :0041C953 8B9578FFFFFF mov edx, dword ptr [ebp-0088] :0041C959 33D1 xor edx, ecx :0041C95B 899578FFFFFF mov dword ptr [ebp-0088], edx :0041C961 EBB6 jmp 0041C919 :0041C963 8B8578FFFFFF mov eax, dword ptr [ebp-0088] :0041C969 0FAF8578FFFFFF imul eax, dword ptr [ebp-0088] :0041C970 0FAF8578FFFFFF imul eax, dword ptr [ebp-0088] :0041C977 0FAF8578FFFFFF imul eax, dword ptr [ebp-0088] :0041C97E 0FAF8578FFFFFF imul eax, dword ptr [ebp-0088] :0041C985 6BC01D imul eax, 0000001D :0041C988 83E862 sub eax, 00000062 :0041C98B 898578FFFFFF mov dword ptr [ebp-0088], eax :0041C991 8B8578FFFFFF mov eax, dword ptr [ebp-0088] :0041C997 33D2 xor edx, edx :0041C999 B963000000 mov ecx, 00000063 :0041C99E F7F1 div ecx :0041C9A0 899578FFFFFF mov dword ptr [ebp-0088], edx :0041C9A6 8B8578FFFFFF mov eax, dword ptr [ebp-0088] :0041C9AC 33D2 xor edx, edx :0041C9AE B90A000000 mov ecx, 0000000A :0041C9B3 F7F1 div ecx :0041C9B5 894580 mov dword ptr [ebp-80], eax :0041C9B8 8B8578FFFFFF mov eax, dword ptr [ebp-0088] :0041C9BE 33D2 xor edx, edx :0041C9C0 B90A000000 mov ecx, 0000000A :0041C9C5 F7F1 div ecx :0041C9C7 899574FFFFFF mov dword ptr [ebp-0088], edx :0041C9CD 8B55FC mov edx, dword ptr [ebp-04] :0041C9D0 33C0 xor eax, eax :0041C9D2 8A4209 mov al, byte ptr [edx+09] :0041C9D5 8B4D80 mov ecx, dword ptr [ebp-80] :0041C9D8 83C130 add ecx, 00000030 :0041C9DB 2BC1 sub eax, ecx :0041C9DD 69C063020000 imul eax, 00000263 :0041C9E3 0558020000 add eax, 00000258 :0041C9E8 894584 mov dword ptr [ebp-7C], eax :0041C9EB 8B55FC mov edx, dword ptr [ebp-04] :0041C9EE 33C0 xor eax, eax :0041C9F0 8A4206 mov al, byte ptr [edx+06] :0041C9F3 8B8D74FFFFFF mov ecx, dword ptr [ebp-0088] :0041C9F9 83C130 add ecx, 00000030 :0041C9FC 2BC1 sub eax, ecx :0041C9FE 69C075010000 imul eax, 00000175 :0041CA04 8B5584 mov edx, dword ptr [ebp-7C] :0041CA07 8D440242 lea eax, dword ptr [edx+eax+42] :0041CA0B 894584 mov dword ptr [ebp-7C], eax :0041CA0E 8B4584 mov eax, dword ptr [ebp-7C] :0041CA11 8BE5 mov esp, ebp :0041CA13 5D pop ebp :0041CA14 C3 ret
Troche to dlugie, wiec nie zamierzam dokladnie opisywac kazdej linii. Krótko - najpierw program zmienia litery w naszym nickname'ie na duze, a nastepnie modyfikuje pierwsze 6 cyfr na zera. Dzialania te nas nie obchodza.
Interesujacy nas fragment rozpoczyna sie pod adresem 0137:0041C919. Program zabiera sie za nasz nickname. Najpierw wykonuje petle,w której pobiera kazda litere. Na otrzymanym wyniku wykonuje kilka operacji matematycznych. Oto kod( dla wnikliwych opisy ) :
:0041C919 8B957CFFFFFF mov edx, dword ptr [ebp+FFFFFF7C] :0041C91F 83C201 add edx, 00000001 :0041C922 89957CFFFFFF mov dword ptr [ebp+FFFFFF7C], edx :0041C928 8B857CFFFFFF mov eax, dword ptr [ebp+FFFFFF7C] :0041C92E 3B85F4FEFFFF cmp eax, dword ptr [ebp+FFFFFEF4] :0041C934 7D2D jge 0041C963 <-- skok kiedy koniec :0041C936 8B8D7CFFFFFF mov ecx, dword ptr [ebp+FFFFFF7C] :0041C93C 33D2 xor edx, edx :0041C93E 8A540D88 mov dl, byte ptr [ebp+ecx-78] <-- pobranie litery :0041C942 83FA20 cmp edx, 00000020 <-- sprawdzenie czy spacja :0041C945 741A je 0041C961 :0041C947 8B857CFFFFFF mov eax, dword ptr [ebp+FFFFFF7C] :0041C94D 33C9 xor ecx, ecx :0041C94F 8A4C0588 mov cl, byte ptr [ebp+eax-78] <-- pobranie litery :0041C953 8B9578FFFFFF mov edx, dword ptr [ebp-0088] :0041C959 33D1 xor edx, ecx <-- generowanie :0041C95B 899578FFFFFF mov dword ptr [ebp-0088], edx :0041C961 EBB6 jmp 0041C919 <-- powrót do poczatku petli :0041C963 8B8578FFFFFF mov eax, dword ptr [ebp-0088] | :0041C969 0FAF8578FFFFFF imul eax, dword ptr [ebp-0088] | :0041C970 0FAF8578FFFFFF imul eax, dword ptr [ebp-0088] |> mnozenie :0041C977 0FAF8578FFFFFF imul eax, dword ptr [ebp-0088] | :0041C97E 0FAF8578FFFFFF imul eax, dword ptr [ebp-0088] | :0041C985 6BC01D imul eax, 0000001D | :0041C988 83E862 sub eax, 0000 <-- odejmowanie :0041C98B 898578FFFFFF mov dword ptr [ebp-0088], eax :0041C991 8B8578FFFFFF mov eax, dword ptr [ebp-0088] :0041C997 33D2 xor edx, edx | :0041C999 B963000000 mov ecx, 00000063 | :0041C99E F7F1 div ecx | :0041C9A0 899578FFFFFF mov dword ptr [ebp-0088], edx | :0041C9A6 8B8578FFFFFF mov eax, dword ptr [ebp-0088] | :0041C9AC 33D2 xor edx, edx | :0041C9AE B90A000000 mov ecx, 0000000A |> dzielenie :0041C9B3 F7F1 div ecx | :0041C9B5 894580 mov dword ptr [ebp-80], eax | :0041C9B8 8B8578FFFFFF mov eax, dword ptr [ebp-0088] | :0041C9BE 33D2 xor edx, edx | :0041C9C0 B90A000000 mov ecx, 0000000A | :0041C9C5 F7F1 div ecx | :0041C9C7 899574FFFFFF mov dword ptr [ebp-0088], edx :0041C9CD 8B55FC mov edx, dword ptr [ebp-04]
Nastepnie program zabiera sie za nasz kod:
:0041C9D2 8A4209 mov al, byte ptr [edx+09] <-- 10. litera kodu :0041C9D5 8B4D80 mov ecx, dword ptr [ebp-80] :0041C9D8 83C130 add ecx, 00000030 :0041C9DB 2BC1 sub eax, ecx :0041C9DD 69C063020000 imul eax, 00000263 :0041C9E3 0558020000 add eax, 00000258 :0041C9E8 894584 mov dword ptr [ebp-7C], eax :0041C9EB 8B55FC mov edx, dword ptr [ebp-04] :0041C9EE 33C0 xor eax, eax :0041C9F0 8A4206 mov al, byte ptr [edx+06] <-- 7. litera kodu :0041C9F3 8B8D74FFFFFF mov ecx, dword ptr [ebp-0088] :0041C9F9 83C130 add ecx, 00000030 :0041C9FC 2BC1 sub eax, ecx :0041C9FE 69C075010000 imul eax, 00000175 :0041CA04 8B5584 mov edx, dword ptr [ebp-7C] :0041CA07 8D440242 lea eax, dword ptr [edx+eax+42] :0041CA0B 894584 mov dword ptr [ebp-7C], eax
Zauwazamy, ze program interesuje 7. i 10. cyfra naszego kodu. Wazne jest,aby nasz kod byl przynajmniej 10-cyfrowy. Przyjrzyjmy sie wnikliwie. Najpierw progarm pobiera 10.cyfre kodu. Odejmuje od niej pewna liczbe wieksza od 30, a nastepnie mnozy wynik razy 263 i dodaje 258. Podobnie postepuje z 7. cyfra. Ostatecznie dodaje wyniki :
:0041CA07 8D440242 lea eax, dword ptr [edx+eax+42]
Uzyskujemy dosc duza liczbe - niedobrze. Co zrobic,aby byla mniejsza ? Najprosciej pomniejszyc iloczyny :
:0041C9DB 2BC1 sub eax, ecx :0041C9DD 69C063020000 imul eax, 00000263 <--- :0041C9FC 2BC1 sub eax, ecx :0041C9FE 69C075010000 imul eax, 00000175 <---
Wiemy,ze w eax znajduja sie nasze cyfry.Gdyby eax=ecx wtedy iloczyn bylby równy zero.A wiec wpisujemy w nasz kod odpowiednie cyfry.Iloczyny sa wtedy równe zero. Zwrócmy uwage na linie :
:0041C9E3 0558020000 add eax, 00000258 :0041CA07 8D440242 lea eax, dword ptr [edx+eax+42] ...znowu to samo
Wedlug tego : eax=edx+eax+42 W naszym przypadku otrzymamy :
eax = 0h + 258h + 42h
eax = 29Ah
Zaraz,zaraz... 29A? Skad my to znamy. Czy nie ta wartosc mielismy uzyskac po wyjsciu z call'a ? A wiec juz tylko Ctrl-D i rozkoszujemy sie posiadaniem zarejestrowanej wersji programu.
Moje dane rejestracyjne :
Name : sIR tHomasRE
Code : xxxxxx3xx3
Byc moze powininem tu zakonczyc ten tutorial, ale tego nie zrobie. Jak nie masz ochoty, dalej nie czytaj.Zajmiemy sie tam zrozumieniem reszty procedury generowania i patchem.
Wrócmy tu :
:0041C9D5 8B4D80 mov ecx, dword ptr [ebp-80] <--- :0041C9D8 83C130 add ecx, 00000030 :0041C9DB 2BC1 sub eax, ecx :0041C9DD 69C063020000 imul eax, 00000263I tu :
:0041C9F3 8B8D74FFFFFF mov ecx, dword ptr [ebp-0088] <--- :0041C9F9 83C130 add ecx, 00000030 :0041C9FC 2BC1 sub eax, ecx
Co wlasciwie znajduje sie pod ecx? Otóz program najpierw pobieral nasz nickname.I w koncu zapomnialem napisac po co. A wiec wynikiem byla liczba dwucyfrowa. Program dzielil ja przez 0Ah. Zapamietywal zarówno wynik jak i reszte z dzielenia ( obie to liczby mniejsze od 10 ). W zaznaczonych liniach do nich powracal.
[ebp-80] - wynik ilorazu [ebp-0088] - reszta z dzielenia
O generacji kodu to wszystko. Pozostal juz tylko patch. Nie bede sie na ten temat juz rozpisywal. Oto kod :
:004127DE 8945EC mov dword ptr [ebp-14], eax :004127E1 8B4DEC mov ecx, dword ptr [ebp-14] :004127E4 81C1E0E90000 add ecx, 0000E9E0 :004127EA E822A00000 call 0041C811 <---- tutaj generowane :004127EF 898568FFFFFF mov dword ptr [ebp+FFFFFF68], eax jest 29Ah :004127F5 8B4DEC mov ecx, dword ptr [ebp-14] :004127F8 83B9DCE9000000 cmp dword ptr [ecx+0000E9DC], 00000000 :004127FF 7469 je 0041286A <---- skok dalej :0041286A 6A66 push 00000066 :0041286C B940A44600 mov ecx, 0046A440 :00412871 E89B7AFFFF call 0040A311 :00412876 50 push eax :00412877 6816040000 push 00000416 :0041287C 8B8D0CFFFFFF mov ecx, dword ptr [ebp+FFFFFF0C] :00412882 E8079B0200 call 0043C38E :00412887 8BC8 mov ecx, eax :00412889 E8BF9B0200 call 0043C44D :0041288E 8B8568FFFFFF mov eax, dword ptr [ebp+FFFFFF68] :00412894 99 cdq :00412895 B903000000 mov ecx, 00000003 <----- 29Ah : 3h = DEh (!) :0041289A F7F9 idiv ecx :0041289C 898568FFFFFF mov dword ptr [ebp+FFFFFF68], eax :004128A2 8D4DF0 lea ecx, dword ptr [ebp-10] :004128A5 E896FEFEFF call 00402740 :004128AA 8D55F0 lea edx, dword ptr [ebp-10] :004128AD 52 push edx :004128AE 8B8D0CFFFFFF mov ecx, dword ptr [ebp+FFFFFF0C] :004128B4 81C120010000 add ecx, 00000120 :004128BA E8F178FFFF call 0040A1B0 :004128BF 6A20 push 00000020 :004128C1 8B8D0CFFFFFF mov ecx, dword ptr [ebp+FFFFFF0C] :004128C7 81C120010000 add ecx, 00000120 :004128CD E8CE460000 call 00416FA0 :004128D2 8B8568FFFFFF mov eax, dword ptr [ebp+FFFFFF68] :004128D8 83C07B add eax, 0000007B <----- DEh + 7Bh = 159h (!) :004128DB 898568FFFFFF mov dword ptr [ebp+FFFFFF68], eax :004128E1 6A00 push 00000000 :004128E3 682C010000 push 0000012C :004128E8 6A00 push 00000000 :004128EA 6A6F push 0000006F :004128EC B940A44600 mov ecx, 0046A440 :004128F1 E81B7AFFFF call 0040A311 :004128F6 50 push eax :004128F7 6A00 push 00000000 :004128F9 8B8D0CFFFFFF mov ecx, dword ptr [ebp+FFFFFF0C] :004128FF 81C120010000 add ecx, 00000120 :00412905 E877580200 call 00438181 :0041290A 6A01 push 00000001 :0041290C 6A50 push 00000050 :0041290E 6A02 push 00000002 :00412910 6A70 push 00000070 :00412912 B940A44600 mov ecx, 0046A440 :00412917 E8F579FFFF call 0040A311 :0041291C 50 push eax :0041291D 6A01 push 00000001 :0041291F 8B8D0CFFFFFF mov ecx, dword ptr [ebp+FFFFFF0C] :00412925 81C120010000 add ecx, 00000120 :0041292B E851580200 call 00438181 :00412930 6A02 push 00000002 :00412932 8D4DF0 lea ecx, dword ptr [ebp-10] :00412935 E806FDFEFF call 00402640 :0041293A 2D7C010000 sub eax, 0000017C :0041293F 50 push eax :00412940 6A00 push 00000000 :00412942 6A71 push 00000071 :00412944 B940A44600 mov ecx, 0046A440 :00412949 E8C379FFFF call 0040A311 :0041294E 50 push eax :0041294F 6A02 push 00000002 :00412951 8B8D0CFFFFFF mov ecx, dword ptr [ebp+FFFFFF0C] :00412957 81C120010000 add ecx, 00000120 :0041295D E81F580200 call 00438181 :00412962 81BD68FFFFFF59010000 cmp dword ptr [ebp+FFFFFF68], 00000159 :0041296C 0F85E8000000 jne 00412A5A <--- porównanie poprawnosciPatch :
1296Ch 0F 85 E8 00 00 00 ---> 90 90 90 90 90 90
Zostaly juz mi tylko koncowe uwagi:
- dane rejestracyjne sa zapisywane w katalogu programu (mp3cd.key)
- wazna jest 7. i 10. cyfra, reszta kodu moze byc roznymi znakami
- dla programu dlugosc kodu nie ma znaczenia
Na koniec jeszcze keygen ( nie zadawajcie mi zadnych pytan o ASM, kazdy keygen musze pisac z SI, aby zobaczyc gdzie zrobilem bledy ) :
.model tiny
.386
.code
org 100h
start:
mov ah,09h
mov dx,offset napis
int 21h
;read name
mov dx,[offset maxlen]
mov ah, 0Ah
int 21h
cmp [maxlen+1],00h
jz halt
mov cl,[maxlen+1]
mov eax,[offset regname]
xor edx,edx
k1:
inc dl
inc eax
mov bl,[byte ptr eax]
cmp bl,61h
jl k3
cmp bl,7Ah
jg k3
sub bl,20h
mov [eax],bl
k3:
cmp dl,cl
jz k2
jmp k1
k2:
mov eax,[offset regname+1]
xor edi,edi
xor ebx,ebx
xor esi,esi
mov bl,byte ptr [eax]
xor edx,edx
mov dl,[maxlen+1]
mov esi,edx
g1:
inc edi
mov ecx,edi
cmp ecx,esi
jge g2
mov edx,edi
xor eax,eax
push ebx
lea ebx,offset [regname+ecx+1]
mov al,byte ptr[ebx]
pop ebx
cmp eax,20h
jz g3
xor edx,edx
mov dl,al
mov eax,ebx
xor eax,edx
mov ebx,eax
g3:
jmp g1
g2:
mov ah,09h
mov dx,offset regcode
int 21h
mov ecx,ebx
imul ecx,ebx
imul ecx,ebx
imul ecx,ebx
imul ecx,ebx
imul ecx,ecx,1Dh
sub ecx,62h
mov eax,ecx
xor edx,edx
mov ecx,63h
div ecx
mov eax,edx
xor edx,edx
mov ecx,0Ah
div ecx
add eax,30h
add edx,30h
mov ecx,eax
mov al,dl
mov ah,0Eh
mov bx,0
int 10h
mov ah,09h
mov dx,offset reg2
int 21h
mov al,cl
mov ah,0Eh
mov bx,0
int 10h
halt:
mov ah,4Ch
int 21h
napis db '_ _ _ _ _ _ _ _ _ _ _',0dh,0ah
db '_ MP3 CD Maker 1.10 - KeyGen _',0dh,0ah
db '_ by sIR tHomasRE _',0dh,0ah
db '_ _ _ _ _ _ _ _ _ _ _',0dh,0ah
db 'GREETZ to Monter,Maks & <<EMO>>',0dh,0ah
db 'Enter your name : $'
regcode db 0dh,0ah,'Your code : xxxxxx$'
reg2 db 'xx$'
maxlen db 16h
regname db 10h dup (0)
end start
Jesli macie jeszcze jakies pytanie dotyczace zabezpieczenia programu, piszcie :sirthoma@box43.gnet.pl
GREETZ to Monter,Maks & <<EMO>>