Package for the WEB gyors törése
avagy
hogyan csináljunk Time-LOCK generic törést

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.