Hogyan törjünk fel egy programot ?
avagy
"Valahogy ezt is el kell kezdeni!"

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

Tartalomjegyzés:
1. Mi AZ a (crack) progrram feltörés?
2. MiÉRT tör fel az ember programot?
3. MiLYEN programokat lehet feltörni?
4. MiKOR érdemes egy programot feltörni?
5. Mi KELL a feltöréshez?
6. HoL találhatók ezek a programok?
7. HoGYAN kezdjünk hozzá?
8. HoGYAN írjunk patch programot?
9. SZóMAGYARÁZAT, avagy angolul tudni kell!
10. BEVÉGEZVE a NAGY MÛ (Köszönet meg ilyesmi.)!

1. Mi az a (crack) program feltörés?
Program feltörés alatt azt értjük, hogy egy adott futtatható program bináris kódját úgy változtatjuk meg, hogy a program futtatható marad, csak néhány funkció amit nem lehetett elérni benne, a módosítás után elérhetõ lesz.

2. MiÉRT tör fel az ember programot?
 - unja a program  hülye  shareware  (*01)  tiltásait,  dialógusait,
 - érdekli a windows alatti assembly (ilyen  NiNCS, vagy  csak  én nem tudok róla?!?!),
 - unatkozik, és szeretne valami olyat csinálni, amivel másoknak is jót tesz (Magyarul szórakozásból!).

3. MiLYEN programot lehet feltörni?
Csak olyan programot, amiben  benne  van a letiltott funkció, de csak egy  adott kód beírása, vagy  adott file megléte esetén mûködik.

4. MiKOR érdemes egy programot feltörni?
Általában olyan programot érdemes feltörni, amihez még nincs crack (*02) program, vagy nincs még hozzá kulcsgenerátor (*3), vagy maga a regisztréciós kulcs (*04).

5. Mi KELL a feltöréshez?
A legfontosabb  program, ami minden  cracker-nek (*05) meg  kell hogy legyen a  NuMega  cég SoftIce, nevû DOS, Windows 3.11, Windows95, Windows95 /9X futó debugger (*06) programja. Nem hiányozhat még az URSoft WDasm32  nevû Windows 95 alatt futó dissasembler ( *07) programja. Szintén jól jöhet Liu Tao Tao "TR for Win95" debugger programja. Ha a program be van tömörítve valamilyen .EXE tömörítõvel (*08) vagy .EXE kódolóval (*09) akkor nagy segítség lehet a G-ROM és
társai által fejlesztett ProcDump32 v1.3 univerzális .EXE kitömörítõ. Jól jöhet a  Windows9X rendszer  alatt a  következõ két program: a Shetef Solution cég Win-eXpose-Registry nevû programja, ami a Windows rendszer Registry (*09) állomány módosítását, olvasását, hozzáférését naplózza, és  a Yonath  Dascalu  nevéhez kötõdõ Win-eXpose-I/O  nevû program, ami a Windows9X rendszer alatt történõ mindennemû I/O mûveletet (lemez írást, olvasást, nyomtatást, komunikációt) naplózza. Ha Visual Basic-ben írták a programot, akkor a DoDi's Dissasembler nevû programja kell, ami Visual Basic v3.0 .EXE  állományokat tud visszafejteni Basic forráskóddá. A v4.0 VB-hez is van  visszafejtõ program, de az sajnos nem olyan jó és megbízható mint az elõzõ! MS-DOS alatt csak egy debugger, kell pl: a Borland cég Turbo Debugger vagy a NuMega cég SoftIce v2.28-as verziószámú DOS-os debuggere. És természetesen megtalálható DOS alatt is dissasembler ez a Sourcer nevû program. Található univerzális .EXE kitömörítõ program is ennek pedig JVP a készítõje  és TEU  a neve. Még meg kell említenem egy elmaradhatatlan segítõtársakat,  a hexa szerkesztõket. Win9X alatt kíválóan alkalmazható a HexWorkshop nevû program, DOS alatt pedig ajánlott a HIEW nevû program használata.

