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; }
Jeżeli odczytamy pamięć i UID/HID co dalej ? 😉
Przykładowo:
Search Rockey 2:
UID: 4259402712 [0xFDE153D8]
HID: 1714702033 [0x663446D1]
Found Rockey 2 USB (1)
Rockey 2 UID: 4259402712 [0xFDE153D8]
Rockey 2 HID: 1714702033 [0x663446D1]
@crayx dalej idziemy do kąta i płaczemy z rozpaczy 🙂
😉 dzięki