Hogyan csináljunk kulcsgenerátort?
avagy
"Amit fel lehet törni, azt fel kell törni!"

Készítette: Lukundoo [HPA]
e-mail:
Lukundoo@SoftHome.Net
web:
http://welcome.to/hpa

Tartalom jegyzék:
1. HoGYAN kezdjünk hozzá?
2. KiTÖMÖRÍTÉS után.
3. AZ EGYSZERÛ Cracker és a profi Cracker közti különbség.
4. HoGYAN készítsünk kulcsgenerátort?
5. MÁRA ennyi!


1. HoGYAN kezdjünk hozzá?
Találtam egy programot az Intetneten, egy kicsike WAV, VOC lejátszó programot,  ami Sound Blaster  hangkártyán játsza le a file-okat. A program hangosan hirdeti, hogy shareware, tehát 30 nap után minden lejátszás elõtt kitesz egy ablakot, ami kiírja, hogy ez a program regisztrálatlan. Ugyebár ez egy nagyon idegesítõ dolog, ezért  utána kell nézni, hogy hogyan lehetne regisztrálni. A program könyvtárában találtam egy másik programot,  amivel a fõ programot lehet regisztrálni. De ha elindítottam, akkor a következõket írta ki:

                      Unable to register!

Hát ez ciki. Itt van a regisztráló program, és nem tudok vele mit kezdeni. Ilyenkor jön a segítségünkre az ExeScan nevû program. Ez a program megmondja, hogy milyen EXE tömörítõvel lett betömörítve a cél programunk. Ki is írta a következõket:

File:        SMREG.EXE
Structure:   MZ-EXE
Entry Point: 00000B0E
Compiler:    Unknown

Searching for known packers ... OK!
  > Name: LZEXE
  > Ver:  0.90/1.00a
  > Ofs:  00000B0E

Hát mostmár tudjuk, hogy  mivel lett betömörítve. De ugyebár így betömörítve még nehéz lenne debug-olni, ezért elõtte ki kell tömöríteni. Ehhez jól jön az UNP nevû program. Elindítva, és paraméterként megadva a file nevét, a következõ üzenetet kaptam:

UNP 4.12 Executable file restore utility, written by Ben Castricum

processing file : SMREG.EXE
DOS file size   : 3220
file-structure  : executable (EXE)
EXE part sizes  : header 32 bytes, image 3188 bytes, overlay 0 bytes
processed with  : LZEXE V0.91 or V1.00a
action          : decompressing... done
new file size   : 4048
writing to file : SMREG.EXE

processing file : SMREG.EXE
DOS file size   : 4048
file-structure  : executable (EXE)
EXE part sizes  : header 240 bytes, image 3808 bytes, overlay 0 bytes

2. KiTÖMÖRÍTÉS után.
Bingo! Sikerült kitömöríteni a file-t. Most már belenézhetünk a file-ba. Ahogy belenézünk, rögtön feltûnik egy szó: REGISTER.LIC. Hoppá! Ez mi lehet? Ugy tûnik, hogy ez egy file-név. Hozzunk létre egy ilyen file-t. Miután létrehoztuk, indítsuk el megint a programot. És lõn csoda, a program ezt írja ki:

Sound Machine v2.5 registration (c) 1996. by Albert Florecke
Enter Your password:

Ez egy gyakori móka a programíróknál, hogy egy file létezése esetén lehet csak a programot regisztrálni (lásd Zsebi v1.0, SM v2.5, etc..). Írjunk be bármit. A program erre kilép a következõ  hibaüzenettel:

Illegal password!

Hát ez így nem lesz jó. Sokáig kellene keresni a megfelelõ jelszót. De itt van a megoldás, a debugger  program. Tehát hívjuk be a Turbo Debugger-t, vagy bármilyen más debugger programot. A  File menü Open részével bejön egy ablak, ott meglátjuk a file-unk  nevét kattintsunk rá, és betölti a  programot. Ha minden jól megy, akkor kapunk egy ilyen képernyõt:

