DataHASP to system szyfrowania dowolnych plików aplikacji, dzięki któremu oryginalna treść takich zaszyfrowanych plików widoczna jest jedynie dla aplikacji, które zostały zabezpieczone przez Sentinel HASP Envelope (exe-protector HASPa).
HASP pozwala na szyfrowanie pojedynczych plików jak i całych katalogów z danymi aplikacji poprzez dodatkowe narzędzie:
W samym envelope określa się rodzaj plików, które zostały zaszyfrowane:
Zaszyfrowane pliki aplikacji może odczytać jedynie zabezpieczona aplikacja, realizowane jest to poprzez system hooków na funkcje systemu plików na poziomie usera.
Jeśli aplikacja zostanie rozpakowana, dostęp do oryginalnej treści zaszyfrowanych plików będzie niemożliwy (brakuje tych hooków, które w locie deszyfrują dane).
Jak uzyskać zatem dostęp do oryginalnej treści zaszyfrowanych plików?
Należy do działającej i zabezpieczonej aplikacji wstrzyknąć kod, który wykorzysta jej funkcje systemu plików (na które nałożone są hooki HASPa) i po prostu zaemulować czytanie wybranych plików.
Najprościej można to zrealizować poprzez skrypt ODBScript:
; wolna przestrzen po sekcji kodu mov dump_hasp,008864D5 mov eip,dump_hasp asmtxt eip,"dumper.asm" ; alokuj 2 bufory na nazwe pliku wyjsciowego i wejsciowego alloc 512 mov input_file,$RESULT alloc 512 mov output_file,$RESULT ; zrzuc 1 plik mov x, "C:\PATH\APP\DATA.DAT" call dump_file ; zrzuc 2 plik mov x, "C:\PATH\APP\CONFIG.DAT" call dump_file ret ; funkcja do zrzucania zaszyfrowanych plikow dump_file: fill input_file, 512, 0 mov [input_file], x ; plik wyjsciowy bedzie posiadal rozszerzenie .x add x, ".X" fill output_file, 512, 0 mov [output_file],x ; ESI -> sciezka pliku wejsciowego ; EDI -> sciezka pliku wyjsciowego mov esi,input_file mov edi,output_file ; ustaw EIP na adres procedury dumpujacej mov eip,dump_hasp ; exec ... ende za chiny nie dziala u mnie... inaczej bym tu dal call dump_hasp? ; uruchom kod z biezacego EIP do napotkania instrukcji RET rtr ;run to return mov x, "" ret
Pomocniczy kod w assemblerze dla skryptu:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; odczytaj plik wejsciowy ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; zapamietaj na stosie nazwe pliku wyjsciowego push edi ; otworz plik wejsciowy push 0 ; hTemplate push 0 ; attribs push 3 ;OPEN_EXISTING ; creation push 0 ; security push 1 ; share mode push 80000000 ;GENERIC_READ push esi ; lpFileName call [0800004] ;CreateFileA mov ebx,eax push 0 push ebx ; hFile call [0800008] ;GetFileSize mov edi,eax ; zaalokuj pamiec do odczytania danych pliku wejsciowego push 4 ;PAGE_READWRITE push 3000 ;MEM_RESERVE or MEM_COMMIT push edi ; size push 0 call VirtualAlloc mov esi,eax ; czytaj plik wejsciowy korzystajac z hookowanych API push 0 mov eax,esp push 0 ; dwOverlapped push eax ; &dwRead push edi ; dwSize push esi ; lpBuffer push ebx ; hFile call [0800024] ;adres funkcji ReadFile w zabezpieczonym pliku pop edx ; zamknij plik wejsciowy push ebx call [0800088] ;CloseHandle ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; zapisz plik wyjsciowy ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; zdejmij ze stosu nazwe pliku wyjsciowego (odszyfrowany) pop eax push 0 ; hTemplate push 0 ; attribs push 2 ;CREATE_ALWAYS ; creation push 0 ; security push 0 ; share mode push 40000000 ;GENERIC_WRITE push eax ; lpFileName call CreateFileA mov ebx,eax ; zapisz odczytana tresc pliku wejsciowego push 0 mov eax,esp push 0 ; overlapped push eax ; &dwWritten push edi ; size push esi ; buffer push ebx call WriteFile pop edx ; zamknij plik wyjsciowy push ebx call CloseHandle ; zwolnij pamiec push 8000 ;MEM_RELEASE push 0 push esi call VirtualFree ret
Przedstawiona technika pozwala z łatwością odczytać wszystkie zaszyfrowane pliki.


Ostatnio natrafiłem na aplikację stworzoną w środowisku 



Jakiś czas temu znajomy poprosił mnie o usunięcie zabezpieczenia 

