Eric Betts 8 месяцев назад
Родитель
Сommit
35c3d9154f
6 измененных файлов с 129 добавлено и 12 удалено
  1. 0 1
      README.md
  2. 1 0
      scenes/weebo_scene_config.h
  3. 116 0
      scenes/weebo_scene_emulate.c
  4. 9 0
      scenes/weebo_scene_saved_menu.c
  5. 0 11
      scenes/weebo_scene_write.c
  6. 3 0
      weebo_i.h

+ 0 - 1
README.md

@@ -10,5 +10,4 @@ A flipper zero NTAG215 writer
 
  - Parse details of Flipper NFC files
  - Save changes to Flipper NFC files
- - Support either bin or Flipper NFC for template
  - Remixer

+ 1 - 0
scenes/weebo_scene_config.h

@@ -4,3 +4,4 @@ ADD_SCENE(weebo, file_select, FileSelect)
 ADD_SCENE(weebo, saved_menu, SavedMenu)
 ADD_SCENE(weebo, write, Write)
 ADD_SCENE(weebo, write_card_success, WriteCardSuccess)
+ADD_SCENE(weebo, emulate, Emulate)

+ 116 - 0
scenes/weebo_scene_emulate.c

@@ -0,0 +1,116 @@
+#include "../weebo_i.h"
+#include <nfc/protocols/mf_ultralight/mf_ultralight_listener.h>
+
+#define TAG "SceneEmulate"
+
+void weebo_scene_emulate_calculate_pwd(uint8_t* uid, uint8_t* pwd) {
+    pwd[0] = uid[1] ^ uid[3] ^ 0xAA;
+    pwd[1] = uid[2] ^ uid[4] ^ 0x55;
+    pwd[2] = uid[3] ^ uid[5] ^ 0xAA;
+    pwd[3] = uid[4] ^ uid[6] ^ 0x55;
+}
+
+void weebo_scene_emulate_remix(Weebo* weebo) {
+    uint8_t PWD[4];
+    uint8_t UID[8];
+    uint8_t modified[NTAG215_SIZE];
+    MfUltralightData* data = mf_ultralight_alloc();
+
+    //stop listener
+    FURI_LOG_D(TAG, "Stopping listener");
+    nfc_listener_stop(weebo->listener);
+    nfc_listener_free(weebo->listener);
+    weebo->listener = NULL;
+
+    //random uid
+    FURI_LOG_D(TAG, "Generating random UID");
+    UID[0] = 0x04;
+    furi_hal_random_fill_buf(UID + 1, 6);
+    UID[7] = UID[3] ^ UID[4] ^ UID[5] ^ UID[6];
+    memcpy(weebo->figure + NFC3D_UID_OFFSET, UID, 8);
+    memcpy(data->iso14443_3a_data->uid, UID, 7);
+
+    //pack
+    nfc3d_amiibo_pack(&weebo->amiiboKeys, weebo->figure, modified);
+
+    //copy data in
+    nfc_device_copy_data(weebo->nfc_device, NfcProtocolMfUltralight, data);
+    for(size_t i = 0; i < 130; i++) {
+        memcpy(
+            data->page[i].data, modified + i * MF_ULTRALIGHT_PAGE_SIZE, MF_ULTRALIGHT_PAGE_SIZE);
+    }
+
+    //new pwd
+    weebo_scene_emulate_calculate_pwd(data->iso14443_3a_data->uid, PWD);
+    memcpy(data->page[133].data, PWD, sizeof(PWD));
+
+    //set data
+    nfc_device_set_data(weebo->nfc_device, NfcProtocolMfUltralight, data);
+
+    //start listener
+    FURI_LOG_D(TAG, "Starting listener");
+    weebo->listener = nfc_listener_alloc(weebo->nfc, NfcProtocolMfUltralight, data);
+    nfc_listener_start(weebo->listener, NULL, NULL);
+
+    mf_ultralight_free(data);
+}
+
+void weebo_scene_emulate_widget_callback(GuiButtonType result, InputType type, void* context) {
+    furi_assert(context);
+    Weebo* weebo = context;
+
+    if(type == InputTypeShort) {
+        view_dispatcher_send_custom_event(weebo->view_dispatcher, result);
+    }
+}
+
+void weebo_scene_emulate_on_enter(void* context) {
+    Weebo* weebo = context;
+    Widget* widget = weebo->widget;
+
+    nfc_device_load(weebo->nfc_device, furi_string_get_cstr(weebo->load_path));
+    const MfUltralightData* data = nfc_device_get_data(weebo->nfc_device, NfcProtocolMfUltralight);
+    weebo->listener = nfc_listener_alloc(weebo->nfc, NfcProtocolMfUltralight, data);
+    nfc_listener_start(weebo->listener, NULL, NULL);
+
+    FuriString* info_str = furi_string_alloc();
+    furi_string_cat_printf(info_str, "Emulating");
+    widget_add_string_element(
+        widget, 64, 5, AlignCenter, AlignCenter, FontSecondary, furi_string_get_cstr(info_str));
+
+    widget_add_button_element(
+        widget, GuiButtonTypeCenter, "Remix", weebo_scene_emulate_widget_callback, weebo);
+
+    furi_string_free(info_str);
+    weebo_blink_start(weebo);
+    view_dispatcher_switch_to_view(weebo->view_dispatcher, WeeboViewWidget);
+}
+
+bool weebo_scene_emulate_on_event(void* context, SceneManagerEvent event) {
+    Weebo* weebo = context;
+    bool consumed = false;
+
+    if(event.type == SceneManagerEventTypeCustom) {
+        scene_manager_set_scene_state(weebo->scene_manager, WeeboSceneEmulate, event.event);
+        if(event.event == GuiButtonTypeCenter) {
+            weebo_scene_emulate_remix(weebo);
+
+            consumed = true;
+        }
+    }
+
+    return consumed;
+}
+
+void weebo_scene_emulate_on_exit(void* context) {
+    Weebo* weebo = context;
+
+    if(weebo->listener) {
+        nfc_listener_stop(weebo->listener);
+        nfc_listener_free(weebo->listener);
+        weebo->listener = NULL;
+    }
+
+    widget_reset(weebo->widget);
+    weebo_blink_stop(weebo);
+}