+-[x]-CPU 80486-------------------------------+-------1-[ ][ ]-+
|  cs:00F5 9A0000135A     call   5A13:0000    |  ax 0000   |c=0|
|  cs:00FA 55             push   bp           |  bx 0000   |z=0|
|  cs:00FB 89E5           mov    bp,sp        |  cx 0000   |s=0|
|  cs:00FD B80200         mov    ax,0002      |  dx 0000   |o=0|
|  cs:0100 9ACD02135A     call   5A13:02CD    |  si 0000   |p=0|
|  cs:0105 83EC02         sub    sp,0002      |  di 0000   |a=0|
|  cs:0108 BF5602         mov    di,0256      |  bp 0000   |i=1|
|  cs:010B 1E             push   ds           |  sp 4000   |d=0|
|  cs:010C 57             push   di           |  ds 59D2   |   |
|  cs:010D BF0000         mov    di,0000      |  es 59D2   |   |
|  cs:0110 0E             push   cs           |  ss 5B1D   |   |
|  cs:0111 57             push   di           |  cs 59E2   |   |
|  cs:0112 9A9D06135A     call   5A13:069D    |  ip 00F5   |   |
+---------------------------------------------+            |   |
|  ds:0000 CD 20 FF 9E 00 9A F0 FE xxxxxxxx   |            |   |
|  ds:0008 1D F0 E4 01 B3 26 AE 01 xxxxxxxx   +----------------+
|  ds:0010 B3 26 80 02 0E 21 7C 12 xxxxxxxx   |  ss:4002 0000  |
|  ds:0018 01 01 01 00 02 FF FF FF xxxxxxxx   |  ss:4000 0000  |
+---------------------------------------------+----------------+

Az F8 billentyûvel lehet a programot léptetni. Szépen elindulunk F8-al, és  elérünk addig a pontig,  ahol a program bekéri a jelszót:

+-[x]-CPU 80486-------------------------------+-------1-[ ][ ]-+
|  cs:018F 57             push   di           |  ax 0008   |c=0|
|  cs:0190 BF5200         mov    di,0052      |  bx 02D6   |z=0|
|  cs:0193 1E             push   ds           |  cx 00F7   |s=0|
|  cs:0194 57             push   di           |  dx 5ACB   |o=0|
|  cs:0195 B8FF00         mov    ax,00FF      |  si 0008   |p=0|
|  cs:0198 50             push   ax           |  di 0053   |a=0|
|  cs:0199 9A3506145A     call   5A14:0635    |  bp 3FFE   |i=1|
|  cs:019E 9A9D05145A     call   5A14:059D    |  sp 3FF8   |d=0|
|  cs:01A3 9A9102145A     call   5A14:0291    |  ds 5ACB   |   |
|  cs:01A8 A05200         mov    al,[0052]    |  es 5ACB   |   |
|  cs:01AB 8846FF         mov    [bp-01],al   |  ss 5B1E   |   |
|  cs:01AE B001           mov    al,01        |  cs 59E3   |   |
|  cs:01B0 3A46FF         cmp    al,[bp-01]   |  ip 019E   |   |
+---------------------------------------------+            |   |
|59D3:0000 CD 20 FF 9E 00 9A F0 FE xxxxxxxx   |            |   |
|59D3:0008 1D F0 E4 01 B4 26 AE 01 xxxxxxxx   +------------+---+
|59D3:0010 B4 26 80 02 0F 21 7D 12 xxxxxxxx   |  ss:3FFA 5ACB  |
|59D3:0018 01 01 01 00 02 09 FF FF xxxxxxxx   |  ss:3FF8 02D6  |
+---------------------------------------------+----------------+

Ha most tovább lépkedünk, akkor eljutunk egy olyan pontig,  hogy

