From 6d2cd25a1cb01265e9351c40245acacb6cd55a11 Mon Sep 17 00:00:00 2001 From: Filip Kolinsky Date: Sun, 6 Sep 2026 16:10:23 +0200 Subject: [PATCH 1/3] Replace exit() with _exit() in PIUIO USB hook to prevent resource cleanup issues --- src/main/hook/patch/piuio-exit.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/hook/patch/piuio-exit.c b/src/main/hook/patch/piuio-exit.c index 12cb2c5..48f23ad 100644 --- a/src/main/hook/patch/piuio-exit.c +++ b/src/main/hook/patch/piuio-exit.c @@ -1,3 +1,4 @@ +#include #include "capnhook/hook/usbhook.h" @@ -65,7 +66,7 @@ static enum cnh_result patch_piuio_exit_usbhook(struct cnh_usbhook_irp *irp) if (((~irp->ctrl_buffer.bytes[1]) & (1 << 1)) && ((~irp->ctrl_buffer.bytes[1]) & (1 << 6))) { log_info("Exit on service + test enabled and hit, bye"); - exit(0); + _exit(0); } } } From 9835146b5cb537130dda37e605232a616fa14b7d Mon Sep 17 00:00:00 2001 From: Filip Kolinsky Date: Sun, 6 Sep 2026 16:09:49 +0200 Subject: [PATCH 2/3] Fix Fiesta2 locking up when USB profile is presented --- src/main/hook/patch/hasp.c | 2 ++ src/main/sec/hasp/old/hasp.c | 11 +++++++++++ src/main/sec/hasp/old/hasp.h | 2 ++ 3 files changed, 15 insertions(+) diff --git a/src/main/hook/patch/hasp.c b/src/main/hook/patch/hasp.c index 43c7f93..bd7fbcb 100644 --- a/src/main/hook/patch/hasp.c +++ b/src/main/hook/patch/hasp.c @@ -74,6 +74,8 @@ void patch_hasp_init(const uint8_t *key_data, size_t len) util_patch_function((uintptr_t) func_api_decrypt, sec_hasp_api_decrypt); util_patch_function((uintptr_t) func_api_getid, sec_hasp_api_getid); + util_patch_function(0x80dbd50, sec_hasp_api_get_sessioninfo); + sec_hasp_init(key_data, len); log_info("Initialized"); diff --git a/src/main/sec/hasp/old/hasp.c b/src/main/sec/hasp/old/hasp.c index fc3d234..86373e2 100644 --- a/src/main/sec/hasp/old/hasp.c +++ b/src/main/sec/hasp/old/hasp.c @@ -93,5 +93,16 @@ int sec_hasp_api_decrypt(int handle, void *buffer, size_t length) log_warn("Missing key for request %s", buf); free(buf); + return 0; +} + +int sec_hasp_api_get_sessioninfo(int handle, const char *format, const char **info) +{ + static const char dummy_info[] = "p "; + + if (info) { + *info = dummy_info; + } + return 0; } \ No newline at end of file diff --git a/src/main/sec/hasp/old/hasp.h b/src/main/sec/hasp/old/hasp.h index 8236f9b..35a47ab 100644 --- a/src/main/sec/hasp/old/hasp.h +++ b/src/main/sec/hasp/old/hasp.h @@ -32,4 +32,6 @@ unsigned int sec_hasp_api_getid(void); int sec_hasp_api_decrypt(int handle, void *buffer, size_t length); +int sec_hasp_api_get_sessioninfo(int handle, const char *format, const char **info); + #endif \ No newline at end of file From 9caf433ec2e3bed6be5b4340f83f04860d7691a6 Mon Sep 17 00:00:00 2001 From: Filip Kolinsky Date: Sun, 6 Sep 2026 22:06:49 +0200 Subject: [PATCH 3/3] Fix now only affects Fiesta2 --- src/main/hook/f2/main.c | 3 ++- src/main/hook/patch/hasp.c | 12 ++++++++++-- src/main/hook/patch/hasp.h | 9 ++++++++- src/main/hook/pri/main.c | 3 ++- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/main/hook/f2/main.c b/src/main/hook/f2/main.c index 038318d..0247ed0 100644 --- a/src/main/hook/f2/main.c +++ b/src/main/hook/f2/main.c @@ -181,7 +181,8 @@ static void f2hook_patch_dongle_init() patch_hasp_init( (const uint8_t *) _binary_f2hook_hasp_key_start, ((uintptr_t) &_binary_f2hook_hasp_key_end - - (uintptr_t) &_binary_f2hook_hasp_key_start)); + (uintptr_t) &_binary_f2hook_hasp_key_start), + 0x80dbd50); } static void f2hook_patch_hdd_check_init() diff --git a/src/main/hook/patch/hasp.c b/src/main/hook/patch/hasp.c index bd7fbcb..9d3d3e4 100644 --- a/src/main/hook/patch/hasp.c +++ b/src/main/hook/patch/hasp.c @@ -1,5 +1,7 @@ #define LOG_MODULE "patch-hasp" +#include + #include "sec/hasp/old/hasp.h" #include "util/log.h" @@ -26,7 +28,10 @@ static const uint8_t patch_hasp_login_sig[] = { static const uint8_t patch_hasp_id_sig[] = { 0x53, 0x83, 0xEC, 0x48, 0xC7, 0x44, 0x24, 0x10}; -void patch_hasp_init(const uint8_t *key_data, size_t len) +void patch_hasp_init( + const uint8_t *key_data, + size_t len, + uintptr_t addr_get_sessioninfo) { void *func_api_login; void *func_api_logout; @@ -74,7 +79,10 @@ void patch_hasp_init(const uint8_t *key_data, size_t len) util_patch_function((uintptr_t) func_api_decrypt, sec_hasp_api_decrypt); util_patch_function((uintptr_t) func_api_getid, sec_hasp_api_getid); - util_patch_function(0x80dbd50, sec_hasp_api_get_sessioninfo); + if (addr_get_sessioninfo) { + log_debug("ApiGetSessionInfo at 0x%" PRIxPTR, addr_get_sessioninfo); + util_patch_function(addr_get_sessioninfo, sec_hasp_api_get_sessioninfo); + } sec_hasp_init(key_data, len); diff --git a/src/main/hook/patch/hasp.h b/src/main/hook/patch/hasp.h index c2295bb..eacaece 100644 --- a/src/main/hook/patch/hasp.h +++ b/src/main/hook/patch/hasp.h @@ -4,12 +4,19 @@ #ifndef PATCH_HASP_H #define PATCH_HASP_H +#include +#include + /** * Initialize the patch module * * @param key_data Pointer to loaded key data (key table) * @param len Length of the buffer + * @param addr_get_sessioninfo Address of hasp_get_sessioninfo function (0 if not used) */ -void patch_hasp_init(const uint8_t *key_data, size_t len); +void patch_hasp_init( + const uint8_t *key_data, + size_t len, + uintptr_t addr_get_sessioninfo); #endif \ No newline at end of file diff --git a/src/main/hook/pri/main.c b/src/main/hook/pri/main.c index 005e30d..528a245 100644 --- a/src/main/hook/pri/main.c +++ b/src/main/hook/pri/main.c @@ -197,7 +197,8 @@ static void prihook_patch_dongle_init() patch_hasp_init( (const uint8_t *) _binary_prihook_hasp_key_start, ((uintptr_t) &_binary_prihook_hasp_key_end - - (uintptr_t) &_binary_prihook_hasp_key_start)); + (uintptr_t) &_binary_prihook_hasp_key_start), + 0); } static void prihook_patch_hdd_check_init()