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 43c7f93..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,6 +79,11 @@ 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); + 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); log_info("Initialized"); 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/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); } } } 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() 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