ESET CrackMe CONfidence 2012

hasherezade to laureatka zeszłorocznego konkursu Pimp My Crackme, opublikowała ona na swoim blogu rozwiązanie kolejnego crackme firmy ESET, które upubliczniono przed konferencją, a szczęśliwcy, którym udało się je rozwiązać, otrzymali darmowe wejściówki na konferencję.

ESET CrackMe 2012

https://hshrzd.wordpress.com/2012/05/29/solving-esets-confidence-2012-crackme/

PS. Jestem pełen podziwu dla firmy ESET w ich zapale do tworzenia kolejnych CrackMe na kolejne konferencje, dzięki czemu ich wkład w rozwój i promocję reverse engineeringu w Polsce jest tak „ogromny”, a wszystko to bez opublikowania choćby jednego technicznego PDF-a. Serdecznie pozdrawiam i czekam na kolejne crackme (najlepiej od tego samego autora, jx+jnx rules) 😉

DataHASP

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.

Praca w ArcaBit

ArcaBit to polski producent oprogramowania antywirusowego ArcaVir, wywodzący się z MksVir-a. Całą smutną historię rozdzielenia się części pracowników i utworzenia ArcaVir oraz o późniejszych wielu sporach moża przeczytać na forach obu firm oraz na portalu DobreProgramy.pl.

Dzisiaj ciekawe opinie o pracy w tej firmie znalazłem na forum 4programmers, a docelowo znajdują się na portalu o pracy GoWork, jeden z ciekawszych cytatów:

Właściciele mają samochody za kilkaset tysięcy [każdy] a w biurze nie ma nawet sprzątaczki.
Jest biuro na parterze i tam ludzie mają grafik, kto i kiedy sprząta [myje podłogi, odkurza i czyści kible – tak kible]. Biuro na piętrze jest sprzątane przez Panią W. [odkurzanie, mucie naczyń, kurze i kible]. Warto nadmienić że Pani W. jest szefową biura a mimo wszystko w godzinach pracy w elegandzkim stroju – sprząta.
Najlepsza było przyjęcie wigilijne – było owszem ciasto i Cola i ….. no niestety nic więcej nie było.
Okropne dziadostwo

Oryginalny wpis:

http://www.gowork.pl/opinie_czytaj2,33733,0,0

PS.
Dzisiaj wyszedł news o upadłości firmy MKS, R.I.P gorszego dziadostwa antywirusowego nie widziałem, jeszcze w czasach wersji DOS-owej skasował mi połowę exeków z dysku, a w czasach Windowsa nie chcieli ze mną nawet rozmawiać o false-positivach w moich pierwszych exe-pakerach.