Biblioteka tl31inj.dll - jak zcrackowac program blokowany ta biblioteka.
Bibliotek tl31inj.dll jest stosowana w programach shareware do ograniczen czasowych korzystania z programu. Po starcie pojawia sie nag-screen informujacy ile pozostalo czasu korzystania z programu. Z reguly nie umozliwia tez wprowadzenie kodu rejestrujacego chociaz zawiera takie procedury. Wiele programów wykorzystuje ta biblioteke. Rózne wersje biblioteki mozna znalezc w internecie, moze na firmowej stronie twórców tej biblioteki http://www.timelock.com .
Narzedzia: SoftICE 3.0+
Hex Edytor
Cel: NetObject Fusion 3.0
Nowa wersja TimeLock 3.0 sprawia troche wiecej klopotu niz jego poprzednia 2.0. Wgrywamy plik exe do SoftICE i startujemy. Poczatkowa analiza kodu przynosi smutne informacje:
014F:00DED000 FF74240C PUSH DWORD PTR [ESP+0C] 014F:00DED004 FF74240C PUSH DWORD PTR [ESP+0C] 014F:00DED008 FF74240C PUSH DWORD PTR [ESP+0C] 014F:00DED00C 68D94DF8E3 PUSH E3F84DD9 014F:00DED011 682096690A PUSH 0A699620 014F:00DED016 686123D6B0 PUSH B0D62361 014F:00DED01B FF15C4D3DE00 CALL [tl31inj!?PleaseTraceIntoMe_MrCracker] 014F:00DED021 68FFFFFFFF PUSH FFFFFFFF 014F:00DED026 FFD0 CALL EAX --> wywolanie glównego programu 014F:00DED028 C20C00 RET 000C
Polecenie CALL [00DED3C4] [tl31inj!?PleaseTraceIntoMe_MrCracker]wywoluje funkcje biblioteki tl31inj.dll, które sprawdzaja zabezpieczenia i przy odpowiednich warunkach zwracaja adres procedury startowej (entry point) w rejestrze EAX i dopiero CALL EAX wywoluje glówny program. Samo usuniecie wywolania tl32inj.dll nic nie da bo biblioteka musi zwrócic nam poprawny adres entry point. W przypadku niespelnionych warunków np. trial expired w EAX jest zwracany adres procedury zamkniecia [Kernel32!ExitProcess]. Analizujemy w takim razie co robi biblioteka tl31inj.dll. Pojawia sie okienko dialogowe podajace pozostaly czas uzywania wersji trial. Jezeli naciskamy 'try' program sie uruchamia. Jezeli czas sie nam skonczy lub przestawimy date a pózniej ja cofniemy uniemozliwione wystartowanie wersji trial. Mozemy jednak oszukac program. Fragment kodu odpowiadajacy za to przedstawiam ponizej. Najszybciej znajdziemy go zastawiajac pulapke na wywolaniu funkcji DialogBoxParamA.
014F:00FA8201 A164A3FD00 MOV EAX,[00FDA364] 014F:00FA8206 684083FA00 PUSH 00FA8340 014F:00FA820B 6A00 PUSH 00 014F:00FA820D 687CF6FD00 PUSH 00FDF67C 014F:00FA8212 50 PUSH EAX 014F:00FA8213 FF153096FE00 CALL [USER32!DialogBoxParamA] --> zwraca w EAX wynik 014F:00FA8219 8BF8 MOV EDI,EAX 014F:00FA821B 8B3574A3FD00 MOV ESI,[00FDA374] 014F:00FA8221 85F6 TEST ESI,ESI 014F:00FA8223 7410 JZ 00FA8235 014F:00FA8225 8BCE MOV ECX,ESI 014F:00FA8227 E834280100 CALL 00FBAA60
Funkcja DialogBoxParamA zwraca w rejestrze EAX wartosc odpowiadajaca nacisnietemu przyciskowi. Jezeli nacisniemy 'try' to w EAX mamy 1 i wtedy program odpowiednio startuje. Jezeli nacisniemy Cancel to w EAX mamy 2 itd. W razie klopotów lub expired trial mozemy zastawic pulapke i odpowiednio modyfikowac zawartosc rejestru EAX na 1 ( r EAX=1). Jakiekolwiek patchowanie biblioteki jest nie wskazane bo program sprawdza poprawnosc i CRC32.
Wracajac do poczatkowego kodu, po spelnionych warunkach w EAX mamy entry point. W moim przypadku bylo to EAX=80EC90. Zmodyfikowanie tego fragmentu kodu i wpisanie stalego adresu z pominieciem tl31innj.dll powoduje zawieszenie programu. Okazuje sie, ze bibliotek tl31inj.dll odpowiednio modyfikuje ten startowy fragment kodu. Mozna sie o tym przekonac, zakladajac pulapki na pamieci o adresie zawartym w EAX. Okazuje sie, ze biblioteka przepisuje fragment kodu w to miejsce (na dodatek je deszyfrujac) za pomoca ReadProcessMemory i WriteProcessMemory.
Oto kod realizujacy te procedury:
014F:00FB5C1A FFFF INVALID 014F:00FB5C1C FF508B CALL [EAX-75] 014F:00FB5C1F 4D DEC EBP 014F:00FB5C20 D451 AAM 014F:00FB5C22 56 PUSH ESI 014F:00FB5C23 FF158C94FE00 CALL [KERNEL32!ReadProcessMemory] 014F:00FB5C29 85C0 TEST EAX,EAX 014F:00FB5C2B 740B JZ 00FB5C38 014F:00FB5C2D 8B45D8 MOV EAX,[EBP-28] 014F:00FB5C30 398538FFFFFF CMP [EBP-00C8],EAX 014F:00FB5C36 7420 JZ 00FB5C58 014F:00FB5C38 6A00 PUSH 00 014F:00FB5C3A 6A01 PUSH 01 014F:00FB5C3C 8D8DA4FDFFFF LEA ECX,[EBP-025C] 014F:00FB5C42 E889100000 CALL 00FB6CD0 014F:00FB5C47 68888EFD00 PUSH 00FD8E88 014F:00FB5C4C 8D85A4FDFFFF LEA EAX,[EBP-025C] 014F:00FB5C52 50 PUSH EAX 014F:00FB5C53 E8C8530100 CALL 00FCB020 014F:00FB5C58 F645CC08 TEST BYTE PTR [EBP-34],08 014F:00FB5C5C 7518 JNZ 00FB5C76 014F:00FB5C5E 8B8548FFFFFF MOV EAX,[EBP-00B8] 014F:00FB5C64 99 CDQ 014F:00FB5C65 2BC2 SUB EAX,EDX 014F:00FB5C67 C1F801 SAR EAX,01 014F:00FB5C6A 50 PUSH EAX 014F:00FB5C6B 8D8D48FFFFFF LEA ECX,[EBP-00B8] 014F:00FB5C71 E84A140000 CALL 00FB70C0 014F:00FB5C76 8D45D8 LEA EAX,[EBP-28] 014F:00FB5C79 50 PUSH EAX 014F:00FB5C7A 8B8548FFFFFF MOV EAX,[EBP-00B8] --> dlugosc danych 014F:00FB5C80 50 PUSH EAX 014F:00FB5C81 8B854CFFFFFF MOV EAX,[EBP-00B4] --> miejsce pobrania 014F:00FB5C87 50 PUSH EAX 014F:00FB5C88 8B4DD4 MOV ECX,[EBP-2C] -->miejsce zapisu w pamieci 014F:00FB5C8B 51 PUSH ECX 014F:00FB5C8C 56 PUSH ESI 014F:00FB5C8D FF158894FE00 CALL [KERNEL32!WriteProcessMemory] 014F:00FB5C93 85C0 TEST EAX,EAX 014F:00FB5C95 740B JZ 00FB5CA2
Funkcja ReadProcessMemory odczytuje dane do pózniejszego zapisania.
Najistotniejszym fragmentem tego kodu jest funkcja WriteProcessMemory, która zapisuje dane o dlugosci w [EBP-B8] pobranych z [EBP-B4] i zapisanych pod adresem zawartym w [EBP-2C]. Dla naszego przykladu dane maja dlugosc 70C a zapisane sa pod wiadomym wczesniej adresem 80EC90. Wyswietlajac nasz fragment d 80EC90 l 70C mamy interesujacy nas fragment kodu :
:d 80EC90 l 70C 0157:0080EC90 64 A1 00 00 00 00 55 8B-EC 6A FF 68 E8 F5 84 00 d.....U..j.h.... 0157:0080ECA0 68 62 EE 80 00 50 64 89-25 00 00 00 00 83 EC 78 hb...Pd.%......x 0157:0080ECB0 53 56 57 89 65 E8 C7 45-FC 00 00 00 00 6A 02 FF SVW.e..E.....j.. 0157:0080ECC0 15 58 BE B9 00 83 C4 04-C7 05 58 65 B9 00 FF FF .X........Xe.... 0157:0080ECD0 FF FF A1 58 65 B9 00 A3-68 65 B9 00 FF 15 54 BE ...Xe...he....T. 0157:0080ECE0 B9 00 8B 0D 60 E0 96 00-89 08 FF 15 50 BE B9 00 ....`.......P... 0157:0080ECF0 8B 0D 5C E0 96 00 89 08-A1 9C BE B9 00 8B 00 A3 ..\............. 0157:0080ED00 4C 65 B9 00 E8 B7 01 00-00 83 3D 58 E0 96 00 00 Le........=X.... 0157:0080ED10 75 0E 68 B0 EE 80 00 FF-15 60 BE B9 00 83 C4 04 u.h......`...... 0157:0080ED20 E8 6B 01 00 00 68 68 D2-94 00 68 64 D1 94 00 E8 .k...hh...hd.... ...................itd
Nalezy ten fragment kodu zapamietac w pliku bo bedzie nam on potrzebny do pózniejszego zmodyfikowania programu. Jak to najlatwiej zrobic opisze na koncu.
Teraz pozostaje nam jedynie zmodyfikowac fusion.exe np. przy pomocy HexWorkshop musimy skopiowac nasz fragment kodu o dlugosci 70C w miejsce o offsecie 40EC90. Nalezy zwrócic uwage przy modyfikacji w HexWorkshop lub HackersView jaki sposób adres jest podawany. Przy modyfikacji bedzie to adres 40E090 jezeli jest podawany globalnie a 40EC90 gdy lokalnie. Dla HackerView mozemy to zmienic w pliku hiew.ini. Nie nalezy tez zapomniec o zmianie w naglówku pliku - entry point z 9ED000 na 40EC90.
Po takich modyfikacjach program dziala bez sprawdzania trial za pomoca TimeLock 3.0.
Do zapisania fragmentu kodu do pliku, mozemy uzyc wiele sposobów. Pozostawiam to juz wam do zrobienia osobiscie. Mozna uzyc progami ku icedump4.exe, który zrzuca okreslony fragment pamieci spod SoftICE do pliku i jest dostepny na stronach http://fravia.org w sekcji tools. Mozna tez wyswietlic powyzszy zakres pamieci :d 80EC90 l 70C tak jak to zrobilem powyzej a nastepnie przy pomocy edytora zmodyfikowac go i uzyc jakiegos programu do konwersji z postaci tekstowej na binarna wzglednie taki programik sobie zapisac w paskalu.
Dla leniwych podaje plik z danymi :
-------> Wytnij tutaj <-------------- 64A100000000558BEC6AFF68E8F58400 6862EE8000506489250000000083EC78 5356578965E8C745FC000000006A02FF 1558BEB90083C404C7055865B900FFFF FFFFA15865B900A36865B900FF1554BE B9008B0D60E096008908FF1550BEB900 8B0D5CE096008908A19CBEB9008B00A3 4C65B900E8B7010000833D58E0960000 750E68B0EE8000FF1560BEB90083C404 E86B0100006868D294006864D19400E8 4C01000083C408A154E096008945D88D 45D850A150E09600508D45CC508D45C8 508D45C450FF1564BEB90083C4146860 D094006800409400E81301000083C408 FF156CBEB9008B308A063C2275168A45 C0468A0684C074043C2275F5803E2275 0D46EB0A3C20760646803E2077FA803E 00740B803E20770646803E0075F5C745 A4000000008D8578FFFFFF50FF1560A1 B900F645A401B80A00000074088B45A8 25FFFF000050566A006A00FF1568A1B9 0050E8850A000050FF15F4BDB900EB28 8B45EC8B008B008945E08B45EC508B45 E050E86D00000083C408C38B65E88B45 E050FF1574BEB90083C404C745FCFFFF FFFF8B45F05F64A3000000005E5B8BE5 5DC3FF252CBEB900FF2530BEB900FF25 34BEB900FF2538BEB900FF253CBEB900 FF2548BEB900FF2594BEB900FF2580BE B900FF257CBEB900FF2578BEB900FF25 74BEB900FF2570BEB900FF256CBEB900 FF2568BEB900FF2564BEB900CCCCCCCC 68000003006800000100E83500000083 C408C3CCFF2560BEB900CCCCCCCCCCCC 33C0C3CCCCCCCCCCCCCCCCCCCCCCCCCC C3CCFF2550BEB900FF2554BEB900FF25 58BEB900FF255CBEB900FF250CA2B900 FF2544A1B900FF2554A1B900FF2548A1 B900FF254CA1B900FF256CA1B900FF25 70A1B900FF2574A1B900FF2578A1B900 FF257CA1B900FF2580A1B900FF2584A1 B900FF2588A1B900FF258CA1B900FF25 90A1B900FF2594A1B900FF2598A1B900 FF259CA1B900FF25A0A1B900FF25A4A1 B900FF25A8A1B900FF25ACA1B900FF25 B0A1B900FF25B4A1B900FF25B8A1B900 FF25BCA1B900FF25C0A1B900FF25C4A1 B900FF25C8A1B900FF25CCA1B900FF25 D0A1B900FF25D4A1B900FF25D8A1B900 FF25DCA1B900FF25E0A1B900FF25E4A1 B900FF25E8A1B900FF25ECA1B900FF25 F0A1B900FF255CA1B900FF25F8A1B900 FF25FCA1B900FF2500A2B900FF2504A2 B900FF2550A1B900FF2558A1B900FF25 10A2B900FF2514A2B900FF2518A2B900 FF251CA2B900FF2520A2B900FF2524A2 B900FF2528A2B900FF252CA2B900FF25 30A2B900FF2534A2B900FF2538A2B900 FF253CA2B900FF2540A2B900FF2544A2 B900FF2548A2B900FF2508A2B900FF25 50A2B900FF2554A2B900FF2558A2B900 FF255CA2B900FF2560A2B900FF2564A2 B900FF2568A2B900FF256CA2B900FF25 4CA2B900FF2574A2B900FF2578A2B900 FF257CA2B900FF2570A2B900FF2580A2 B900FF2584A2B900FF2588A2B900FF25 8CA2B900FF25F4A1B900FF2568A1B900 FF2564A1B900FF2560A1B900FF257CC4 B900FF2578C4B900FF2574C4B900FF25 70C4B900FF256CC4B900FF2568C4B900 FF2564C4B900FF2560C4B900FF255CC4 B900FF2558C4B900FF2554C4B900FF25 50C4B900FF254CC4B900FF2548C4B900 FF2544C4B900FF2540C4B900FF253CC4 B900FF2538C4B900FF2534C4B900FF25 F0C2B900FF2510C3B900FF2554C3B900 FF2524C4B900FF2520C4B900FF251CC4 B900FF2518C4B900FF2514C4B900FF25 10C4B900FF250CC4B900FF25C0C3B900 FF25BCC3B900FF25B8C3B900FF25B4C3 B900FF2594C2B900FF259CC2B900FF25 88C2B900FF2584C2B900FF2590C2B900 FF257CC2B900FF2578C2B900FF2580C2 B900FF2558C3B900FF2550C3B900FF25 E4C2B900FF25E0C2B900FF2564C3B900 FF2574C3B900FF2578C3B900FF257CC3 B900FF2580C3B900FF2584C3B900FF25 88C3B900FF258CC3B900FF2590C3B900 FF2594C3B900FF2598C3B900FF259CC3 B900FF25A0C3B900FF25A4C3B900FF25 20C3B900FF2598C2B900FF25B0C2B900 FF25A0C2B900FF25A4C2B900FF255CC3 B900FF25B8C2B900FF2508C4B900FF25 04C4B900FF2500C4B900FF25FCC3B900 FF25F8C3B900FF25F4C3B900FF25F0C3 B900FF25ECC3B900FF25E8C3B900FF25 E4C3B900FF25E0C3B900FF25DCC3B900 FF25D8C3B900FF25D4C3B900FF25D0C3 B900FF25CCC3B900FF25C8C3B900FF25 C4C3B900FF2570C3B900FF256CC3B900 FF2568C3B900FF254CC3B900FF2548C3 B900FF2544C3B900FF2540C3B900FF25 3CC3B900FF2538C3B900FF2534C3B900 FF2530C3B900FF252CC3B900FF2528C3 B900FF2524C3B900FF2528C4B900FF25 30C4B900FF2518C3B900FF2514C3B900 FF2584C4B900FF250CC3B900FF2508C3 B900FF2504C3B900FF2500C3B900FF25 FCC2B900FF25F8C2B900FF252CC4B900 FF2580C4B900FF25ECC2B900FF258CC2 B900FF25DCC2B900FF251CC3B900FF25 D8C2B900FF25B0C3B900FF25E8C2B900 FF25A8C3B900FF25ACC3B900FF2560C3 -------> Wytnij tutaj <------------
wiecej informacji - http://fravia.org - w projekcie TimeLock