From 6a2682eaafcd70514ed895f0a9bb7856c18eefad Mon Sep 17 00:00:00 2001 From: Hay1tsme Date: Tue, 20 Aug 2024 10:16:18 -0400 Subject: [PATCH] sao: port clock changes from dniel segatools --- platform/clock.c | 62 ++++++++++++++---------------------------------- platform/clock.h | 1 + saohook/unity.c | 3 +++ 3 files changed, 22 insertions(+), 44 deletions(-) diff --git a/platform/clock.c b/platform/clock.c index cb5b529..e163961 100644 --- a/platform/clock.c +++ b/platform/clock.c @@ -4,6 +4,7 @@ #include #include "hook/table.h" +#include "hook/procaddr.h" #include "platform/clock.h" @@ -16,17 +17,12 @@ static DWORD WINAPI my_GetTimeZoneInformation(TIME_ZONE_INFORMATION *tzinfo); static BOOL WINAPI my_SetLocalTime(SYSTEMTIME *in); static BOOL WINAPI my_SetSystemTime(SYSTEMTIME *in); static BOOL WINAPI my_SetTimeZoneInformation(TIME_ZONE_INFORMATION *tzinfo); -static BOOL WINAPI my_AdjustTokenPrivileges( - HANDLE TokenHandle, - BOOL DisableAllPrivileges, - PTOKEN_PRIVILEGES NewState, - DWORD BufferLength, - PTOKEN_PRIVILEGES PreviousState, - PDWORD ReturnLength); static BOOL (WINAPI * next_GetSystemTimeAsFileTime)(FILETIME *out); static int64_t clock_current_day; +static bool clock_timezone; static bool clock_time_warp; +static bool clock_writeable; static const struct hook_symbol clock_base_hook_syms[] = { { @@ -36,13 +32,6 @@ static const struct hook_symbol clock_base_hook_syms[] = { } }; -static const struct hook_symbol clock_perm_hook_syms[] = { - { - .name = "AdjustTokenPrivileges", - .patch = my_AdjustTokenPrivileges, - } -}; - static const struct hook_symbol clock_read_hook_syms[] = { { .name = "GetLocalTime", @@ -172,7 +161,7 @@ static BOOL WINAPI my_GetSystemTime(SYSTEMTIME *out) return ok; } -#if 0 +#if defined(LOG_CLOCK) static int last_second; if (out->wSecond != last_second) { @@ -235,60 +224,45 @@ static BOOL WINAPI my_SetTimeZoneInformation(TIME_ZONE_INFORMATION *in) return TRUE; } -static BOOL WINAPI my_AdjustTokenPrivileges( - HANDLE TokenHandle, - BOOL DisableAllPrivileges, - PTOKEN_PRIVILEGES NewState, - DWORD BufferLength, - PTOKEN_PRIVILEGES PreviousState, - PDWORD ReturnLength) -{ - dprintf("Clock: Blocked privilege update\n"); - return false; // ....why??? -} - HRESULT clock_hook_init(const struct clock_config *cfg) { assert(cfg != NULL); - if (!cfg->enable) { - return S_FALSE; - } + clock_timezone = cfg->timezone; clock_time_warp = cfg->timewarp; + clock_writeable = cfg->writeable; - if (cfg->timezone || cfg->timewarp || !cfg->writeable) { + clock_hook_insert_hooks(NULL); + + return S_OK; +} + +void clock_hook_insert_hooks(HMODULE target) { + if (clock_timezone || clock_time_warp || !clock_writeable) { /* All the clock hooks require the core GSTAFT hook to be installed */ /* Note the ! up there btw. */ hook_table_apply( - NULL, + target, "kernel32.dll", clock_base_hook_syms, _countof(clock_base_hook_syms)); - - hook_table_apply( - NULL, - "ADVAPI32.dll", - clock_perm_hook_syms, - _countof(clock_perm_hook_syms)); } - if (cfg->timezone) { + if (clock_timezone) { hook_table_apply( - NULL, + target, "kernel32.dll", clock_read_hook_syms, _countof(clock_read_hook_syms)); } - if (!cfg->writeable) { + if (!clock_writeable) { /* Install hook if this config parameter is FALSE! */ hook_table_apply( - NULL, + target, "kernel32.dll", clock_write_hook_syms, _countof(clock_write_hook_syms)); } - - return S_OK; } diff --git a/platform/clock.h b/platform/clock.h index c18d78c..07b7720 100644 --- a/platform/clock.h +++ b/platform/clock.h @@ -12,3 +12,4 @@ struct clock_config { }; HRESULT clock_hook_init(const struct clock_config *cfg); +void clock_hook_insert_hooks(HMODULE target); diff --git a/saohook/unity.c b/saohook/unity.c index 9ff961d..e5e8d24 100644 --- a/saohook/unity.c +++ b/saohook/unity.c @@ -14,6 +14,7 @@ #include "amcus/amcus.h" #include "board/usio.h" #include "platform/epay.h" +#include "platform/clock.h" #include "util/dprintf.h" @@ -121,6 +122,7 @@ static HMODULE WINAPI my_LoadLibraryW(const wchar_t *name) path_hook_insert_hooks(result); amcus_insert_hooks(result); reg_hook_apply_hooks(result); + clock_hook_insert_hooks(result); usio_hook_proc_addr(result); proc_addr_insert_hooks(result); } @@ -135,6 +137,7 @@ static HMODULE WINAPI my_LoadLibraryW(const wchar_t *name) serial_hook_apply_hooks(dep_mod); reg_hook_apply_hooks(dep_mod); epay_insert_hook(dep_mod); + clock_hook_insert_hooks(dep_mod); } } }