From 321f2d8d504e8362543f36e5c0337bd000b89eac Mon Sep 17 00:00:00 2001 From: gid9798 <30450294+gid9798@users.noreply.github.com> Date: Fri, 2 Jun 2023 17:48:21 +0300 Subject: [PATCH] Fuzzers app: main menu v0 --- .../pacs_fuzzer/helpers/fuzzer_types.h | 9 ++ .../external/pacs_fuzzer/helpers/protocol.c | 92 +++++++++++++++++++ .../external/pacs_fuzzer/helpers/protocol.h | 28 ++++++ .../external/pacs_fuzzer/views/main_menu.c | 83 ++++++++++++++++- 4 files changed, 210 insertions(+), 2 deletions(-) create mode 100644 applications/external/pacs_fuzzer/helpers/protocol.c create mode 100644 applications/external/pacs_fuzzer/helpers/protocol.h diff --git a/applications/external/pacs_fuzzer/helpers/fuzzer_types.h b/applications/external/pacs_fuzzer/helpers/fuzzer_types.h index 7b6f5a680..cfc9274d1 100644 --- a/applications/external/pacs_fuzzer/helpers/fuzzer_types.h +++ b/applications/external/pacs_fuzzer/helpers/fuzzer_types.h @@ -3,6 +3,15 @@ #include #include +// TODO replace it +typedef enum { + FuzzerMainMenuIndexDefaultValues = 0, + FuzzerMainMenuIndexLoadFile, + FuzzerMainMenuIndexLoadFileCustomUids, + + FuzzerMainMenuIndexMax, +} FuzzerMainMenuIndex; + typedef enum { FuzzerViewIDMain, } FuzzerViewID; \ No newline at end of file diff --git a/applications/external/pacs_fuzzer/helpers/protocol.c b/applications/external/pacs_fuzzer/helpers/protocol.c new file mode 100644 index 000000000..072749179 --- /dev/null +++ b/applications/external/pacs_fuzzer/helpers/protocol.c @@ -0,0 +1,92 @@ +#include "protocol.h" + +#define DS1990_DATA_SIZE (8) +#define Metakom_DATA_SIZE (4) +#define Cyfral_DATA_SIZE (2) + +const uint8_t uid_list_ds1990[][DS1990_DATA_SIZE] = { + {0x01, 0xBE, 0x40, 0x11, 0x5A, 0x36, 0x00, 0xE1}, //– код универсального ключа, для Vizit + {0x01, 0xBE, 0x40, 0x11, 0x5A, 0x56, 0x00, 0xBB}, //- проверен работает + {0x01, 0xBE, 0x40, 0x11, 0x00, 0x00, 0x00, 0x77}, //- проверен работает + {0x01, 0xBE, 0x40, 0x11, 0x0A, 0x00, 0x00, 0x1D}, //- проверен работает Визит иногда КЕЙМАНЫ + {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F}, //- проверен(метаком, цифрал, ВИЗИТ). + {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x9B}, //- проверен Визит, Метакомы, КОНДОР + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x14}, //???-Открываает 98% Метаком и некоторые Цифрал + {0x01, 0x00, 0x00, 0x00, 0x00, 0x90, 0x19, 0xFF}, //???-Отлично работает на старых домофонах + {0x01, 0x6F, 0x2E, 0x88, 0x8A, 0x00, 0x00, 0x4D}, //???-Открывать что-то должен + {0x01, 0x53, 0xD4, 0xFE, 0x00, 0x00, 0x7E, 0x88}, //???-Cyfral, Metakom + {0x01, 0x53, 0xD4, 0xFE, 0x00, 0x00, 0x00, 0x6F}, //???-домофоны Визит (Vizit) - до 99% + {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D}, //???-домофоны Cyfral CCD-20 - до 70% + {0x01, 0x00, 0xBE, 0x11, 0xAA, 0x00, 0x00, 0xFB}, //???-домофоны Кейман (KEYMAN) + {0x01, 0x76, 0xB8, 0x2E, 0x0F, 0x00, 0x00, 0x5C}, //???-домофоны Форвард + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // Null bytes + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x14}, // Only FF + {0x01, 0x78, 0x00, 0x48, 0xFD, 0xFF, 0xFF, 0xD1}, // StarNew Uni5 + {0x01, 0xA9, 0xE4, 0x3C, 0x09, 0x00, 0x00, 0xE6}, // Eltis Uni +}; + +const uint8_t uid_list_metakom[][Metakom_DATA_SIZE] = { + {0x00, 0x00, 0x00, 0x00}, // Null bytes + {0xFF, 0xFF, 0xFF, 0xFF}, // Only FF + {0x11, 0x11, 0x11, 0x11}, // Only 11 + {0x22, 0x22, 0x22, 0x22}, // Only 22 + {0x33, 0x33, 0x33, 0x33}, // Only 33 + {0x44, 0x44, 0x44, 0x44}, // Only 44 + {0x55, 0x55, 0x55, 0x55}, // Only 55 + {0x66, 0x66, 0x66, 0x66}, // Only 66 + {0x77, 0x77, 0x77, 0x77}, // Only 77 + {0x88, 0x88, 0x88, 0x88}, // Only 88 + {0x99, 0x99, 0x99, 0x99}, // Only 99 + {0x12, 0x34, 0x56, 0x78}, // Incremental UID + {0x9A, 0x78, 0x56, 0x34}, // Decremental UID + {0x04, 0xd0, 0x9b, 0x0d}, // ?? + {0x34, 0x00, 0x29, 0x3d}, // ?? + {0x04, 0xdf, 0x00, 0x00}, // ?? + {0xCA, 0xCA, 0xCA, 0xCA}, // ?? +}; + +const uint8_t uid_list_cyfral[][Cyfral_DATA_SIZE] = { + {0x00, 0x00}, // Null bytes + {0xFF, 0xFF}, // Only FF + {0x11, 0x11}, // Only 11 + {0x22, 0x22}, // Only 22 + {0x33, 0x33}, // Only 33 + {0x44, 0x44}, // Only 44 + {0x55, 0x55}, // Only 55 + {0x66, 0x66}, // Only 66 + {0x77, 0x77}, // Only 77 + {0x88, 0x88}, // Only 88 + {0x99, 0x99}, // Only 99 + {0x12, 0x34}, // Incremental UID + {0x56, 0x34}, // Decremental UID + {0xCA, 0xCA}, // ?? + {0x8E, 0xC9}, // Elevator code + {0x6A, 0x50}, // VERY fresh code from smartkey +}; + +const FuzzerProtocol fuzzer_proto_items[] = { + [DS1990] = + { + .name = "DS1990", + .data_size = DS1990_DATA_SIZE, + .dict = + {.val = (const uint8_t*)&uid_list_ds1990, + .len = sizeof(uid_list_ds1990) / DS1990_DATA_SIZE}, + }, + [Metakom] = + { + .name = "Metakom", + .data_size = Metakom_DATA_SIZE, + .dict = + {.val = (const uint8_t*)&uid_list_metakom, + .len = sizeof(uid_list_metakom) / Metakom_DATA_SIZE}, + }, + [Cyfral] = + { + .name = "Cyfral", + .data_size = Cyfral_DATA_SIZE, + .dict = + {.val = (const uint8_t*)&uid_list_cyfral, + .len = sizeof(uid_list_cyfral) / Cyfral_DATA_SIZE}, + }, +}; \ No newline at end of file diff --git a/applications/external/pacs_fuzzer/helpers/protocol.h b/applications/external/pacs_fuzzer/helpers/protocol.h new file mode 100644 index 000000000..c43e7f128 --- /dev/null +++ b/applications/external/pacs_fuzzer/helpers/protocol.h @@ -0,0 +1,28 @@ +#pragma once + +#include + +typedef enum { + DS1990, + Metakom, + Cyfral, + // Reserved + FuzzerProtoMax, +} FuzzerProtos; + +struct ProtoDict { + const uint8_t* val; + const uint8_t len; +}; + +typedef struct ProtoDict ProtoDict; + +struct FuzzerProtocol { + const char* name; + const uint8_t data_size; + const ProtoDict dict; +}; + +typedef struct FuzzerProtocol FuzzerProtocol; + +extern const FuzzerProtocol fuzzer_proto_items[]; \ No newline at end of file diff --git a/applications/external/pacs_fuzzer/views/main_menu.c b/applications/external/pacs_fuzzer/views/main_menu.c index 7db7d26f3..2d55cc143 100644 --- a/applications/external/pacs_fuzzer/views/main_menu.c +++ b/applications/external/pacs_fuzzer/views/main_menu.c @@ -4,12 +4,21 @@ #include #include +#include "../helpers/protocol.h" + +const char* main_menu_items[FuzzerMainMenuIndexMax] = { + [FuzzerMainMenuIndexDefaultValues] = "Default Values", + [FuzzerMainMenuIndexLoadFile] = "Load File", + [FuzzerMainMenuIndexLoadFileCustomUids] = "Load UIDs from file", +}; + struct FuzzerViewMain { View* view; FuzzerViewMainCallback callback; void* context; }; +// TODO Furi string for procol name typedef struct { uint8_t proto_index; uint8_t menu_index; @@ -26,8 +35,30 @@ void fuzzer_view_main_set_callback( } void fuzzer_view_main_draw(Canvas* canvas, FuzzerViewMainModel* model) { - UNUSED(canvas); - UNUSED(model); + canvas_clear(canvas); + canvas_set_color(canvas, ColorBlack); + + if(model->menu_index > 0) { + canvas_set_font(canvas, FontSecondary); + canvas_draw_str_aligned( + canvas, 64, 24, AlignCenter, AlignTop, main_menu_items[model->menu_index - 1]); + } + + canvas_set_font(canvas, FontPrimary); + canvas_draw_str_aligned( + canvas, 64, 36, AlignCenter, AlignTop, main_menu_items[model->menu_index]); + + if(model->menu_index < FuzzerMainMenuIndexMax) { + canvas_set_font(canvas, FontSecondary); + canvas_draw_str_aligned( + canvas, 64, 48, AlignCenter, AlignTop, main_menu_items[model->menu_index + 1]); + } + + canvas_set_font(canvas, FontPrimary); + canvas_draw_str_aligned(canvas, 27, 4, AlignCenter, AlignTop, "<"); + canvas_draw_str_aligned( + canvas, 64, 4, AlignCenter, AlignTop, fuzzer_proto_items[model->proto_index].name); + canvas_draw_str_aligned(canvas, 101, 4, AlignCenter, AlignTop, ">"); } bool fuzzer_view_main_input(InputEvent* event, void* context) { @@ -38,6 +69,54 @@ bool fuzzer_view_main_input(InputEvent* event, void* context) { (event->type == InputTypeLong || event->type == InputTypeShort)) { fuzzer_view_main->callback(FuzzerCustomEventViewMainBack, fuzzer_view_main->context); return true; + } else if(event->key == InputKeyDown && event->type == InputTypeShort) { + with_view_model( + fuzzer_view_main->view, + FuzzerViewMainModel * model, + { + if(model->menu_index < (FuzzerMainMenuIndexMax - 1)) { + model->menu_index++; + } + }, + true); + return true; + } else if(event->key == InputKeyUp && event->type == InputTypeShort) { + with_view_model( + fuzzer_view_main->view, + FuzzerViewMainModel * model, + { + if(model->menu_index != 0) { + model->menu_index--; + } + }, + true); + return true; + } else if(event->key == InputKeyLeft && event->type == InputTypeShort) { + with_view_model( + fuzzer_view_main->view, + FuzzerViewMainModel * model, + { + if(model->proto_index != 0) { + model->proto_index--; + } else { + model->proto_index = (FuzzerProtoMax - 1); + } + }, + true); + return true; + } else if(event->key == InputKeyRight && event->type == InputTypeShort) { + with_view_model( + fuzzer_view_main->view, + FuzzerViewMainModel * model, + { + if(model->proto_index == (FuzzerProtoMax - 1)) { + model->proto_index = 0; + } else { + model->proto_index++; + } + }, + true); + return true; } return true;