|Usuniecie SoftSentry2 #3|
[ Usunięcie zabezpieczenia softSENTRY Release 2.008 ]

Myślę, że wszyscy którzy zaglądnęli na strony CrackPl potrafią już obsługiwać ProcDump i są wstanie rozpakować większość plików uruchomieniowych spakowany lub szyfrowanych. Okazuje się, ze na podobnej zasadzie działa większość komercyjnych pakietów autoryzacyjnych do ograniczeń czasowych i wersji trial oprogramowania. Znamy już takie pakiety jak TimeLock lub Vbox, które mimo zastosowania skomplikowanych algorytmów szyfracji i rozbudowanych procedur ochrony dają się w kilka sekund usunąć z programów.
Z reguły są dwa rodzaje takich pakietów zabezpieczeń, jedne które wprowadzają procedury i funkcje już na poziomie pisania kodu programu i po kompilacji na trwale wbudowane w program i drugie dołączające i szyfrujące już gotowe pliki uruchomieniowe. Te pierwsze mogą być lepsze lub gorsze ale czasami mogą spełniać swoją role, natomiast te drugie są po prostu do niczego. Przykładem było już TimeLock lub Vbox, teraz przedstawie inne softSENTRY oferowane min. w zestawie www.componentsource.com i można je znaleˇć min. na płytkach1/99 tego zestawu.

Ogólne założenia programu są dobre, program umożliwia przygotowanie skryptów tworzących procedury trial takie jak time limit, limit uruchomień, okienka rejestracyjne, okienka informacyjne i generowanie kodu dołączanego do wykonywalnych plików exe lub bibliotek dll. Właściwie wszystko pięknie tyle, że usunięcie tego kodu z pliku uruchomieniowych nie nastręczy żadnych problemów nawet początkującym crackerom a nawet wręcz ułatwi im zcrackowanie programu.

Zobaczmy co ten program wyrabia z kodem np. w pliku sentry32.exe (sam pakiet jest zabezpieczony swoim kodem):

Po wstępnej analizie kodu startowego, znajdujemy sprawdzanie ograniczeń i wywoływanie odpowiednich okienek dialogowych lub informacyjnych. Można się bawić w modyfikacje tego kodu ale nie ma to sensu. W każdym razie dochodzimy do takiego fragmentu kodu :


014F:004A3B27  FF1558A44A00        CALL    [USER32!UnregisterClassA]
014F:004A3B2D  E87E000000          CALL    004A3BB0
014F:004A3B32  E819000000          CALL    004A3B50
014F:004A3B37  8B45B8              MOV     EAX,[EBP-48]
014F:004A3B3A  50                  PUSH    EAX
014F:004A3B3B  FF15D0A34A00        CALL    [KERNEL32!ExitProcess]
014F:004A3B41  8B45B8              MOV     EAX,[EBP-48]
014F:004A3B44  E900000000          JMP     004A3B49

Wywołanie CALL 4A3B50 wywołuje następną procedurę, która nas będzie interesować. Szukamy bowiem kodu głównego programu z pominięciem kodu pakietu SoftSENTRY. Zobaczmy więc na to wywołanie :


014F:004A3B50  56                  PUSH    ESI
014F:004A3B51  A1C0894A00          MOV     EAX,[004A89C0]
014F:004A3B56  33C9                XOR     ECX,ECX
014F:004A3B58  8B7002              MOV     ESI,[EAX+02]
014F:004A3B5B  337006              XOR     ESI,[EAX+06]
014F:004A3B5E  33700A              XOR     ESI,[EAX+0A]
014F:004A3B61  033548884A00        ADD     ESI,[004A8848]
014F:004A3B67  A1C0894A00          MOV     EAX,[004A89C0]
014F:004A3B6C  41                  INC     ECX
014F:004A3B6D  41                  INC     ECX
014F:004A3B6E  8B5006              MOV     EDX,[EAX+06]
014F:004A3B71  31548EF8            XOR     [ECX*4+ESI-08],EDX
014F:004A3B75  A1C0894A00          MOV     EAX,[004A89C0]
014F:004A3B7A  8B500A              MOV     EDX,[EAX+0A]
014F:004A3B7D  31548EFC            XOR     [ECX*4+ESI-04],EDX
014F:004A3B81  83F914              CMP     ECX,14
014F:004A3B84  7CE1                JL      004A3B67
014F:004A3B86  8B0DF4884A00        MOV     ECX,[004A88F4]
014F:004A3B8C  E88FF5FFFF          CALL    004A3120
014F:004A3B91  FFD6                CALL    ESI  <---- !!!!
014F:004A3B93  6A00                PUSH    00
014F:004A3B95  6820634A00          PUSH    004A6320
014F:004A3B9A  6810634A00          PUSH    004A6310

Krótkie prześledzenie tego kodu pozwoli nam znaleˇć wywołanie CALL ESI, które jak się okazuje wywołuje nasz główny program. Widzimy tu fragment kodu przygotowujący EntryPoint do kodu głównego i zachowujący go w rejestrze ESI. Wywołanie Call ESI prowadzi do :


014F:00414CA0  64A100000000        MOV     EAX,FS:[00000000]
014F:00414CA6  55                  PUSH    EBP
014F:00414CA7  8BEC                MOV     EBP,ESP
014F:00414CA9  6AFF                PUSH    FF
014F:00414CAB  68B8424400          PUSH    004442B8
014F:00414CB0  68C4AA4100          PUSH    0041AAC4
014F:00414CB5  50                  PUSH    EAX
014F:00414CB6  64892500000000      MOV     FS:[00000000],ESP
014F:00414CBD  83EC60              SUB     ESP,60
014F:00414CC0  53                  PUSH    EBX
014F:00414CC1  56                  PUSH    ESI
014F:00414CC2  57                  PUSH    EDI
014F:00414CC3  8965E8              MOV     [EBP-18],ESP
014F:00414CC6  FF15B0374500        CALL    [KERNEL32!GetVersion]
014F:00414CCC  A3A4D74400          MOV     [0044D7A4],EAX

To jest już nasz główny program, zaczynający się w moim wypadku od cs:414CA0 i taka wartość była zapisana w ESI. Ponieważ jak pisałem, kody zabezpieczeń przyłączane są do gotowego pliku uruchomieniowego ich usunięcie nie powinno sprawić problemów. Należy dojść do początku głównego programu i zapisać obraz pliku na dysku z pamięci i odtworzyć nową strukturę pliku exe. Sposobów jest wiele ale najłatwiejszy to ProcDump.

Tworzymy sobie nową sekcje w pliku script.ini

[softSentry]
L1=LOOK E8,19,00,00,00
; szukamy pierwszego call 43a3b50
L2=BP
; pułapka na znalezionym adresie
L3=LOOK FF,D6
; szuka drugiego call ESI
L6=BP
; zastawia na nim pułapke
L7=STEP
; i dalej juz śledzi zapisując rozpakowany program

No i program pięknie nam usunie zabezpieczenia SoftSENTRY. Jeżeli jeszcze zaglądniemy do nagłówka pliku znajdziemy niepotrzebną sekcje 20/20teaćj, którą możemy usunąć za pomocą edytora PE zawartego w ProcDump.

Proste prawda, szkoda tylko, że praca nad niezłym pakietem zabezpieczeń owocuje tak kiepskim zabezpieczeniem. Po prostu przerost formy nad treścią.

made by by Gustaw Kit - 13 grudnia 1998



All rights reserved for CRACKPL 1998 - 2oo2 . Designed by hauer