run bruteforce in separate thread

This commit is contained in:
MX 2022-09-08 17:39:33 +03:00
parent 123bd6fc65
commit 61e76bc85c
No known key found for this signature in database
GPG Key ID: 6C4C311DFD4B4AB5
3 changed files with 100 additions and 42 deletions

View File

@ -34,32 +34,42 @@ FuriHalSubGhzPreset str_to_preset(string_t preset) {
void subbrute_emit(SubBruteState* context) {
//FURI_LOG_D(TAG, string_get_cstr(context->flipper_format_string));
furi_hal_subghz_start_async_tx(subghz_transmitter_yield, context->transmitter);
while(!(furi_hal_subghz_is_async_tx_complete())) {
furi_delay_ms(5);
}
furi_hal_subghz_stop_async_tx();
}
void prepare_emit(SubBruteState* context) {
furi_hal_subghz_init();
context->transmitter =
subghz_transmitter_alloc_init(context->environment, string_get_cstr(context->protocol));
subghz_transmitter_deserialize(context->transmitter, context->flipper_format);
furi_hal_subghz_reset();
furi_hal_subghz_load_preset(str_to_preset(context->preset));
furi_hal_subghz_set_frequency_and_path(context->frequency);
context->frequency_cal = furi_hal_subghz_set_frequency_and_path(context->frequency);
furi_hal_subghz_start_async_tx(subghz_transmitter_yield, context->transmitter);
while(!(furi_hal_subghz_is_async_tx_complete())) {
furi_delay_ms(1);
}
furi_hal_subghz_stop_async_tx();
subghz_transmitter_stop(context->transmitter);
furi_hal_subghz_idle();
subghz_transmitter_free(context->transmitter);
}
void prepare_emit(SubBruteState* context) {
UNUSED(context);
furi_hal_subghz_init();
//furi_hal_subghz_set_frequency_and_path(context->frequency);
//furi_hal_subghz_reset();
}
void clear_emit(SubBruteState* context) {
UNUSED(context);
furi_hal_subghz_stop_async_tx();
furi_hal_subghz_idle();
furi_hal_subghz_sleep();
subghz_transmitter_free(context->transmitter);
}
/*
void subbrute_send_raw_packet(SubBruteState* context) {
@ -166,7 +176,6 @@ void subbrute_send_packet_parsed(SubBruteState* context) {
stream_clean(context->stream);
stream_write_string(context->stream, context->flipper_format_string);
subghz_transmitter_deserialize(context->transmitter, context->flipper_format);
subbrute_emit(context);
}
@ -180,35 +189,10 @@ void subbrute_send_packet(SubBruteState* context) {
string_clear(context->flipper_format_string);
}
void subbrute_scene_run_attack_on_enter(SubBruteState* context) {
if(!toSave) {
if(context->attack == SubBruteAttackLoadFile) {
max_value = 0xFF;
} else {
string_t max_value_s;
string_init(max_value_s);
for(uint8_t i = 0; i < context->bit; i++) {
string_cat_printf(max_value_s, "1");
}
max_value = (uint64_t)strtol(string_get_cstr(max_value_s), NULL, 2);
string_clear(max_value_s);
}
context->str_index = (context->key_index * 3);
string_init_set(context->candidate, context->key);
context->flipper_format = flipper_format_string_alloc();
context->stream = flipper_format_get_raw_stream(context->flipper_format);
context->environment = subghz_environment_alloc();
context->transmitter = subghz_transmitter_alloc_init(
context->environment, string_get_cstr(context->protocol));
prepare_emit(context);
} else {
toSave = false;
}
}
void subbrute_scene_run_attack_on_exit(SubBruteState* context) {
if(!toSave) {
clear_emit(context);
furi_thread_free(context->bruthread);
}
}
@ -237,6 +221,65 @@ void subbrute_scene_run_attack_on_tick(SubBruteState* context) {
subbrute_counter++;
}
}
void subbrute_run_timer(SubBruteState* context) {
while(true) {
if(context->close_thread_please) {
context->is_thread_running = false;
break;
}
//furi_delay_ms(10);
subbrute_scene_run_attack_on_tick(context);
}
}
// entrypoint for worker
static int32_t subbrute_worker_thread(void* ctx) {
SubBruteState* app = ctx;
subbrute_run_timer(app);
//app->is_stop_running = false;
//app->request_exit = false;
return 0;
}
void start_bruthread(SubBruteState* app) {
//furi_assert(!app->is_thread_running);
//app->is_stop_running = true;
if(!app->is_thread_running) {
furi_thread_start(app->bruthread);
app->is_thread_running = true;
}
}
void subbrute_scene_run_attack_on_enter(SubBruteState* context) {
if(!toSave) {
if(context->attack == SubBruteAttackLoadFile) {
max_value = 0xFF;
} else {
string_t max_value_s;
string_init(max_value_s);
for(uint8_t i = 0; i < context->bit; i++) {
string_cat_printf(max_value_s, "1");
}
max_value = (uint64_t)strtol(string_get_cstr(max_value_s), NULL, 2);
string_clear(max_value_s);
}
context->str_index = (context->key_index * 3);
string_init_set(context->candidate, context->key);
context->flipper_format = flipper_format_string_alloc();
context->stream = flipper_format_get_raw_stream(context->flipper_format);
context->environment = subghz_environment_alloc();
//context->transmitter = subghz_transmitter_alloc_init(
// context->environment, string_get_cstr(context->protocol));
prepare_emit(context);
context->bruthread = furi_thread_alloc();
furi_thread_set_name(context->bruthread, "SubBrute Worker");
furi_thread_set_stack_size(context->bruthread, 2048);
furi_thread_set_context(context->bruthread, context);
furi_thread_set_callback(context->bruthread, subbrute_worker_thread);
} else {
toSave = false;
}
}
void subbrute_scene_run_attack_on_event(SubBruteEvent event, SubBruteState* context) {
if(event.evt_type == EventTypeKey) {
@ -266,16 +309,27 @@ void subbrute_scene_run_attack_on_event(SubBruteEvent event, SubBruteState* cont
case InputKeyOk:
if(!context->is_attacking) {
context->is_attacking = true;
start_bruthread(context);
notification_message(context->notify, &sequence_blink_start_blue);
} else {
context->is_attacking = false;
context->close_thread_please = true;
if(context->is_thread_running && context->bruthread) {
furi_thread_join(context->bruthread); // wait until thread is finished
}
context->close_thread_please = false;
notification_message(context->notify, &sequence_blink_stop);
notification_message(context->notify, &sequence_single_vibro);
}
break;
case InputKeyBack:
locked = false;
context->close_thread_please = true;
context->is_attacking = false;
if(context->is_thread_running && context->bruthread) {
furi_thread_join(context->bruthread); // wait until thread is finished
}
context->close_thread_please = false;
string_reset(context->notification_msg);
context->payload = 0x00;
subbrute_counter = 0;

View File

@ -238,7 +238,7 @@ int32_t subbrute_start(void* p) {
subbrute_scene_select_field_on_tick(subbrute_state);
break;
case SceneAttack:
subbrute_scene_run_attack_on_tick(subbrute_state);
//subbrute_scene_run_attack_on_tick(subbrute_state);
break;
case SceneEntryPoint:
subbrute_scene_entrypoint_on_tick(subbrute_state);

View File

@ -56,6 +56,8 @@ typedef struct {
// Application stuff
bool is_running;
bool is_attacking;
bool is_thread_running;
bool close_thread_please;
SubBruteScene current_scene;
SubBruteScene previous_scene;
NotificationApp* notify;
@ -65,6 +67,7 @@ typedef struct {
Popup* popup;
// SubGhz Stuff
FuriThread* bruthread;
FlipperFormat* flipper_format;
SubGhzEnvironment* environment;
SubGhzTransmitter* transmitter;
@ -75,6 +78,7 @@ typedef struct {
Stream* stream;
string_t protocol;
uint32_t frequency;
uint32_t frequency_cal;
uint32_t repeat;
uint32_t bit;
string_t key;