ekt: hook ShellExecuteExA/W (wtf sega)

This commit is contained in:
kyoubate-haruka
2025-10-25 10:38:05 +02:00
parent 995305427d
commit cc92e7b719
3 changed files with 100 additions and 7 deletions

View File

@@ -5,11 +5,13 @@
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <shellapi.h>
#include "hook/table.h"
#include "hooklib/createprocess.h"
#include "hook/procaddr.h"
#include "util/dprintf.h"
void createprocess_hook_init();
@@ -36,7 +38,15 @@ BOOL my_CreateProcessW(
LPCWSTR lpCurrentDirectory,
LPSTARTUPINFOW lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
);
BOOL my_ShellExecuteExA(SHELLEXECUTEINFOA *pExecInfo);
BOOL my_ShellExecuteExW(SHELLEXECUTEINFOW *pExecInfo);
static BOOL (WINAPI *next_ShellExecuteExA)(SHELLEXECUTEINFOA *pExecInfo);
static BOOL (WINAPI *next_ShellExecuteExW)(SHELLEXECUTEINFOW *pExecInfo);
static BOOL (WINAPI *next_CreateProcessA)(
LPCSTR lpApplicationName,
@@ -76,6 +86,18 @@ static const struct hook_symbol win32_hooks[] = {
.link = (void **) &next_CreateProcessW
},
};
static const struct hook_symbol shell32_hooks[] = {
{
.name = "ShellExecuteExA",
.patch = my_ShellExecuteExA,
.link = (void **) &next_ShellExecuteExA
},
{
.name = "ShellExecuteExW",
.patch = my_ShellExecuteExW,
.link = (void **) &next_ShellExecuteExW
},
};
static bool did_init = false;
@@ -157,18 +179,31 @@ HRESULT createprocess_push_hook_a(const char *name, const char *head, const char
return S_OK;
}
void createprocess_hook_apply_hooks(HMODULE mod) {
hook_table_apply(
mod,
"kernel32.dll",
win32_hooks,
_countof(win32_hooks));
hook_table_apply(
mod,
"shell32.dll",
shell32_hooks,
_countof(shell32_hooks));
proc_addr_table_push(mod, "kernel32.dll", win32_hooks, _countof(win32_hooks));
proc_addr_table_push(mod, "shell32.dll", shell32_hooks, _countof(shell32_hooks));
InitializeCriticalSection(&createproc_lock);
}
void createprocess_hook_init() {
if (did_init) {
return;
}
did_init = true;
hook_table_apply(
NULL,
"kernel32.dll",
win32_hooks,
_countof(win32_hooks));
InitializeCriticalSection(&createproc_lock);
createprocess_hook_apply_hooks(NULL);
dprintf("CreateProcess: Init\n");
}
@@ -255,4 +290,54 @@ BOOL my_CreateProcessW(
lpStartupInfo,
lpProcessInformation
);
}
BOOL my_ShellExecuteExA(SHELLEXECUTEINFOA *pExecInfo) {
for (int i = 0; i < process_nsyms_a; i++) {
if (strncmp(process_syms_a[i].name, pExecInfo->lpFile, strlen(process_syms_a[i].name))) {
continue;
}
dprintf("CreateProcess: Hooking child process %s %s\n", pExecInfo->lpFile, pExecInfo->lpParameters);
char new_args[MAX_PATH] = {0};
strcat_s(new_args, MAX_PATH, process_syms_a[i].head);
if (!process_syms_a[i].replace_all) {
strcat_s(new_args, MAX_PATH, pExecInfo->lpParameters);
}
if (process_syms_a[i].tail != NULL) {
strcat_s(new_args, MAX_PATH, process_syms_a[i].tail);
}
pExecInfo->lpParameters = new_args;
dprintf("CreateProcess: Replaced ShellExecuteExA %s %s\n", pExecInfo->lpFile, new_args);
}
return next_ShellExecuteExA(pExecInfo);
}
BOOL my_ShellExecuteExW(SHELLEXECUTEINFOW *pExecInfo) {
for (int i = 0; i < process_nsyms_w; i++) {
if (wcsncmp(process_syms_w[i].name, pExecInfo->lpFile, wcslen(process_syms_w[i].name))) {
continue;
}
dprintf("CreateProcess: Hooking child process %ls %ls\n", pExecInfo->lpFile, pExecInfo->lpParameters);
wchar_t new_args[MAX_PATH] = {0};
wcscat_s(new_args, MAX_PATH, process_syms_w[i].head);
if (!process_syms_w[i].replace_all) {
wcscat_s(new_args, MAX_PATH, pExecInfo->lpParameters);
}
if (process_syms_w[i].tail != NULL) {
wcscat_s(new_args, MAX_PATH, process_syms_w[i].tail);
}
pExecInfo->lpParameters = new_args;
dprintf("CreateProcess: Replaced ShellExecuteExW %ls %ls\n", pExecInfo->lpFile, new_args);
}
return next_ShellExecuteExW(pExecInfo);
}

View File

@@ -5,6 +5,7 @@
HRESULT createprocess_push_hook_w(const wchar_t *name, const wchar_t *head, const wchar_t *tail, bool replace_all);
HRESULT createprocess_push_hook_a(const char *name, const char *head, const char *tail, bool replace_all);
void createprocess_hook_apply_hooks(HMODULE mod);
struct process_hook_sym_w {
const wchar_t *name;

View File

@@ -18,6 +18,7 @@
COM3: 837-15093-06 LED Controller Board
*/
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
@@ -34,6 +35,7 @@
#include "ekthook/config.h"
#include "ekthook/io4.h"
#include "hooklib/createprocess.h"
#include "hooklib/printer_cx.h"
#include "platform/platform.h"
@@ -51,6 +53,7 @@ static struct ekt_hook_config ekt_hook_cfg;
static void unity_hook_callback(HMODULE hmodule, const wchar_t* p) {
netenv_hook_apply_hooks(hmodule);
createprocess_hook_apply_hooks(hmodule);
}
static DWORD CALLBACK ekt_pre_startup(void)
@@ -69,6 +72,10 @@ static DWORD CALLBACK ekt_pre_startup(void)
dvd_hook_init(&ekt_hook_cfg.dvd, ekt_hook_mod);
serial_hook_init();
wchar_t video_path_hook[MAX_PATH];
swprintf(video_path_hook, MAX_PATH, L"file createnew %ls\\SDGY\\EtUpload\\live\\video_0.ts 524288", ekt_hook_cfg.platform.vfs.appdata);
createprocess_push_hook_w(L"fsutil", L"", video_path_hook, true);
/* Hook external DLL APIs */
hr = y3_hook_init(&ekt_hook_cfg.y3, ekt_hook_mod, get_config_path());