Merge branch 'master' into develop

This commit is contained in:
Dniel97 2023-10-05 00:30:24 +02:00
commit 37793fc051
Signed by untrusted user: Dniel97
GPG Key ID: 6180B3C768FB2E08
6 changed files with 37 additions and 105 deletions

13
.gitignore vendored
View File

@ -1,6 +1,17 @@
.*.swp .*.swp
.vscode/ .vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/*.code-snippets
# Local History for Visual Studio Code
.history/
# Built Visual Studio Code Extensions
*.vsix
# Suggested names for build dirs # Suggested names for build dirs
build/ build/

View File

@ -1,3 +1,4 @@
{ {
"editor.formatOnSave": false, "editor.formatOnSave": false,
"mesonbuild.configureOnOpen": false,
} }

View File

@ -8,8 +8,6 @@
#include "hook/iobuf.h" #include "hook/iobuf.h"
#include "hook/iohook.h" #include "hook/iohook.h"
#include "hook/table.h"
#include "carolhook/carol-dll.h" #include "carolhook/carol-dll.h"
#include "carolhook/controlbd.h" #include "carolhook/controlbd.h"
@ -38,39 +36,6 @@ static struct uart controlbd_uart;
static uint8_t controlbd_written_bytes[520]; static uint8_t controlbd_written_bytes[520];
static uint8_t controlbd_readable_bytes[520]; static uint8_t controlbd_readable_bytes[520];
static BOOL WINAPI my_CreateProcessA(
LPCSTR lpApplicationName,
LPSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCSTR lpCurrentDirectory,
LPSTARTUPINFOA lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
static BOOL (WINAPI *next_CreateProcessA)(
LPCSTR lpApplicationName,
LPSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCSTR lpCurrentDirectory,
LPSTARTUPINFOA lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
static const struct hook_symbol win32_hooks[] = {
{
.name = "CreateProcessA",
.patch = my_CreateProcessA,
.link = (void **) &next_CreateProcessA
}
};
HRESULT controlbd_hook_init(const struct controlbd_config *cfg) HRESULT controlbd_hook_init(const struct controlbd_config *cfg)
{ {
if (!cfg->enable) { if (!cfg->enable) {
@ -85,12 +50,6 @@ HRESULT controlbd_hook_init(const struct controlbd_config *cfg)
controlbd_uart.readable.bytes = controlbd_readable_bytes; controlbd_uart.readable.bytes = controlbd_readable_bytes;
controlbd_uart.readable.nbytes = sizeof(controlbd_readable_bytes); controlbd_uart.readable.nbytes = sizeof(controlbd_readable_bytes);
hook_table_apply(
NULL,
"kernel32.dll",
win32_hooks,
_countof(win32_hooks));
dprintf("Control Board: Init\n"); dprintf("Control Board: Init\n");
return iohook_push_handler(controlbd_handle_irp); return iohook_push_handler(controlbd_handle_irp);
@ -378,50 +337,3 @@ static HRESULT controlbd_req_ack_any(uint8_t cmd)
return iobuf_write(&controlbd_uart.readable, &resp, sizeof(resp)); return iobuf_write(&controlbd_uart.readable, &resp, sizeof(resp));
} }
static BOOL WINAPI my_CreateProcessA(
LPCSTR lpApplicationName,
LPSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCSTR lpCurrentDirectory,
LPSTARTUPINFOA lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
)
{
dprintf("Control Board: my_CreateProcessA Hit! %s\n", lpCommandLine);
if (strncmp(".\\15312firm\\firmupdate_1113.exe", lpCommandLine, 31)) {
return next_CreateProcessA(
lpApplicationName,
lpCommandLine,
lpProcessAttributes,
lpThreadAttributes,
bInheritHandles,
dwCreationFlags,
lpEnvironment,
lpCurrentDirectory,
lpStartupInfo,
lpProcessInformation
);
}
dprintf("Control Board: Hooking child process\n");
char new_cmd[MAX_PATH] = "inject -d -k carolhook.dll ";
strcat_s(new_cmd, MAX_PATH, lpCommandLine);
return next_CreateProcessA(
lpApplicationName,
new_cmd,
lpProcessAttributes,
lpThreadAttributes,
bInheritHandles,
dwCreationFlags,
lpEnvironment,
lpCurrentDirectory,
lpStartupInfo,
lpProcessInformation
);
}

View File

@ -19,6 +19,7 @@
#include "hooklib/serial.h" #include "hooklib/serial.h"
#include "hooklib/spike.h" #include "hooklib/spike.h"
#include "hooklib/createprocess.h"
#include "platform/platform.h" #include "platform/platform.h"
@ -122,7 +123,12 @@ static DWORD CALLBACK carol_pre_startup(void)
if (FAILED(hr)) { if (FAILED(hr)) {
goto fail; goto fail;
} }
hr = createprocess_push_hook_a(".\\15312firm\\firmupdate_1113.exe", "inject -d -k carolhook.dll ", NULL, false);
if (FAILED(hr)) {
goto fail;
}
/* Initialize debug helpers */ /* Initialize debug helpers */
spike_hook_init(L".\\segatools.ini"); spike_hook_init(L".\\segatools.ini");

