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.