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;
}

 

Jak napisać prosty patch?

Dzisiaj coś dla początkujących, czyli krótki program w C/C++, prezentujący jak używając funkcji WinApi napisać prosty patch, który otworzy wskazany plik i zmodyfikuje kilka bajtów pod konkretnym adresem.

#include <windows.h>

int main()
{
	// bajty, ktore zostana zapisane do pliku
	BYTE cPatch[] = { 0xAA, 0xBB, 0xCC };

	// offset, pod ktorym zostana zapisane powyzsze bajty
	const DWORD dwPatchRawOffset = 0x1234;

	// ilosc zapisanych bajtow w pliku (parametr dla funkcji WriteFile)
	DWORD dwWritten = 0;

	// uchwyt pliku
	HANDLE hFile = INVALID_HANDLE_VALUE;

	// otworz plik wejsciowy w trybie do zapisu (flaga GENERIC_WRITE)
	hFile = CreateFile("plik.exe", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

	// jesli nie udalo sie otworzyc pliku - wyswietl komunikat i zakoncz
	if (hFile == INVALID_HANDLE_VALUE)
	{
		MessageBox(NULL, "Nie udalo sie otworzyc pliku wejsciowego!", "Blad", MB_ICONERROR);
		return 1;
	}

	// ustaw wskaznik pliku na offsecie (raw offset),
	// gdzie zostana zapisane zmodyfikowane bajty
	SetFilePointer(hFile, dwPatchRawOffset, 0, FILE_BEGIN);

	// pod wskazanym adresem zapisz bajty z tablicy cPatch
	WriteFile(hFile, cPatch, sizeof(cPatch), &dwWritten, NULL);

	// zamknij plik
	CloseHandle(hFile);

	MessageBox(NULL, "Plik zostal pomyslnie zmodyfikowany", "Informacja", MB_ICONINFORMATION);

	return 0;
}

Źródła w języku angielskim zostały opublikowane na https://github.com/PELock/Simple-Patch-File-Example

PS. Być może ktoś zechce w komentarzach zaprezentować jak taki prosty patch wyglądałby w innych językach programowania. Jestem ciekaw waszych interpretacji oraz usprawnień.

Antywirus Avast i mała niespodzianka

Jak się okazuje darmowy antywirus Avast oprócz swojej podstawowej funkcji, instalował Adware w postaci wtyczki do przeglądarki internetowej, która wysyłała do firmy Avast informację o każdej odwiedzanej stronie przez użytkownika.

avast-antivirus

Artykuł na:

http://www.howtogeek.com/199829/avast-antivirus-was-spying-on-you-with-adware-until-this-week/

Nie ukrywam, że jestem przeciwnikiem wszelkiej maści programów antywirusowych, których główną funkcją jest zamulanie komputera oraz zgłaszanie fałszywych detekcji gdzie tylko się da, oprócz tego ktoś sprytnie postanowił dorobić do tego darmowego biznesu przez wrzucenie oprogramowania, z którym w teorii antywirusy walczą – czysta hipokryzja i jeszcze jeden powód, żeby nie używać oprogramowania antywirusowego.

Optymalizacja kodu

binaryMało kto pisze tak ciekawie o optymalizacji kodu i wykorzystaniu nowych instrukcji procesorów jak Wojtek Muła, dlatego jeśli jesteś jedną z nielicznych osób, którą interesują takie kwestie jak niskopoziomowa optymalizacja kodu, to koniecznie zajrzyj do notesu Wojtka, w którym zamieścił wiele ciekawych przykładów:

http://wm.ite.pl/notesen.html