View File

@ -86,7 +86,7 @@ static size_t process_nsyms_w = 0;
static CRITICAL_SECTION createproc_lock; static CRITICAL_SECTION createproc_lock;
HRESULT createprocess_push_hook_w(const wchar_t *name, const wchar_t *head, const wchar_t *tail) { HRESULT createprocess_push_hook_w(const wchar_t *name, const wchar_t *head, const wchar_t *tail, bool replace_all) {
struct process_hook_sym_w *new_mem; struct process_hook_sym_w *new_mem;
struct process_hook_sym_w *new_proc; struct process_hook_sym_w *new_proc;
HRESULT hr; HRESULT hr;
@ -112,6 +112,7 @@ HRESULT createprocess_push_hook_w(const wchar_t *name, const wchar_t *head, cons
new_proc->name = name; new_proc->name = name;
new_proc->head = head; new_proc->head = head;
new_proc->tail = tail; new_proc->tail = tail;
new_proc->replace_all = replace_all;
process_syms_w = new_mem; process_syms_w = new_mem;
process_nsyms_w++; process_nsyms_w++;
@ -120,7 +121,7 @@ HRESULT createprocess_push_hook_w(const wchar_t *name, const wchar_t *head, cons
return S_OK; return S_OK;
} }
HRESULT createprocess_push_hook_a(const char *name, const char *head, const char *tail) { HRESULT createprocess_push_hook_a(const char *name, const char *head, const char *tail, bool replace_all) {
struct process_hook_sym_a *new_mem; struct process_hook_sym_a *new_mem;
struct process_hook_sym_a *new_proc; struct process_hook_sym_a *new_proc;
@ -146,6 +147,7 @@ HRESULT createprocess_push_hook_a(const char *name, const char *head, const char
new_proc->name = name; new_proc->name = name;
new_proc->head = head; new_proc->head = head;
new_proc->tail = tail; new_proc->tail = tail;
new_proc->replace_all = replace_all;
process_syms_a = new_mem; process_syms_a = new_mem;
process_nsyms_a++; process_nsyms_a++;
@ -184,17 +186,20 @@ static BOOL WINAPI my_CreateProcessA(
) )
{ {
for (int i = 0; i < process_nsyms_a; i++) { for (int i = 0; i < process_nsyms_a; i++) {
if (strncmp(process_syms_a->name, lpCommandLine, strlen(process_syms_a->name))) { if (strncmp(process_syms_a[i].name, lpCommandLine, strlen(process_syms_a[i].name))) {
continue; continue;
} }
dprintf("CreateProcess: Hooking child process %s %s\n", lpApplicationName, lpCommandLine); dprintf("CreateProcess: Hooking child process %s %s\n", lpApplicationName, lpCommandLine);
char new_cmd[MAX_PATH] = {0}; char new_cmd[MAX_PATH] = {0};
strcat_s(new_cmd, MAX_PATH, process_syms_a->head); strcat_s(new_cmd, MAX_PATH, process_syms_a[i].head);
strcat_s(new_cmd, MAX_PATH, lpCommandLine);
if (process_syms_a->tail != NULL) { if (!process_syms_a[i].replace_all) {
strcat_s(new_cmd, MAX_PATH, process_syms_a->tail); strcat_s(new_cmd, MAX_PATH, lpCommandLine);
}
if (process_syms_a[i].tail != NULL) {
strcat_s(new_cmd, MAX_PATH, process_syms_a[i].tail);
} }
dprintf("CreateProcess: Replaced CreateProcessA %s\n", new_cmd); dprintf("CreateProcess: Replaced CreateProcessA %s\n", new_cmd);

View File

@ -1,24 +1,21 @@
#pragma once #pragma once
#include <windows.h> #include <windows.h>
#include <stdbool.h>
HRESULT createprocess_push_hook_w(const wchar_t *name, const wchar_t *head, const wchar_t *tail); 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); HRESULT createprocess_push_hook_a(const char *name, const char *head, const char *tail, bool replace_all);
struct process_hook_sym_w { struct process_hook_sym_w {
const wchar_t *name; const wchar_t *name;
size_t name_size;
const wchar_t *head; const wchar_t *head;
size_t head_size;
const wchar_t *tail; const wchar_t *tail;
size_t tail_size; bool replace_all;
}; };
struct process_hook_sym_a { struct process_hook_sym_a {
const char *name; const char *name;
size_t name_size;
const char *head; const char *head;
size_t head_size;
const char *tail; const char *tail;
size_t tail_size; bool replace_all;
}; };