MP3 CD Maker 1. by sIR tHomasRE

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, 00000263
I 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 poprawnosci
Patch :
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>>