Hogyan törjünk fel egy programot ?
avagy
"Egy buta védelem a készítõket égeti!"

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

Tartalom jegyzék:
1. MiRöL LESZ ma szó?
2. Mi KELL hozzá?
3. HoGYAN kezdjünk hozzá?
3. KéSZíTSÜNK patch programot!
4. Mi KÖVETKEZIK ezután?
5. KöSZöNeT!


1. MiRöL LESZ ma szó?
A mai menü, a HexWorkShop v2.54 program, amivel hexadecimálisan lehet szerkeszteni bármilyen file-t. A programban különbözõ funkciók le vannak tiltva addig, amíg nem regisztrálják.Ekkor jövünk mi CRACKEREK!

2. Mi KELL hozzá?
Kell hozzá a Hex WorkShop v2.54-es program, a WDasm32 nevü progi, és a Mnemonix nevü program,  és egy Turbo Pascal fordító program is.

3. HoGYAN kezdjünk hozzá?
Elindítva a programot  elsõre, megjeleni egy képernyõ, ami értesíti a tisztelt felhasználót, hogy a program bizony regisztrálatlan,  és jó lenne, valamit  tenni  ellene ( REGISZTRÁLNI KELLENE!!! ). És ezután mindig ott lesz  egy  menüpont, aminek az a neve hogy: "Demonstration Version". Ez így elég ciki, mit gondolnak a haverok, etc, etc........ Ilyenkor jön jól a WDasm32 nevü program. Indítsuk el a HWS-ot, és kattintsunk rá a "Demonstration Version" nevü menüre. Bejön egy ablak, ahol közli velünk hogy hányas verziójú a program, ki készítette, és természetesen egy ablak a regisztrációnak! Rögtön  írjunk be valami hülyeséget a regisztrációs ablakba, majd nyomjuk meg az OK gombot. Hoppá! Kiírta, hogy: "You have  entered an invalid  number!". Hát ez bizony ciki! (Ha valakinek nem ezt írta ki,akkor az piszok szerencsés, vagy van szériaszáma a HWS-hoz ! ). Ezt  a  szöveget  meg  kell jegyeznünk  magunknak,  mert  a késöbbiek  során még hasznát vesszük. Indítsuk el a WDasm32-t és hívjuk be a Hworks32.exe-t. Ezután rá kell keresni arra a string-re, amit már elõbb megjegyeztünk magunknak. Meg is van, látjuk, hogy egy dialógusablakban található a szöveg:
Name: DialogID_0075,# of Controls=003,Caption:"Registration Unsuccessful",ClassName:"" 001-ControlID:FFFF,Control Class:"STATIC" Control Text:"You have entered an invalid registration number." Ezután rákattintunk a Refs menü Dialog References pontjára, és rögtön megjelenik egy ablak, ahol a dialógus ablak referenciák vannak. Itt kellene  nekünk  megkeresni  azt, hogy "Dialog: DialogID_0075". Ha ez megvan, akkor rá kell kattintani. Oda ugrik, ahol  ezt a dialógus ablakot felhasználja a  program. Sajnos  ilyen kettõ is van, tehát nehezebb dolgunk lesz. Elõször ugorjunk az elsõre.

:00409D7D 6A00                    push 00000000
:00409D7F 6A00                    push 00000000

* Possible Reference to String Resource ID=00001: "Hex Workshop Version 2.54"
                                  |
:00409D81 6A01                    push 00000001

* Possible Reference to Dialog: DialogID_0075
                                  |
:00409D83 6A75                    push 00000075

Megvan ez  elsõ! Most meg kell keresni, hogy hol van valamilyen ellenörzés, vagy ugrás a kódban. Ahogy  megyünk felfele, találunk valami érdekeset, egy ugrást erre a kódra:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409C99(C)

Ha ez megvan, akkor rögtön oda kell menni a ":00409C99" helyre, és megnézni, hogy milyen ugrás van ott:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409C89(U)
|
:00409C95 837DEC00                cmp dword ptr [ebp-14], 00000000
:00409C99 0F8479000000            je 00409D18
:00409C9F 8B8DFCFEFFFF            mov ecx, dword ptr [ebp+FFFFFEFC]
:00409CA5 83C15C                  add ecx, 0000005C

Nahát, milyen érdekes dologra bukkantunk, egy ugrásra, ami akkor történik, hogyha az "EBP-14"-re mutató pointer értéke 0-val lesz egyenlõ. Álljunk rá a zöld csíkkal erre az utasításra, és alul a státuszvonalon megmutatja, hogy milyen offszet-en van ez az utasítás. Rögtön fel kell írni ezt a számot ":00009099". Most menjünk rá megint a dialógusablak referenciára, és csináljuk  meg újra ugyanezt a progcedurát, de most ha megtalálta az elsõ "DialogID_0075"-ra való hivatkozást,  akkor kattintsunk rá  mégegyszer. Erre tovább ugrik a következõ hivatkozásra.

* Possible Reference to String Resource ID=00001: "Hex Workshop Version 2.54"
                                  |
:0042639B 6A01                    push 00000001

* Possible Reference to Dialog: DialogID_0075
                                  |
:0042639D 6A75                    push 00000075

Ime még egy hely, ahol ezt a dialógus ablakot használják. Mi ugyebár nem tudjuk, hogy melyik az igazi, ezért midkettõt le kell ellenõrizni. Ugyanúgy, mint elõbb, itt is meg kell nézni, hogy van e valamilyen ellenõrzés, vagy ugrás ez elõtt. Ha elindulunk felfele, akkor találunk is egyet:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004262B3(C)
|
:00426332 E869C4FDFF              call 004027A0
:00426337 89850CFFFFFF            mov dword ptr [ebp+FFFFFF0C], eax
:0042633D 8B850CFFFFFF            mov eax, dword ptr [ebp+FFFFFF0C]