+-[x]-CPU 80486-----------------------------------ds:0254 = 01+
|  cs:01BA FE065402       inc    byte ptr [0254]              |
|  cs:01BE A05402         mov    al,[0254]                    |
|  cs:01C1 30E4           xor    ah,ah                        |
|  cs:01C3 8BF8           mov    di,ax                        |
|  cs:01C5 8A855200       mov    al,[di+0052]                 |
|  cs:01C9 30E4           xor    ah,ah                        |
|  cs:01CB 8BD0           mov    dx,ax                        |
|  cs:01CD A05302         mov    al,[0253]                    |
|  cs:01D0 30E4           xor    ah,ah                        |
|  cs:01D2 03C2           add    ax,dx                        |
|  cs:01D4 A25302         mov    [0253],al                    |
|  cs:01D7 A05402         mov    al,[0254]                    |
|  cs:01DA 3A46FF         cmp    al,[bp-01]                   |
|  cs:01DD 75DB           jne    01BA                         |
|  cs:01DF 803E5302FE     cmp    byte ptr [0253],FE           |
+-------------------------------------------------------------+

Itt azt látjuk, hogy  a "cs:01DD 75DB jne 01BA" utasítás addig tart, amennyi betût beütöttünk.  Tehát ez lehet a szériaszám magja, ahol kiszámolja a szériaszámot. Mit is csinál ez a kis rész: a [0254]-ben tárolódik az aktuális pozíció, a "cs:01C5  8A855200 mov al,[di+0052]" utasítás al-be teszi az aktuális pozícióhoz tartozó betût, majd dx-be teszi az értéket. Ezután al-be tesz egy értéket ami feltehetõleg már egy létezõ érték "cs:01CD A05302 mov  al,[0253]". Ezután ax-et és dx-et összeadja, és beleteszi az alsó byte-ját [0253]-ba. Ezután al-be beleteszi az aktuális poziciót, és  ellenõrzi, hogy nincs-e még a sztring végén "cs:01DA 3A46FF cmp al,[bp-01]". Ha a nincs még a végén, akkor vissza ugrik 01BA-ra. Ha a végén van, akkor van egy ellenõrzés, ami  [0253]  értékét összehasonlítja hexa FE-vel. Ha egyenlõ a két érték, akkor ugrik, ha nem, akkor megy a hibaüzenetre.

+-[x]-CPU 80486-----------------------------------ds:0253 = 8-+
|  cs:01DF 803E5302FE     cmp    byte ptr [0253],FE           |
|  cs:01E4 7426           je     020C                         |
|  cs:01E6 BFD603         mov    di,03D6                      |
|  cs:01E9 1E             push   ds                           |
|  cs:01EA 57             push   di                           |
|  cs:01EB BF7400         mov    di,0074                      |
|  cs:01EE 0E             push   cs                           |
|  cs:01EF 57             push   di                           |
|  cs:01F0 31C0           xor    ax,ax                        |
|  cs:01F2 50             push   ax                           |
|  cs:01F3 9A7006145A     call   5A14:0670                    |
|  cs:01F8 9ADD05145A     call   5A14:05DD                    |
|  cs:01FD 9A9102145A     call   5A14:0291                    |
|  cs:0202 31C0           xor    ax,ax                        |
|  cs:0204 9A1601145A     call   5A14:0116                    |
+-------------------------------------------------------------+

Az  egyszerû cracker ilyenkor fogja,  és a " je 020C " utasítást kicseréli " jmp 020C " utasításra. Ez  így nagyszerû , és müködik is, mert ha kicseréltem, akkor ezt írja ki:

Thank You for support!
Please enter Your name:

3. AZ EGYSZERÛ Cracker és a profi Cracker közti különbség.
Beírtam a nevemet, és csinált egy file-t, aminek SMACHINE.KEY a neve. De  miután futtattam a  Sound Macine programot, azt írta ki, hogy

Invalid key, continuing Shareware!