+ 9 - 0
scenes/weebo_scene_saved_menu.c

@@ -4,6 +4,7 @@
 
 enum SubmenuIndex {
     SubmenuIndexWrite = 0,
+    SubmenuIndexEmulate,
 };
 
 void weebo_scene_saved_menu_submenu_callback(void* context, uint32_t index) {
@@ -18,6 +19,8 @@ void weebo_scene_saved_menu_on_enter(void* context) {
 
     submenu_add_item(
         submenu, "Write", SubmenuIndexWrite, weebo_scene_saved_menu_submenu_callback, weebo);
+    submenu_add_item(
+        submenu, "Emulate", SubmenuIndexEmulate, weebo_scene_saved_menu_submenu_callback, weebo);
 
     submenu_set_selected_item(
         submenu, scene_manager_get_scene_state(weebo->scene_manager, WeeboSceneSavedMenu));
@@ -33,7 +36,13 @@ bool weebo_scene_saved_menu_on_event(void* context, SceneManagerEvent event) {
         if(event.event == SubmenuIndexWrite) {
             scene_manager_next_scene(weebo->scene_manager, WeeboSceneWrite);
             consumed = true;
+        } else if(event.event == SubmenuIndexEmulate) {
+            scene_manager_next_scene(weebo->scene_manager, WeeboSceneEmulate);
+            consumed = true;
         }
+    } else if(event.type == SceneManagerEventTypeBack) {
+        consumed = scene_manager_search_and_switch_to_previous_scene(
+            weebo->scene_manager, WeeboSceneMainMenu);
     }
 
     return consumed;

+ 0 - 11
scenes/weebo_scene_write.c

@@ -60,19 +60,8 @@ NfcCommand weebo_scene_write_poller_callback(NfcGenericEvent event, void* contex
         }
         view_dispatcher_send_custom_event(weebo->view_dispatcher, WeeboCustomEventCardDetected);
 
-        FURI_LOG_D(
-            TAG,
-            "UID: %02X%02X%02X%02X%02X%02X",
-            data->iso14443_3a_data->uid[0],
-            data->iso14443_3a_data->uid[1],
-            data->iso14443_3a_data->uid[2],
-            data->iso14443_3a_data->uid[3],
-            data->iso14443_3a_data->uid[4],
-            data->iso14443_3a_data->uid[5]);
-
         uint8_t PWD[4];
         weebo_scene_write_calculate_pwd(data->iso14443_3a_data->uid, PWD);
-        FURI_LOG_D(TAG, "PWD: %02X%02X%02X%02X", PWD[0], PWD[1], PWD[2], PWD[3]);
 
         for(size_t p = 0; p < 2; p++) {
             for(size_t i = 0; i < MF_ULTRALIGHT_PAGE_SIZE; i++) {

+ 3 - 0
weebo_i.h

@@ -23,8 +23,10 @@
 
 #include <lib/nfc/nfc.h>
 #include <nfc/nfc_poller.h>
+#include <nfc/nfc_listener.h>
 #include <nfc/nfc_device.h>
 #include <nfc/protocols/mf_ultralight/mf_ultralight_poller.h>
+#include <nfc/protocols/mf_ultralight/mf_ultralight_listener.h>
 
 #include <lib/toolbox/stream/stream.h>
 #include <lib/toolbox/stream/file_stream.h>
@@ -83,6 +85,7 @@ struct Weebo {
 
     Nfc* nfc;
     NfcPoller* poller;
+    NfcListener* listener;
     NfcDevice* nfc_device;
 
     FuriString* load_path;