mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-05-14 09:18:35 -07:00
rfid fuzzer H10301 support and bug fixes
This commit is contained in:
@@ -32,6 +32,7 @@ typedef enum {
|
|||||||
EM4100,
|
EM4100,
|
||||||
HIDProx,
|
HIDProx,
|
||||||
PAC,
|
PAC,
|
||||||
|
H10301,
|
||||||
} FlipFridProtos;
|
} FlipFridProtos;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#include "flipfrid_scene_entrypoint.h"
|
#include "flipfrid_scene_entrypoint.h"
|
||||||
|
|
||||||
string_t menu_items[4];
|
string_t menu_items[4];
|
||||||
string_t menu_proto_items[3];
|
string_t menu_proto_items[4];
|
||||||
|
|
||||||
void flipfrid_scene_entrypoint_menu_callback(
|
void flipfrid_scene_entrypoint_menu_callback(
|
||||||
FlipFridState* context,
|
FlipFridState* context,
|
||||||
@@ -45,6 +45,10 @@ void flipfrid_scene_entrypoint_menu_callback(
|
|||||||
context->proto = PAC;
|
context->proto = PAC;
|
||||||
string_set_str(context->proto_name, "PAC/Stanley");
|
string_set_str(context->proto_name, "PAC/Stanley");
|
||||||
break;
|
break;
|
||||||
|
case H10301:
|
||||||
|
context->proto = H10301;
|
||||||
|
string_set_str(context->proto_name, "H10301");
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -70,13 +74,14 @@ void flipfrid_scene_entrypoint_on_enter(FlipFridState* context) {
|
|||||||
string_set(menu_items[3], "Load uids from file");
|
string_set(menu_items[3], "Load uids from file");
|
||||||
|
|
||||||
context->menu_proto_index = 0;
|
context->menu_proto_index = 0;
|
||||||
for(uint32_t i = 0; i < 3; i++) {
|
for(uint32_t i = 0; i < 4; i++) {
|
||||||
string_init(menu_proto_items[i]);
|
string_init(menu_proto_items[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
string_set(menu_proto_items[0], "EM4100");
|
string_set(menu_proto_items[0], "EM4100");
|
||||||
string_set(menu_proto_items[1], "HIDProx");
|
string_set(menu_proto_items[1], "HIDProx");
|
||||||
string_set(menu_proto_items[2], "PAC/Stanley");
|
string_set(menu_proto_items[2], "PAC/Stanley");
|
||||||
|
string_set(menu_proto_items[3], "H10301");
|
||||||
}
|
}
|
||||||
|
|
||||||
void flipfrid_scene_entrypoint_on_exit(FlipFridState* context) {
|
void flipfrid_scene_entrypoint_on_exit(FlipFridState* context) {
|
||||||
@@ -85,7 +90,7 @@ void flipfrid_scene_entrypoint_on_exit(FlipFridState* context) {
|
|||||||
string_clear(menu_items[i]);
|
string_clear(menu_items[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(uint32_t i = 0; i < 3; i++) {
|
for(uint32_t i = 0; i < 4; i++) {
|
||||||
string_clear(menu_proto_items[i]);
|
string_clear(menu_proto_items[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -114,7 +119,7 @@ void flipfrid_scene_entrypoint_on_event(FlipFridEvent event, FlipFridState* cont
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case InputKeyRight:
|
case InputKeyRight:
|
||||||
if(context->menu_proto_index < PAC) {
|
if(context->menu_proto_index < H10301) {
|
||||||
context->menu_proto_index++;
|
context->menu_proto_index++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -186,7 +191,7 @@ void flipfrid_scene_entrypoint_on_draw(Canvas* canvas, FlipFridState* context) {
|
|||||||
canvas_set_font(canvas, FontPrimary);
|
canvas_set_font(canvas, FontPrimary);
|
||||||
canvas_draw_str_aligned(canvas, 101, 4, AlignCenter, AlignTop, ">");
|
canvas_draw_str_aligned(canvas, 101, 4, AlignCenter, AlignTop, ">");
|
||||||
|
|
||||||
if(context->menu_proto_index < PAC) {
|
if(context->menu_proto_index < H10301) {
|
||||||
canvas_set_font(canvas, FontSecondary);
|
canvas_set_font(canvas, FontSecondary);
|
||||||
canvas_draw_str_aligned(
|
canvas_draw_str_aligned(
|
||||||
canvas,
|
canvas,
|
||||||
|
|||||||
@@ -51,6 +51,13 @@ bool flipfrid_load(FlipFridState* context, const char* file_path) {
|
|||||||
string_set_str(context->notification_msg, "Unsupported Key type");
|
string_set_str(context->notification_msg, "Unsupported Key type");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
} else if(context->proto == H10301) {
|
||||||
|
if(strcmp(string_get_cstr(temp_str), "H10301") != 0) {
|
||||||
|
FURI_LOG_E(TAG, "Unsupported Key type");
|
||||||
|
string_reset(context->notification_msg);
|
||||||
|
string_set_str(context->notification_msg, "Unsupported Key type");
|
||||||
|
break;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if(strcmp(string_get_cstr(temp_str), "HIDProx") != 0) {
|
if(strcmp(string_get_cstr(temp_str), "HIDProx") != 0) {
|
||||||
FURI_LOG_E(TAG, "Unsupported Key type");
|
FURI_LOG_E(TAG, "Unsupported Key type");
|
||||||
@@ -84,6 +91,13 @@ bool flipfrid_load(FlipFridState* context, const char* file_path) {
|
|||||||
string_set_str(context->notification_msg, "Incorrect Key length");
|
string_set_str(context->notification_msg, "Incorrect Key length");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
} else if(context->proto == H10301) {
|
||||||
|
if(string_size(context->data_str) != 8) {
|
||||||
|
FURI_LOG_E(TAG, "Incorrect Key length");
|
||||||
|
string_reset(context->notification_msg);
|
||||||
|
string_set_str(context->notification_msg, "Incorrect Key length");
|
||||||
|
break;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if(string_size(context->data_str) != 17) {
|
if(string_size(context->data_str) != 17) {
|
||||||
FURI_LOG_E(TAG, "Incorrect Key length");
|
FURI_LOG_E(TAG, "Incorrect Key length");
|
||||||
|
|||||||
@@ -60,6 +60,23 @@ uint8_t id_list_pac[17][4] = {
|
|||||||
{0xCA, 0xCA, 0xCA, 0xCA}, // From arha
|
{0xCA, 0xCA, 0xCA, 0xCA}, // From arha
|
||||||
};
|
};
|
||||||
|
|
||||||
|
uint8_t id_list_h[14][3] = {
|
||||||
|
{0x00, 0x00, 0x00}, // Null bytes
|
||||||
|
{0xFF, 0xFF, 0xFF}, // Only FF
|
||||||
|
{0x11, 0x11, 0x11}, // Only 11
|
||||||
|
{0x22, 0x22, 0x22}, // Only 22
|
||||||
|
{0x33, 0x33, 0x33}, // Only 33
|
||||||
|
{0x44, 0x44, 0x44}, // Only 44
|
||||||
|
{0x55, 0x55, 0x55}, // Only 55
|
||||||
|
{0x66, 0x66, 0x66}, // Only 66
|
||||||
|
{0x77, 0x77, 0x77}, // Only 77
|
||||||
|
{0x88, 0x88, 0x88}, // Only 88
|
||||||
|
{0x99, 0x99, 0x99}, // Only 99
|
||||||
|
{0x12, 0x34, 0x56}, // Incremental UID
|
||||||
|
{0x56, 0x34, 0x12}, // Decremental UID
|
||||||
|
{0xCA, 0xCA, 0xCA}, // From arha
|
||||||
|
};
|
||||||
|
|
||||||
void flipfrid_scene_run_attack_on_enter(FlipFridState* context) {
|
void flipfrid_scene_run_attack_on_enter(FlipFridState* context) {
|
||||||
context->attack_step = 0;
|
context->attack_step = 0;
|
||||||
context->dict = protocol_dict_alloc(lfrfid_protocols, LFRFIDProtocolMax);
|
context->dict = protocol_dict_alloc(lfrfid_protocols, LFRFIDProtocolMax);
|
||||||
@@ -68,6 +85,8 @@ void flipfrid_scene_run_attack_on_enter(FlipFridState* context) {
|
|||||||
context->protocol = protocol_dict_get_protocol_by_name(context->dict, "HIDProx");
|
context->protocol = protocol_dict_get_protocol_by_name(context->dict, "HIDProx");
|
||||||
} else if(context->proto == PAC) {
|
} else if(context->proto == PAC) {
|
||||||
context->protocol = protocol_dict_get_protocol_by_name(context->dict, "PAC/Stanley");
|
context->protocol = protocol_dict_get_protocol_by_name(context->dict, "PAC/Stanley");
|
||||||
|
} else if(context->proto == H10301) {
|
||||||
|
context->protocol = protocol_dict_get_protocol_by_name(context->dict, "H10301");
|
||||||
} else {
|
} else {
|
||||||
context->protocol = protocol_dict_get_protocol_by_name(context->dict, "EM4100");
|
context->protocol = protocol_dict_get_protocol_by_name(context->dict, "EM4100");
|
||||||
}
|
}
|
||||||
@@ -127,6 +146,21 @@ void flipfrid_scene_run_attack_on_tick(FlipFridState* context) {
|
|||||||
context->attack_step++;
|
context->attack_step++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
} else if(context->proto == H10301) {
|
||||||
|
context->payload[0] = id_list_h[context->attack_step][0];
|
||||||
|
context->payload[1] = id_list_h[context->attack_step][1];
|
||||||
|
context->payload[2] = id_list_h[context->attack_step][2];
|
||||||
|
|
||||||
|
if(context->attack_step == 13) {
|
||||||
|
context->attack_step = 0;
|
||||||
|
counter = 0;
|
||||||
|
context->is_attacking = false;
|
||||||
|
notification_message(context->notify, &sequence_blink_stop);
|
||||||
|
notification_message(context->notify, &sequence_single_vibro);
|
||||||
|
} else {
|
||||||
|
context->attack_step++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
} else {
|
} else {
|
||||||
context->payload[0] = id_list_hid[context->attack_step][0];
|
context->payload[0] = id_list_hid[context->attack_step][0];
|
||||||
context->payload[1] = id_list_hid[context->attack_step][1];
|
context->payload[1] = id_list_hid[context->attack_step][1];
|
||||||
@@ -172,6 +206,21 @@ void flipfrid_scene_run_attack_on_tick(FlipFridState* context) {
|
|||||||
context->payload[2] = 0x00;
|
context->payload[2] = 0x00;
|
||||||
context->payload[3] = 0x00;
|
context->payload[3] = 0x00;
|
||||||
|
|
||||||
|
if(context->attack_step == 255) {
|
||||||
|
context->attack_step = 0;
|
||||||
|
counter = 0;
|
||||||
|
context->is_attacking = false;
|
||||||
|
notification_message(context->notify, &sequence_blink_stop);
|
||||||
|
notification_message(context->notify, &sequence_single_vibro);
|
||||||
|
} else {
|
||||||
|
context->attack_step++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
} else if(context->proto == H10301) {
|
||||||
|
context->payload[0] = context->attack_step;
|
||||||
|
context->payload[1] = 0x00;
|
||||||
|
context->payload[2] = 0x00;
|
||||||
|
|
||||||
if(context->attack_step == 255) {
|
if(context->attack_step == 255) {
|
||||||
context->attack_step = 0;
|
context->attack_step = 0;
|
||||||
counter = 0;
|
counter = 0;
|
||||||
@@ -231,6 +280,24 @@ void flipfrid_scene_run_attack_on_tick(FlipFridState* context) {
|
|||||||
|
|
||||||
context->payload[context->key_index] = context->attack_step;
|
context->payload[context->key_index] = context->attack_step;
|
||||||
|
|
||||||
|
if(context->attack_step == 255) {
|
||||||
|
context->attack_step = 0;
|
||||||
|
counter = 0;
|
||||||
|
context->is_attacking = false;
|
||||||
|
notification_message(context->notify, &sequence_blink_stop);
|
||||||
|
notification_message(context->notify, &sequence_single_vibro);
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
context->attack_step++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
} else if(context->proto == H10301) {
|
||||||
|
context->payload[0] = context->data[0];
|
||||||
|
context->payload[1] = context->data[1];
|
||||||
|
context->payload[2] = context->data[2];
|
||||||
|
|
||||||
|
context->payload[context->key_index] = context->attack_step;
|
||||||
|
|
||||||
if(context->attack_step == 255) {
|
if(context->attack_step == 255) {
|
||||||
context->attack_step = 0;
|
context->attack_step = 0;
|
||||||
counter = 0;
|
counter = 0;
|
||||||
@@ -342,6 +409,44 @@ void flipfrid_scene_run_attack_on_tick(FlipFridState* context) {
|
|||||||
context->payload[i] = (uint8_t)strtol(temp_str, NULL, 16);
|
context->payload[i] = (uint8_t)strtol(temp_str, NULL, 16);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
} else if(context->proto == H10301) {
|
||||||
|
bool end_of_list = false;
|
||||||
|
while(true) {
|
||||||
|
string_reset(context->data_str);
|
||||||
|
if(!stream_read_line(context->uids_stream, context->data_str)) {
|
||||||
|
context->attack_step = 0;
|
||||||
|
counter = 0;
|
||||||
|
context->is_attacking = false;
|
||||||
|
notification_message(context->notify, &sequence_blink_stop);
|
||||||
|
notification_message(context->notify, &sequence_single_vibro);
|
||||||
|
stream_rewind(context->uids_stream);
|
||||||
|
end_of_list = true;
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
if(string_get_char(context->data_str, 0) == '#') continue;
|
||||||
|
if(string_size(context->data_str) != 7) break;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(end_of_list) break;
|
||||||
|
FURI_LOG_D(TAG, string_get_cstr(context->data_str));
|
||||||
|
if(string_size(context->data_str) != 7) {
|
||||||
|
context->attack_step = 0;
|
||||||
|
counter = 0;
|
||||||
|
context->is_attacking = false;
|
||||||
|
notification_message(context->notify, &sequence_blink_stop);
|
||||||
|
notification_message(context->notify, &sequence_error);
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
|
||||||
|
// string is valid, parse it in context->payload
|
||||||
|
for(uint8_t i = 0; i < 3; i++) {
|
||||||
|
char temp_str[3];
|
||||||
|
temp_str[0] = string_get_cstr(context->data_str)[i * 2];
|
||||||
|
temp_str[1] = string_get_cstr(context->data_str)[i * 2 + 1];
|
||||||
|
temp_str[2] = '\0';
|
||||||
|
context->payload[i] = (uint8_t)strtol(temp_str, NULL, 16);
|
||||||
|
}
|
||||||
|
break;
|
||||||
} else {
|
} else {
|
||||||
bool end_of_list = false;
|
bool end_of_list = false;
|
||||||
while(true) {
|
while(true) {
|
||||||
@@ -395,6 +500,12 @@ void flipfrid_scene_run_attack_on_tick(FlipFridState* context) {
|
|||||||
} else {
|
} else {
|
||||||
counter++;
|
counter++;
|
||||||
}
|
}
|
||||||
|
} else if(context->proto == H10301) {
|
||||||
|
if(counter > 10) {
|
||||||
|
counter = 0;
|
||||||
|
} else {
|
||||||
|
counter++;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if(counter > TIME_BETWEEN_CARDS) {
|
if(counter > TIME_BETWEEN_CARDS) {
|
||||||
counter = 0;
|
counter = 0;
|
||||||
@@ -474,6 +585,14 @@ void flipfrid_scene_run_attack_on_draw(Canvas* canvas, FlipFridState* context) {
|
|||||||
context->payload[1],
|
context->payload[1],
|
||||||
context->payload[2],
|
context->payload[2],
|
||||||
context->payload[3]);
|
context->payload[3]);
|
||||||
|
} else if(context->proto == H10301) {
|
||||||
|
snprintf(
|
||||||
|
uid,
|
||||||
|
sizeof(uid),
|
||||||
|
"%02X:%02X:%02X",
|
||||||
|
context->payload[0],
|
||||||
|
context->payload[1],
|
||||||
|
context->payload[2]);
|
||||||
} else {
|
} else {
|
||||||
snprintf(
|
snprintf(
|
||||||
uid,
|
uid,
|
||||||
|
|||||||
@@ -10,6 +10,12 @@ void flipfrid_center_displayed_key(FlipFridState* context, uint8_t index) {
|
|||||||
if(context->proto == EM4100) {
|
if(context->proto == EM4100) {
|
||||||
key_len = 16;
|
key_len = 16;
|
||||||
}
|
}
|
||||||
|
if(context->proto == PAC) {
|
||||||
|
key_len = 13;
|
||||||
|
}
|
||||||
|
if(context->proto == H10301) {
|
||||||
|
key_len = 10;
|
||||||
|
}
|
||||||
|
|
||||||
for(uint8_t i = 0; i < data_len; i++) {
|
for(uint8_t i = 0; i < data_len; i++) {
|
||||||
if(context->data[i] < 9) {
|
if(context->data[i] < 9) {
|
||||||
@@ -119,6 +125,7 @@ void flipfrid_scene_select_field_on_event(FlipFridEvent event, FlipFridState* co
|
|||||||
context->current_scene = SceneAttack;
|
context->current_scene = SceneAttack;
|
||||||
break;
|
break;
|
||||||
case InputKeyBack:
|
case InputKeyBack:
|
||||||
|
context->key_index = 0;
|
||||||
string_reset(context->notification_msg);
|
string_reset(context->notification_msg);
|
||||||
context->current_scene = SceneSelectFile;
|
context->current_scene = SceneSelectFile;
|
||||||
break;
|
break;
|
||||||
|
|||||||
8
assets/resources/rfidfuzzer/example_uids_h10301.txt
Normal file
8
assets/resources/rfidfuzzer/example_uids_h10301.txt
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# Example file, P.S. keep empty line at the end!
|
||||||
|
000000
|
||||||
|
F00000
|
||||||
|
E00000
|
||||||
|
FE0000
|
||||||
|
CAFE00
|
||||||
|
00CAFE
|
||||||
|
0000CA
|
||||||
Reference in New Issue
Block a user