6. HoL találhatók ezek a programok?
SoftIce:
http://www.numega.com
WDasm32:
http://www.ursoft.com
TRW95:
http://www.netease.com/~ayliutt
Turbo Debugger:
http://www.borland.com ?????
ProcDump32:
http://www.suddendischarge.com
Sourcer: http://???
TEU:
http://members.xoom.com/teu
WxR95:
http://www.shetef.com
WxI95: http://???
HexWorkShop:
http://www.bpsoft.com
HIEW:
ftp://ftp.bke.hu/pub/mirrors/sac/utilprog/hievX.ZIP

7. HoGYAN kezdjünk hozzá?
Az elsõ példám egy jól ismert program, a QuickView Plus 4.0-ás verziója. Ezt a programot felesleges debuggolni, mert egyszerûbb a WDasm32 programot használva feltörni a programot. Elõször el kell indítani az ORDER32.EXE programot, ami a Quick View Plus program könyvtárában van. Rá kell kattintani  a "Single User License" gombra, utána rá kell kattintani az "ACCEPT"-re, és el kell fogadni a telefonon keresztüli kódot ("UNLOCK BY PHONE"). Ezután megjelenik egy ablak, ahol be kell irni a kódot. Ide kell irni bármilyen kódot, ami eszedbe jut (én mindig azt szoktam hogy: !HPA!). Megjelenik egy hiba-üzenet, miszerint a kód hibás. Ezt a kódot fel kell írni valahova, vagy meg kell jegyezni, mert még szükségünk lesz rá. Ezután rá kell kattintani a CANCEL gombra, és kilépni a programból. Miután kiléptünk a programból, csinálni kell két másolatot a programról (ORDER32.EXE). Pl.:ORDER32_.EXE, és ORDER32.EX2. Ezután három file-unk van. Az elsõ lesz az eredeti, a második lesz az amit módosítunk, a harmadik pedig az, amit a WDasm32-vel dolgozunk. El kell indítani a WDasm32.EXE-t, és a "Dissasembler" menüben levõ "Open file to dissasemble" menüpont-ban be kell hívni az ORDER32.EX2 exe-t. Miután visszafejtette a kódot rá kell kattintani a "String Data Reference" gombra. Miután bejöttek a string referenciák, meg kell keresni az elõzõekben említett hibaszöveget "You  have  entered  an incorrect  code. Please  check  your entry". Erre rá kell kattintani, és a megfelelõ kódrészletre ugrik a program. Be kell zárni a SDR ablakot. Miután oda ugrott a program, akkor ha minden igaz, ezt fogjuk látni:

* Possible reference to String Resource ID=00041: "You have entered..
:004049F8 6A29             push 00000029
:004049FA FF353CCE4000     push dword ptr [0040CE3C]

Ezután meg kell keresni azt a pontot, ahol valamilyen ellenõrzés van.

Pl.:

CMP

compare - összehasonlítás

JNE

jump if not equal - ugrás ha nem egyenlõ

JE

jump if equal - ugrás ha egyenlõ

TEST

teszt - tesztelés

Felfele kell menni és figyelni, hol látunk ilyen utasítást. Nem is messze az elõbbi ponttól meg is találjuk ezt:

:004049CD 755A             jne 00404A29
* Possible reference to String Resource ID=00032: "You must select...

:004049CF 6A20             push 00000020
...
...
* Possible reference to String Resource ID=00040: "Unlock Error"

Mostmár tudjuk hogy hol van az a pont, ahol  ellenõrzi a kódunkat, és ha rossz, akkor ugrik. Ezután már csak annyit kell tennünk, hogy az ugrást ki kell cserélni (gyengébbek kedvéért JNE-t JE-re). Ellenõrizd, hogy a zöld csík a