Most már tudjuk, hogy mit kell tenni, oda kell menni a "004262B3" -ra, és megnézni, hogy mi van ott.

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004262A3(U)
|
:004262AF 837DEC00                cmp dword ptr [ebp-14], 00000000
:004262B3 0F8479000000            je 00426332
:004262B9 8B8DFCFEFFFF            mov ecx, dword ptr [ebp+FFFFFEFC]


3. KéSZíTSÜNK patch programot!
Milyen érdekes, de majdnem szószerint ugyan arra a kódra találtunk rá, mint az elõbb. Megint menjünk rá a zöld csikkal a "JE" utasításra, és megjelenik alul megint, hogy milyen offszeten van ez a kód. Ezt is fel kell írni  ":000256B3", mert ebbõl csinálunk patch progit. (Gyakran itt hibáznak a kezdõk, mert nem a státuszsorban levõ számot írják le, hanem ami az utasítás mellett van. Az rossz! ) Miután ezzel megvagyunk, ellenõrizni kell, hogy van-e még hivatkozás erre az ablakra a programban. Ezt úgy tehetjük meg, hogy a Dialog References-ben rákattintunk párszor a "Dialog: DialogID_0075"-re, és ha csak ugyanarra a két helyre ugrik, akkor nincs több hivatkozás. Mostmár tudjuk azt a két helyet, ahol a kód ellenõrzése van. Most már csak azt kellene tudni, hogy hogyan kéne módosítani úgy, hogy a kódot elfogadja a program. a JE ugrást kell kicserélni JNE-re! Ezután már bármit beírhatunk kódnak, a  program el fogja fogadni. De itt van a probléma, honnan tudjam én, hogy mi a "JNE" kód hexadecimális értéke. Ilyenkor jól jön egy kis program, aminek a neve Mnemonix. Ebben a programban az  összes opkódnak a hexa értéke benne van. Ha elindítjuk és odamegyünk a "JE" -hez, akkor láthatjuk,  hogy a kódja 0F84, míg a "JNE" kódja 0F85. És innen már semmi nehézségünk nincs. Csak a megfelelõ helyre kell odamennünk, és kicserélni a "JE"-t "JNE"-re. Hogyan is csináljuk ezt? Tudjuk, hogy hol helyezkedik el a két JE kód, és azt is tudjuk, hogy mi a JNE kód hexa kódja. Ezek a 00009099 és a 000256B3 offszete helyezkednek el. Írni kell egy programot, ami megkeresi ezeket a helyeket, és kicseréli a JE-ket JNE-re. Lássunk hozzá. Én Turbo Pascal nyelvben írom meg a progit, ha valaki türelmes, akkor megírhatja C++, assembly, vagy Basic nyelven is. Íme a forráskód:

Program PatchForHexWorkShop_v254;

Const Where:Array[1..2] Of LongInt=($00009099,$000256B3);
Var F:File;
    Code,I:Word;
Begin
     WriteLn('Hex WorkShop v2.54 regpatch by Lukundoo [HPA]');
     If ParamCount>0 Then
     Begin
          If ((Pos('U',ParamStr(1))>0) Or (Pos('u',ParamStr(1))>0)) Then
          Begin (*Vissza tudjuk állítani*)
               WriteLn('þ unpatching the file...');
               Code:=$0f84; (*Csak ezt cseréljük ki*)
          End;
     End
     Else
     Begin
          WriteLn('þ patching the file...');
          Code:=$0f85;
     End;
     Assign(F,'HWORKS32.EXE');
     {$I-}
     ReSet(F,1);
     {$I+}
     If IOResult<>0 Then
     Begin
          WriteLn('þ error opening the file HWORKS32.EXE');
          Halt;
     End;
     If FileSize(F)<>678912 Then
     Begin
          WriteLn('þ the file size doesn''t match!');
          Close(F);
          Halt;
     End;
     WriteLn('þ searching invalid bytes... ;p');
     For i:=1 To 2 Do
     Begin
          Seek(F,0);
          Seek(F,Where[I]);
          BlockWrite(F,Code,SizeOf(Code));
     End;
     Close(F);
     WriteLn('þ done!');
End.

4. Mi KÖVETKEZIK ezután?
Miután lefordítottuk a programot, be kell  másolni a HWS könyvtárába, és el kell indítani. Miután elindítottuk, és kiírta hogy "þ done!", akkor a célegyenesbe jutottunk! Indítsuk most el a HWS-ot, és klikk a "Demonstration Version" menüre, bejön az ablak, és  kéri a  széria-számot (Nem  Xénialázt!! ). Irjunk be bármilyen hülyeséget, mert bármilyen rossz szériaszámnak jónak kell lennie! Én azt írtam be hogy: !HPARuLEZ!. Kattintsunk most a Register gombra, és lássunk csodát, elõjön egy ablak, ami arra kér minket, hogy adjunk meg még pár fontos dolgot magunkról (Név, cégnév). Miután ezt beírtuk, Megköszöni, hogy megvásároltuk a programt, és csodák-csodája generál nekünk egy regisztrációs file-t, ami már a jó adatokkal van ellátva! Nincs semmi dolgunk ezután, mint letöltögetni az újabb verziókat, és ezt a file-t bemásolni a könyvtárába a Hex WorkShop-nak! Ezután már csak annyit kell tennünk, hogy elindítjuk újra a patch programunkat az "U" paraméterrel, és  visszaállítja az eredeti formájába  a programot.

5. KöSZöNeT!
Köszönetet szeretnék mondani mindazoknak, akik segítették a munkámat, és javaslatokkal láttak el. :)

Lukundoo [HPA]
1998. jan. 17.