ROCKEY2 jest prostym kluczem sprzętowym (tzw. dongle), wykorzystywanym m.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;
}