:004049CD 755A jne 00404A29

sztringen van e, hogyha ott van, akkor látni fogjuk, az offset-ét a kódnak alul körülbelül így: @Offset 00003DCDh. Mostmár azt is tudjuk hogy hol kell módosítani az file-unkat. Be kell hívni egy jó  HEXA szerkesztõt, pl.: HexWorkShop-ot. A HWS-ba behívjuk az ORDER32_.EXE nevû file-t, és az Edit menü Goto.. menüpontja segítségével odamegyünk az adott offszetre. Ott ezt fogjuk látni.

00003DCD 755A 6A20 FF15 .... ....

Tudni kell hogy a JNE hexa kódja 75, a JE kódja 74, a  JMP kódja  EB. Most ki kell cserélnünk a 755A-t 745A-ra. Ez így jó is lenne, mert a program ha hibás adatot írunk be, akkor jónak fogja tekinteni, és elfogadja. De mi van, hogyha esetleg késõbb hozzájutunk egy jó kódhoz? Tehát nem feltételes ugrásra kell kicserélni, hanem feltétel nélkülire. Ezt úgy tehetjük meg, hogy a 755A-t EB5A-ra cseréljük. Ezután a File menü Save menüpontjára megyünk, és elmentjük a változtatásokat. Ezután a program mindig arra a pontra fog ugrani, ahol elfogadja a kódunkat, legyen  az jó, vagy  rossz  kód. Ha most elindítjuk az ORDER32_.EXE állományt, és beütünk akármilyen kódot, akkor a program elfogadja és gratulál nekünk. Ime, feltörtünk egy programot kb. 5 perc alatt. Ezután már csak közzé kell tenni  a nagy nyilvánosságnak, hogy mi csináltunk egy ilyen feltörést. De ezt hogyan csináljuk ? Ugyebár nem lehet  azt mondani, hogy : " Emberek, a Quick View Plus v 4.0 programot úgy lehet feltörni, hogy megkeresed a 00003DCD offszet címet az ORDER32.EXE-be, és kicseréled azt a X byte Y byte -ra! ". Hát ez eléggé hülyén hangzik! Van ennél sokkal szebb megoldás is. Irni kell egy patch (*10) programot. Én általában assembly-be írom  meg, de most az  egyszerûség kedvéért Turbo Pascal nyelven készítjük el a patch programot ( Pár érv, ami miatt a Pascal nyelvre voksolok: Sok embernek megvan, egyszerû a file kezelés, gyorsan fordít, szeretem!). Természetesen egy jól megírt ASM program ezerszer jobb, de sok ember nem ért hozz annyira, vagy lusta leülni , és assembly  kódot pötyögni két  napon keresztül !

8. HoGYAN írjunk patch programot?
Ime a Turbo Pascal forráskód:

Program QuickViewPlus_patch;
Var F:File;
    B:Byte;
Begin
     WriteLn('QuickView Plus v4.0 crackpatch by Lukundoo [HPA]');
     Assign(F,'ORDER32.EXE'); (*Megnyitjuk a file-t.*)
     {$i-}
     ReSet(F,1);    (*Itt nyitjuk meg... :)*)
     {$i+}
     If IOResult<>0 Then (*Ha nem sikerült megnyitni...*)
     Begin
          WriteLn('þ the file ORDER32.EXE not found!');
          Halt;     (*...akkor kilépünk!*)
     End;
     WriteLn('þ searching invalid bytes... ;P');
     Seek(F,$3DCD); (*Odaugrunk a file-ban a 3DCD offszetre...*)
     B:=$EB;        (*B értéke az JMP utasítás lesz*)
     BlockWrite(F,B,SizeOf(B)); (*...és beleírjuk az EB hexa kódot!*)
     Close(F);      (*Bezárjuk a file-t!*)
     WriteLn('þ done!');
End.

