Készítette: Lukundoo [HPA]
e-mail: lukundoo@beer.com
web: http://hpa.virtualave.net
Tartalomjegyzék:
1. Hozzávalók
2. Minden kezdet könnyû
3. Egy kis Win32 assembly
4. Végszó
1. Hozzávalók
Szükségeltetik hozzá a következõ programok:
Package for the WEB ami letölthetõ a http://www.instalshield.com-ról,
SoftIce v4.0 és HIEW ami letölthetõ a http://w3.swi.hu/toc
címrõl.
2. Minden kezdet könnyû
Csapjunk a sûrûjébe. Indítsuk el
a programot, majd megjelenik egy ablak, ami értesít minket
arról, hogy mennyi idõnk van még hátra. Ezen az
ablakon van egy olyan gomb hogy "Purchase" azaz vásárlás.
Ezután bejön mégegy ablak, ahol meg
lehet vásárolni a programot. Mit is láthatunk
az ablakban:
Registration number: 0000000000000000
Unlock Code:
User Name:
Company Name:
A regisztrációs kódot a program generálja nekünk, a feloldó kulcsot (Unlock Code) a cégküldi nekünk, a felhasználó nevet és cégnevet pedig nekünk kell megadni! Töltsük ki a mezõket, a feloldó kódhoz csak számokat írjunk. Miután megvagyunk vele, akkor nyomjuk meg a "CTRL-D" gomb kombinációt, és bejön a SoftIce ablak. Írjuk be hogy "BPX HMEMCPY". A Hmemcpy parancs akkor hajtódik végre, amikor bármilyen memória másolás történik. Ilyen például az az eset, amikor az ablakból beolvassuk a szöveget. Miután beírtuk, akkor nyomjunk F5-öt, és visszatérünk a SoftIce-ba. Nyomjunk rá az OK gombra. Miután rákattintottunk a regisztrációs ablak OK gombjára, rögtön visszatérünk a SoftIce-hez. Az ablak alján láthatjuk, hogy a KERNEL egyik utasítása a HMEMCPY. Nyomjuk meg az F12 gombot 8-szor, és odaérünk, ahol a program meghívta ezt az utasátást. Az utasítást érdekes módon nem a PFW hívta meg, hanem egy titokzatos "TL32V20" nevü program! Ha megnézzük, akkor láthatjuk, hogy ez egy DLL, azaz egy Dinamikusan szerkesztett könyvtár. Ezekben a DLL-ekben tárolnak el olyan jól használható procedurákat, amit több program is használ. Ezeket futás közben betölt aprogram a memóriába, majd miután használta, kitörli onnan. Ha belenézünk a file-ba, akkor egy kis keresgélés után találunk egy olyan bejegyzést, hogy Time-LOCK. Szóval ez az ominózus Time-LOCK védelem, amit igen sok program használ! Legalább már ezzel is találkoztam! Ha tovább megyünk az F10 gomb segítségével, akkor láthatjuk, hogy rögtön a kiolvasás után ellenõriz valamit!
* Reference To: USER32.GetDlgItem, Ord:00EBh
|
:10004AC2 FF15B0050210 Call
dword ptr [100205B0]
:10004AC8 50 push
eax
:10004AC9 8BD8 mov
ebx, eax
Kiolvassa a program a beírt nevet.
* Reference To: USER32.GetWindowTextLengthA,
Ord:0136h
|
:10004ACB FF15C8050210 Call
dword ptr [100205C8]
:10004AD1 83F802 cmp
eax, 00000002
:10004AD4 7F1C jg
10004AF2
Ellenõrzi a hosszát, és ha nagyobb mint 2 akkor tovább ugrik.
:10004AD6 6800200000 push
00002000
:10004ADB 6839D50110 push
1001D539
:10004AE0 6849DA0110 push
1001DA49
:10004AE5 6A00 push
00000000
* Reference To: USER32.MessageBoxA, Ord:0188h
|
:10004AE7 FF1594050210 Call
dword ptr [10020594]
:10004AED E935010000 jmp
10004C27
Ha kisebb, akkor hibaüzenet!
Ezután tovább megyünk, és elérünk odáig, hogy kiolvassuk az "Unlock Code"-ot.
* Reference To: USER32.GetDlgItem, Ord:00EBh
|
:10004B01 FF15B0050210 Call
dword ptr [100205B0]
:10004B07 6A31 push
00000031
:10004B09 6890E30110 push
1001E390
:10004B11 8D45D8 lea
eax, dword ptr [ebp-28]
:10004B14 50 push
eax
:10004B15 E8F5C4FFFF call
1000100F
A program ezután nagyon buta módon, kiszámolja, hogy mi a jó "Unlock Code"!
:10004B1A 83C404 add
esp, 00000004
:10004B1D 8D45EC lea
eax, dword ptr [ebp-14]
:10004B20 8D4DD8 lea
ecx, dword ptr [ebp-28]
Ezután ha elértünk a 10004B23 címig, akkor írjuk be, hogy "D EAX". Rögtön látjuk, hogy a saját kódunk van a megadott helyen! Ha beírjuk hogy "D ECX", akkor pedig láthatjuk, hogy a jó kód jelent meg a képernyõn! Ezt a címet jól jegyezzük meg, mert még szükségünk lehet rá! Itt már meg is oldódhatna a problémánk, de ez a kód csak a migépünkön mûködik. Írjuk be a kódot az "Unlock Code"-ba, és csoda történt! A program elfogadta! De ez a kód már nem müködik más gépén... Menjünk egy kicsit tovább...
:10004B23 50 push
eax
:10004B24 51 push
ecx
:10004B25 E8161C0000 call
10006740
:10004B2A 83C408 add
esp, 00000008
:10004B2D 85C0 test
eax, eax
:10004B2F 7553 jne
10004B84
Az 10004B25 címen ellenõrzi a kódot, és ha rossz, akkor tovább ugrik a 10004B84 címre. Lássuk mi történik ott!
* Referenced by a (U)nconditional or (C)onditional
Jump at Address:
|:10004B2F(C)
|
:10004B84 8D45D8 lea
eax, dword ptr [ebp-28]
:10004B87 50 push
eax
:10004B88 E88CC4FFFF call
10001019
Idáig semmi különös...
:10004B8D 83C404 add
esp, 00000004
:10004B90 8D45EC lea
eax, dword ptr [ebp-14]
:10004B93 8D4DD8 lea
ecx, dword ptr [ebp-28]
:10004B96 50 push
eax
:10004B97 51 push
ecx
:10004B98 E8A31B0000 call
10006740
Az EAX-be megint beleteszi a mi kódunkat, és az ECX -be pedig beleteszi a TRIAL periódust meghosszabító kódot.
:10004B9D 83C408 add
esp, 00000008
:10004BA0 85C0 test
eax, eax
:10004BA2 753E jne
10004BE2
Ellenõrzi, hogy a Trial periódus kódját ütöttük-e be. Ha nem, akkor tovább megy a 10004BE2 címre. Lássuk csak! Mi történik itt??? Csak nem egy üzenetablak??? Juhééé!! Ez kell nekünk. Tudni kell, hogy hogyan kell a MessageBoxA-nevû procedurát paraméterezni:
int MessageBox(
HWND hwndOwner, // A tulajdonos
ablak kezelője
LPCTSTR lpszText, // Az ablak üzenetére
mutató pointer
LPCTSTR lpszTitle, // Az ablak feliratára
mutató pointer
UINT fuStyle //
Az ablak stílusa
);
Továbbá tudnunk kell, hogy az assembler
a vermet használja erre, azért
fordított sorrendben kell belerakni a paramétereket.
:10004BB2 6800200000 push
00002000 //stílus
:10004BB7 6839D50110 push
1001D539 //ablak felirata
:10004BBC 6875DB0110 push
1001DB75 // ablak üzenete
:10004BC1 56 push
esi //tulajdonos ablak kezelője
* Reference To: USER32.MessageBoxA, Ord:0188h
|
:10004BC2 FF1594050210 Call
dword ptr [10020594]
:10004BC8 C70534AA011001000000 mov dword ptr [1001AA34], 00000001
Mostmár látjuk, hogy ez egy hibaüzenet, ami tájékoztat minket, hogy hibás a kódunk. De emlékszünk még, hogy valahol már láttuk a mi helyes kódunkat! Mi lenne, hogyha azt a kódot tudnánk kiíratni? Elvben nincs semmi akadálya.
3. Egy kis Win32 assembly
Ahogy láttuk, valahogy bele kell tenni az ablak üzenetbe a kódunkkat. Tudjuk, hogy a 10004B20 címen levõ utasítás tárolta el a jó címet! Itt kell tennünk tehát valamit. A dolog nagyon egyszerû. El kell ugranunk oda, ahol a kiíratás volt!
:10004B1D 8D45EC lea
eax, dword ptr [ebp-14]
:10004B20 8D4DD8 lea
ecx, dword ptr [ebp-28]
:10004B23 50 push
eax
:10004B24 51 push
ecx
:10004B25 E8161C0000 call
10006740
A 10004B23 címen levõ utasítást kell átírnunk. Tehát indítsuk újra az egészet, és amikor erre a címre érünk, akkor nyomjuk meg az "A" betüt. Ha sikerült, akkor beírhatjuk az új utasítást. Írjuk be hogy:
:10004B23 JMP 10004BB2
Ha beírtuk, akkor láthatjuk, hogy megváltozott a kódok, mert a JMP utasítás opkódja 5 byte, ezért még be kell írnunk kétszer hogy "NOP". Ha minden sikerült, akkor ezt fogjuk látni.
:10004B23 E9BA000000 JMP 10004BB2
:10004B28 90 NOP
:10004B29 90 NOP
Ha ütünk még egy ENTER-t, akkor befejezzük a szerkesztést. Ezután ha tovább megyünk, akkor rögtön oda ugrunk, ahol a hibaüzenet kiíratása történik.
:10004BB2 6800200000 push
00002000 //stílus
:10004BB7 6839D50110 push
1001D539 //ablak felirata
:10004BBC 6875DB0110 push
1001DB75 // ablak üzenete
:10004BC1 56 push
esi //tulajdonos ablak kezelője
* Reference To: USER32.MessageBoxA, Ord:0188h
|
:10004BC2 FF1594050210 Call
dword ptr [10020594]
:10004BC8 C70534AA011001000000 mov dword ptr [1001AA34], 00000001
Ha most beírjuk hogy
"DECX", akkor láthatjuk, hogy az ECX regiszter
rámutat a helyes kódra! Nincs más
teendõnk, mint ezt az értéket lementenünk a
verembe. Ha oda értünk a 10004BBC címre, akkor
megint írjuk be hogy "A" és ENTER! Utána írjuk
be hogy "PUSH ECX", ami annyit csinál, hogy lementi a
verembe az ECX tartalmát. De láthatjuk, hogy ennek azopkódja
csak egy byte, ezért még négyszer be kell írni
hogy "NOP". Ha ez sikerült, akkor a következõt fogjuk
látni:
:10004BB2 push 00002000 //stílus
:10004BB7 push 1001D539 //ablak felirata
:10004BBC push ecx
:10004BBD nop
:10004BBE nop
:10004BBF nop
:10004BC0 nop
:10004BC1 push esi //tulajdonos ablak kezelője
* Reference To: USER32.MessageBoxA, Ord:0188h
|
:10004BC2 FF1594050210 Call
dword ptr [10020594]
:10004BC8 C70534AA011001000000 mov dword ptr [1001AA34], 00000001
Ezután ha elindítjuk mégegyszer, akkor a hibaüzenet helyett már a saját kódunkat fogjuk visszontlátni a hibaüzenet helyett. Mostmár nincs más dolgunk, mint írni egy crack programot, ami elõször módosítja a DLL-t, majd visszaállítja az eredeti állapotát!
4. Végszó
Tudom, hogy ez egya kicsit nehézkes anyag volt, de aki megcsinálja,
az egy kicsit közelebb kerül a Windows belsõ mûködéséhez!
Üdvözletemet küldöm Molnár Lászlónak, aki az UPX-et
ingyen és bérmentve fejleszti!!!
Lukundoo [HPA]
1999. dec. 28.