Törjünk progit:-))))
Hogyan törjünk fel egy programot ?
avagy
"Valahogy ezt is el kell kezdeni!"
Tartalom jegyzék:
1. Mi AZ a (crack) program feltörés?
2. MiÉRT tör fel az ember programot?
3. MiLYEN programot 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á?
7. HoGYAN írjunk patch programot?
8. SZóMAGYARáZó, avagy angolul tudni kell!
9. 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 irtá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 irni 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 hiba
szö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ás. 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 csik 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 !
7. 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 ; és 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 típusú)
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önbsé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önbsé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 megirni.
Ezekben a programokban nincs file ellenörzés! Illik beleirni 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
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.
8. 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 be lehet 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 irt ) 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 ir, é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ány, 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ített 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]