Ezt a forráskódot lefordítva kapunk egy kb. 3200 byte-os kódot, amit betömörítve kb. 2000 byte-ra  össze lehet zsugorítani. Ez egy elég kellemes méret, de ezt még lehet fokozni! Mivel sok idõm volt, így az assembly kódot is idebiggyesztem:

.8086
.model tiny
assume cs:code,ds:code,es:code
segment code
org 100h
start:                       ; itt indul a program
 mov dx,offset intro     
 mov ah,9                
 int 21h                     ; kiiratjuk a kezdõ szöveget
 mov ax,3d02h
 mov dx,offset fileName      ; megnyitjuk a file-t
 int 21h
 mov handle,ax
 cmp ax,02h
 je filedontexist            ; ha nem sikerült megnyitni akkor...
write:                       ; módosítjuk a file-t
 mov bx,handle
 mov cx,0000h
 mov dx,3DCDh                ; odamegyünk a file-ban a 3DCD offszetre
 mov ax,4200h
 int 21h
 mov cx,patchl
 mov dx,offset patchb        ; és beleírjuk a EB hexa kódot
 mov ah,40h
 mov cx,01h
 int 21h
 mov dx,offset cracked
 mov ah,9                
 int 21h                     ; kiirjuk a záró szöveget
exit:                        ; ...kilépünk
 mov ah,3eh                  ; de elõtte bezárjuk a file-t
 int 21h
 mov ax,4c00h                ; ‚é itt lépünk ki
 int 21h
filedontexist:
 mov dx,offset notfound      ; ...kiirjuk a szöveget és...
 mov ah,9                 
 int 21h                  
 jmp short exit
patchl equ 6                 ; kell egy kis memóriát lecsippenteni
handle dw ?                  ; file kezelõ (WORD tipusú)
intro db "QuickView Plus v4.0 crackpatch by Lukundoo [HPA]$"
filename db "ORDER32.EXE",0  ; a file neve
notfound db 0dh,0ah,"þ the file ORDER32.EXE not found!$"
cracked db 0dh,0ah,"þ done!$"
patchb db 0EBh,0             ; hexa EB amit beleírunk a file-ba
ends code                    ; lezárjuk a kódszegmens-t
end start                    ; befejezzük a progit

Ha ezt lefordítjuk TASM.EXE /m50 PATCH.ASM majd , TLINK /t PATCH.OBJ, akkor szembeötlõ lesz a  külömbség az elõzõ programmal szemben, mert ez a program lefordítva csupán 187 byte hosszú, amit már nem érdemes betömöríteni, mert nagyobbb lesz mint az eredeti. A külümbség a Pascal és az Assembly program között csupán 3000 byte. Tehát levonva a konklúziót érdemes patch programokat assembly nyelven megírni. Ezekben a programokban nincs file ellenõrzés! Illik beleírni egy CRC vagy valamilyen hasonló ellenõrzést, de ha mást nem, akkor legalább egy file méret ellenõrzést, hogy egy ujjabb verzió esetén ne csináljon a patch programunk galibát. Ugyanis  egy másik programban már biztos, hogy nem ugyan ott lesz az a kicserélendõ byte, ahol most van. Pascal nyelvben  elég  könnyû file-hossz ellenõrzést  végezni:

       FS:=FileSize(F);
       If FS<>Eredeti Then WriteLn('þ filesize does not match!');

Assemblyben már egy kicsit nehezebb:

filelength proc near
 mov ah,42h                   ; file méretének lekérdezése
 mov al,02h
 mov bx,[FileHandle]          ; file kezelõ BX-be
 xor cx,cx                    ; CX-et nullázuk
 xor dx,dx                    ; DX-et is
 int 21h
 mov word ptr [filelengthlow],ax  ; fll-ba a file méret alsó byte-ja
 mov word ptr [filelengthhigh],dx ; flh-ba pedig a felsõ byte-ja
 mov ax,word ptr [bp+si]          ; ax-be a nyitott file mérete
 cmp word ptr [filelengthhigh],ax ; flh-t összehasonlítjuk AX-el
 jne hiba                     ; ha nem jó akkor ugrunk a hibaüzenetre
 add si,2
 mov ax,word ptr [bp+si]
 cmp word ptr [filelengthlow],ax  ; fll-t hasonlítjuk most össze
 jne hiba                     ; nem jó, ugrunk

 add si,2                                   &n bsp;   
 ret                          ; vége a procedurának
