forked from Dniel97/segatools
Merge branch 'master' into develop
This commit is contained in:
commit
37793fc051
13
.gitignore
vendored
13
.gitignore
vendored
@ -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/
|
||||||
|
1
.vscode/settings.json
vendored
1
.vscode/settings.json
vendored
@ -1,3 +1,4 @@
|
|||||||
{
|
{
|
||||||
"editor.formatOnSave": false,
|
"editor.formatOnSave": false,
|
||||||
|
"mesonbuild.configureOnOpen": false,
|
||||||
}
|
}
|
||||||
|
@ -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
|
|
||||||
);
|
|
||||||
}
|
|
@ -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"
|
||||||
|
|
||||||
@ -123,6 +124,11 @@ static DWORD CALLBACK carol_pre_startup(void)
|
|||||||
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");
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
};
|
};
|
Loading…
Reference in New Issue
Block a user