Hát ez ciki... Most mit tegyek, fel kell törnöm a Sound Machine-t is? Nem!  Inkább ki kellene találni  hogy milyen kódot fogad el a regisztráló program. Azt már tudjuk, hogy a végeredményt hasonlítja össze 00FEh-val. De hogy jutunk el a végeredményig? Ime a sematikus leírása Turbo Pascal-ban:

For i=1 to hossz(bekértregisztrációskód) do
begin
     érték:=éréték+másikérték;
end;
if érték=$FE then jóazeredmény else rosszazeredmény;

De mi lehet az a másik érték? Az az érték a karakter szám értéke. Íme ,most már tudjuk, hogy hogy mûködik az algoritmus:

For i=1 to hossz(bekértregisztrációskód) do
begin
     érték:=érték+Ord(bekértregisztrációskód[i]);
end;
if érték=$FE then jóazeredmény else rosszazeredmény;

Most már csak olyan karakter sorozatot kell találni, aminek az értéke 00FEh azaz 254. Pl.: "ak2" mert a=97, k=107, 2=50. 97 + 107 + 50=254. Bingo! Íme itt van egy olyan kód, amivel lehetne regisztrálni a programot. Ki is próbáltam, és mûködött. De mivan, hogyha valakinek nem tetszik ez a kód.  Írni kell egy kulcs generáló programot. Én ezt úgy oldottam meg, hogy bekérek három számot, mert ugyebár a 9-es karakter értéke 57, 3x57 =171. 254 - 171 =83, Chr(83)=S, tehát ha három kilences add meg,akkor ki kell egészíteni még egy S betûvel, és kész van a saját széria száma, ugyanez az 1-es számmal: 1 értéke 49, 3x49=147, 254-147=107, Chr(107)=k, ha pedig három egyest üt be, akkor pedig egy k betûvel kell kiegészítenem, és kész a regisztrációs szám.

4. HoGYAN készítsünk kulcsgenerátort?
Kulcsgenerátort nem érdemes assembly-be megírni, mert túl sok munka van vele egy olyan embernek,  aki nem  teljesen profi. Érdemesebb valamilyen magasabb szintû nyelvhez nyúlni, például Turbo Pascal, C++ , Basic?. Én  elõnyben részesítem a Pascal nyelvet az egyszerûsége miatt. Így hát Pascalban írom meg a programot, itt látható az eredmény

Program KeygenForSoundMachine_v25;

Var S:String; (*Ebbe a változóba kérjük be a számokat*)
    B,i:Byte;
    Code:Integer;
Begin
     WriteLn('Sound Machine reg key generator by Lukundoo [HPA]');
     Write('þ enter Your famous 3 number:');
     ReadLn(S); (*Bekérjük a számokat*)
     Val(S,I,Code);
     If Code<>0 Then (*Ellenõrizzük, hogy csak számokból áll-e?*)
     Begin         
          Writeln(' it''s not a real number!');
          Halt;
     End;
     If Length(S)<>3 Then (*Ellenõrizzük a méretét, méret=3!*)
     Begin
          WriteLn(' only 3 character!');
          Halt;
     End;
     B:=$0; (*B-t lenullázom*)
     For I:=1 To 3 Do
     Begin
          B:=B+Ord(S[i]);
     End;     
     WriteLn('Yor key is: ',S,Chr($FE-B));
     (*Az eredmény = bekért számok + 00FEh-Számokkarakterértékeinek*)
     (*összege!*)
End.

5. MÁRA ennyi!
Remélem eléggé  egyértelmû  volt a leírás. Ha valakinek problémája lenne vele, akkor nyugodtan írjon  nekem e-mail-t, a cím felül van! Üdvözlet Mindenkinek, aki segített engem, aki elolvasta ezt a doksit, és csatlakozni kíván a csapathoz, és aki nem akar annak is.

Lukundoo [HPA]
1999. jan. 15.