wrongsize db "þ filesize does not match!",13d,10d,"$"
hiba:
 mov ah,9
 mov dx,offset wrongsize      ; kiirjuk a hibaüzenetet
 int 21h
 jmp exit                     ; ugrunk a kilépésre

Hát ennyit még illett volna odabigyeszteni.

9. SZÓMAGYARÁZÓ, avagy angolul tudni kell!
(*01)
Shareware: Olyan  program, amit a szerzõ  elérhetõvé tesz mások számára, kipróbálás céljára, majd egy adott idõ után ( által ban 30 nap után) a programot (*11) regisztrálni kell, vagy le kell törölni a gép háttértárolójárol. Általában ezek a programok az indulásukkor, vagy valamilyen fontosabb mûvelet elvégzése elõtt figyelmeztetik a felhasználót arra, hogy a program shareware. Gyakran a program csak akkor válik teljes értékûvé, hogyha a program készítõjétõl megvásárolják a regisztrációs -kódot, -kulcsot, -file-t. Gyakran kihagynak fontosabb funkciókat a programból, amit csak a teljesértékûvé válás után tud a felhasználó elérni.

(*02) crack: Azaz törés, feltörés. Ezt a  szót használjuk, hogyha egy programmal úgy módosítunk egy másik programot, hogy az teljesértékûvé válik, nem lesz benne semilyen shareware limitáció,  korlátozás.

(*03) kulcsgenerátor:  olyan rövid program, ami egy adott program regisztrációs kulcsát (*04), jelszavát tudja generálni megadott névbõl, számból, vagy egyéb  adatból. Ez a visszafordított folyamata annak, ahogy a program ellenõrzi a regisztrációs kulcsot, szériaszámot.

(*04) regisztrációs kulcs: olyan szám vagy / és betûsorozat, amit a program készítõje  generál adott értékekbõl,  pl.: Név, Cím, E-mail. Ez a kód  egyénspecifikus,  nagyon ritka, hogy két embernek  ugyanaz legyen a kódja.

(*05) Cracker: Azaz törõ,  feltörõ. Olyan ember vagy csoport, aki(k) programokat visszafejt(enek), módosít(anak), majd azt a programot,ami módosítja az eredeti programot, ingyenesen a köznek felajánlja. :)

(*06) debugger: Azaz bogártalanító. :). Olyan program,amivel egy kész programot lehet futtatni, miközben a  program  assembly forráskódját lehet látni, módosítani futásidõben, memóriaterületet lehet megtekinteni, a regiszterek lehet módosítani. Általában a program eredeti forráskódját is belehet hívni, és lépésenként futtatni, majd a fellépõ hibát javítani.

(*07) disassembler: Azaz visszafejtõ. Olyan program, ami egy binárisállományt lefordít assembler kódra. Szántszándékkal irtam bináris-at, ugyanis ezek programok elvileg bármit vissza tudnak fejteni assembly forráskódd . Kezdve a programoktól, a digitális hangokon keresztül a  M$ -Word dokumentumokig.  Mindig  olyan  assembly  kódot generálnak, ami lefordítva ugyan azt a bináris állományt állítja elõ.

