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.