PELock v2.11 – Zabezpieczenie Oprogramowania

Wypuściłem mały update PELock – czyli jedynego polskiego systemu zabezpieczenia 32-bitowych aplikacji EXE/DLL/OCX wraz z systemem kluczy licencyjnych, bazującym na asymetrycznej kryptografii RSA.

Zmiany

  • Zabezpieczenie z linii komend z parametrem /auto zabezpieczy wszystkie pliki znajdujące się na liście projektu (wcześniej zabezpieczany był tylko pierwszy plik)
  • Dodano język francuski interfejsu użytkownika (dziękuję Terry)
PELock po francusku

Wersja demonstracyjna do pobrania ze strony:

https://www.pelock.com/pl/produkty/pelock/pobierz

Przykłady użycia dla m.in. Delphi/Freepascal, C/C++, PowerBASIC, PureBasic, generowanie licencji, sprzętowych identyfikatorów etc. na GitHubie:

https://github.com/PELock/PELock-Software-Protection-and-Licensing-SDK

Dewirtualizer dla VMprotect

No i stało się. Ktoś w końcu opublikował dewirtualizer dla popularnego systemu zabezpieczającego VMprotect, obsługujący jego najnowsze wersje z pełnymi kodami źródłowymi.

Repozytorium https://github.com/can1357/NoVmp

Wraz z jego publikacją pojawiły się powiązane narzędzia do zrzucania pamięci i naprawy importów aplikacji zabezpieczonych VMprotectem:

Wszyscy, którzy polegali jedynie na wirtualizacji kodu chyba muszą się poważnie zastanowić nad bezpieczeństwem swoich aplikacji.

Być może to dobra pora przerzucić się na inny system zabezpieczający aplikacje ze znacznie bardziej bogatym wachlarzem zabezpieczeń i SDK, do którego jeszcze nikomu nie udało się zrobić unpakera 🙂

Jak odczytać pamięć klucza sprzętowego ROCKEY2?

ROCKEY2 jest prostym kluczem sprzętowym (tzw. dongle), wykorzystywanym Klucz sprzętowy ROCKEY2m.in. w systemach licencyjnych oprogramowania.

Całe zabezpieczenie opiera się także na envelope (czyli exe-protectorze), jednak ze względu na prostotę tego konkretnego modelu klucza nie polecałbym jego stosowania w zabezpieczeniu oprogramowania.

ROCKEY2 posiada wbudowaną pamięć, składającą się z 5 bloków po 512 bajtów każdy.

Poniżej znajdziecie kod pozwalający odczytać wszystkie banki pamięci klucza. Wymagana jest do tego znajomość poprawnego identyfikatora użytkownika (uid), a do kompilacji potrzebne Wam będzie SDK tegoż klucza.

#include <windows.h>
#include <stdio.h>
#include "Rockey2.h"

// prosta funkcja zapisujaca zawartosc bufora do pliku
void save_file(char *file_name, char *buffer_bytes, size_t buffer_size)
{
	FILE *file_handle = NULL;

	file_handle = fopen(file_name, "wb+");

	fwrite(buffer_bytes, 1, buffer_size, file_handle);

	fclose(file_handle);
}

// zapisuje wybrany blok pamieci klucza Rockey2 do pliku
void dump_rockey2_block(int key_handle, int block_index, char *file_name)
{
	BYTE buffer_bytes[512] = { 0 };

	int result = 0;

	result = RY2_Read(key_handle, block_index, buffer_bytes);

	save_file(file_name, buffer_bytes, sizeof(buffer_bytes));
}

int main(int argc, char **argv)
{
	// liczba znalezionych kluczy
	int keys_count = 0;

	// uchwyt otworzonego klucza
	int key_handle = 0;

	int i = 0;

	// identyfikator klucza potrzebny do jego otwarcia
	DWORD uid = 0x12345678;

	DWORD hid = 0;

	printf("[i] memory dumper dla kluczy Rockey2 - www.secnews.pl\n");

	// znajdz aktualnie dostepne klucze Rockey2
	keys_count = RY2_Find();

	if (keys_count == 0)
	{
		printf("[!] nie znaleziono zadnych kluczy Rockey!");
		return 1;
	}

	printf("[i] znalezionych kluczy Rockey2 = %i\n", keys_count);

	// otworz klucz korzystajac z parametru UID
	key_handle = RY2_Open(1, uid, &hid);

	if (key_handle < 0)
	{
		printf("[!] nie udalo sie uzyskac dostepu do klucza (bledny uid?)!");
		return 2;
	}

	printf("[i] uchwyt klucza = %08X, HardwareId = %08X\n", key_handle, hid);

	// odczytaj wybrane bloki pamieci klucza
	// Rockey2 posiada 5 blokow po 512 bajtow kazdy
	dump_rockey2_block(key_handle, 0, "block_dump_0.bin");
	//dump_rockey2_block(key_handle, 1, "block_dump_1.bin");
	//dump_rockey2_block(key_handle, 2, "block_dump_2.bin");
	//dump_rockey2_block(key_handle, 3, "block_dump_3.bin");
	//dump_rockey2_block(key_handle, 4, "block_dump_4.bin");

	// zamknij klucz
	RY2_Close(0);

	return 0;
}

 

Exe protector za 50 PLN

Czasami dostaje różne propozycje współpracy czy napisania jakiegoś programu, jednak głupota niektórych ludzi jest aż zabawna (przykro to stwierdzić, ale rodacy przodują w tego typu rzeczach), niedawno otrzymałem intratną propozycję stworzenia prostego exe-protectora w assemblerze, z komentarzami etc., do pracy inżynierskiej dla jednego czuczona.

Jako, że nie chciało mu się szukać niczego w sieci, zaproponowałem mu 400 PLN, gdyż taki prosty template posiadam w swojej kolekcji, jest przetestowany, sprawny, kompatybilny i oto jak potoczyła się dalsza dyskusja:

Czuczon: Ty mi proponowałeś protektor za 400zł
Czuczon: kolega mi proponuje za 50zł

Czuczon: ile byś za to chciał? z przekazaniem praw autorskich, zebym to mogl uzyc jako pracy inżynierskiej
Ja: 400 PLN
Czuczon: przesadzasz z tą ceną
Ja: to napisz sam
Ja: to proste
Czuczon: kolega mi dał źródła protektora co szyfruje AES’em, ale to za trudne do ogarnięcia, nie rozumiem tego kodu :/
Czuczon: a wiesz może jak trzeba przerobić kod, żeby nie był plagiatem?
Ja: wiem
Ja: trzeba go solidnie pozmieniac na tak samo dzialajace instrukcje i funkcje
Czuczon: czyli np. przepisanie go na inny język programowania wystarczy?
Czuczon: mówie o C++ -> Asm
Ja: no jak ci sie uda
Czuczon: troche problem bo na klasach pisany, prawie 100% obiektowo

Dyskusja na tym się zakończyła, gdyż nie byłem w stanie zaproponować bardziej konkurencyjnej ceny do 50 PLN :). Tak szczerze mówiąc to nie wiem co tacy ludzie myślą, że takie rzeczy na drzewie rosną i że to pisze się z buta i jeszcze ma wszystko działać, a nie zdają sobie sprawy ile wiedzy w to zostało włożone, czasu na napisanie, na przetestowanie na różnych OS-ach, nawet takiego głupiego exe-protectora doh!

Jeśli mieliście podobne przypadki równie intratnych zleceń, napiszcie w komentach, pośmiejemy się razem 🙂