(*08) EXE tömörítés: olyan eljárás amely során a futtatható programot betömörítik, de tömörítés után  is  futtatható marad. Ezt úgy oldják meg, hogy a futtatható program elejére vagy végére betesznek egy olyan  kis ( általában assembly-be írt ) programot, ami a program indításakor lefut és kitömöríti a rendes programot  a memóriába, majd a regisztereket úgy állítja be, mintha az eredeti program futna, majd utána átadja a vezérlést az  eredeti programnak. Miután az eredeti program lefutott, kitörli magát a memóriából (Ez nem mindig csinálják meg a EXE tömörítõ program írói!). Legismertebb EXE tömörítõk: LZEXE, aPACK, UCEXE, PKLITE, UPX, PE-PACK, NeoLite,  Petite.  Természetesen léteznek COM program tömörítõk is, a mûködési elvük hasonló az elõzõekben leírtakhoz, csak a COM tömörítõknek nem kell foglalkozni a kód relokálásával. Ismertebb .COM  tömörítõk: 624, COMPACK, TinyProg.

(*09) EXE kódolás:  az eljárás hasonló az EXE tömörítéshez, csak itt nem tömörítik a programot,  hanem  valamilyen  bonyolult eljárással elkódolják úgy, hogy a program futtatható marad. Nagyon  gyakran az ilyen kódoló programokban megtalálható az úgynevezett antidebug (*11) é‚s antitracer (*12) kódok  is. Legismertebb EXE kódoló programok: GA,  PROTEXE,  EXECRYPT,  HackStop,  PE-Prot,  PE-Crypt,  PE-Guard. Természetesen léteznek COM kódolók is, ime néhány: COMCrypt, XcomOR, Mess, BinLock, Protect EXE/COM, iLUCRYPT.

(*10) patch program: Azaz foltozó program. Ez egy kicsi pár száz byte hosszú programocska (általában, de már láttam 800 kb-os patch progit is!), amit a cracker ír, és módosítja azokat a byte-okat a feltörendõ file-ban, ami miatt a program shareware-ként mûködik. Gyakran lekódolják ezeket a programokat valamilyen COM kódolóval, hogy senki- se tudja átirni a saját nevére. Mostanában  látni patch generáló programokat is, aminek meg kell adni az eredeti és a tört file nevét, a program  összehasonlítja õket, és készít egy COM állományt, ami már rögtön indítható is. Sõt, lehet olyan programot is találni, ami pascal, assembly, basic, vagy c++ forráskódot generál, és csak le kell  fordítani és kész van a  saját crack program. Ilyen  pl.: DIFF v1.4, HPA_MCRK.EXE (Saját fejlesztés! Ha valakit érdekel, akkor írjon egy levelet nekem és elküldöm.).

(*11) antidebug kód: Azaz debug ellenes kód. Olyan kód, ami ha valaki debuggolni akarja  a  programot,  akkor észleli, és vagy valamilyen hibaüzenettel leáll, vagy lefagyasztja a számítógépet. Sok ilyen kód forog közkézen, a legismertebb  a Christoph  Gabler által készített INSIDER.FAQ, valamint Ralph Roth által készíett ANTIDBG.FAQ (Ebben nem vagyok teljesen biztos, hogy ez a neve!).

(*12) antitracer kód: ugyan  az, mint  az antidebug kód, csak tracer-eléskor jön elõ.


9. BEVÉGEZVE a NAGY MÛ (KöszöNET meg ilyesmi.)!

Szeretnék köszönetet mondani azoknak az embereknek, akik  ebben a doksiban névszerint  szerepelnek, vagy csak programjaik szerepelnek:

Molnár László (Az UPX program fejlesztõje.)
Markus F.X.J. Oberhumer (Szintén az UPX program fejlesztõje.)
Riz la+ és Stone (A ProcDump fejlesztõi)
Joergen Ibsen (Az aPACK fejlesztõje)
Az egész HPA csapatnak, akik olyan lusták mint a bûn! És  mindenki másnak,  aki felismerte  a  programja  nevét ebben  a doksiban.

Lukundoo [HPA]
1999. jan. 14.