2018-08-23 11:53:23 -04:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "common.h"
|
|
|
|
#include "const.h"
|
|
|
|
|
2019-02-16 22:51:10 -05:00
|
|
|
class WinMutex // Like CMutex but works with scoped_lock
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
WinMutex(std::wstring name = L"", LPSECURITY_ATTRIBUTES sa = nullptr) : m(CreateMutexW(sa, FALSE, name.empty() ? NULL : name.c_str())) {}
|
|
|
|
void lock() { if (m) WaitForSingleObject(m, INFINITE); }
|
|
|
|
void unlock() { if (m) ReleaseMutex(m); }
|
|
|
|
|
|
|
|
private:
|
|
|
|
AutoHandle<> m;
|
|
|
|
};
|
|
|
|
|
2019-02-18 23:12:12 -05:00
|
|
|
inline SECURITY_ATTRIBUTES allAccess = std::invoke([] // allows non-admin processes to access kernel objects made by admin processes
|
|
|
|
{
|
|
|
|
static SECURITY_DESCRIPTOR sd = {};
|
|
|
|
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
|
|
|
|
SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE);
|
|
|
|
return SECURITY_ATTRIBUTES{ sizeof(SECURITY_ATTRIBUTES), &sd, FALSE };
|
|
|
|
});
|
|
|
|
|
2018-08-23 11:53:23 -04:00
|
|
|
// jichi 3/7/2014: Add guessed comment
|
2018-12-30 22:11:23 -05:00
|
|
|
struct HookParam
|
2018-08-23 11:53:23 -04:00
|
|
|
{
|
2018-12-20 02:48:21 -05:00
|
|
|
uint64_t address; // absolute or relative address
|
2018-08-26 22:21:15 -04:00
|
|
|
int offset, // offset of the data in the memory
|
2018-08-23 11:53:23 -04:00
|
|
|
index, // deref_offset1
|
|
|
|
split, // offset of the split character
|
2019-03-27 23:35:22 -04:00
|
|
|
split_index, // deref_offset2
|
|
|
|
null_length;
|
2019-01-03 17:52:16 -05:00
|
|
|
union
|
|
|
|
{
|
|
|
|
wchar_t module[MAX_MODULE_SIZE];
|
|
|
|
wchar_t text[MAX_MODULE_SIZE];
|
|
|
|
};
|
2018-10-11 12:58:30 -04:00
|
|
|
char function[MAX_MODULE_SIZE];
|
2018-08-23 11:53:23 -04:00
|
|
|
DWORD type; // flags
|
2018-10-30 20:50:50 -04:00
|
|
|
UINT codepage; // text encoding
|
2018-12-21 10:10:51 -05:00
|
|
|
short length_offset; // index of the string length
|
2019-06-18 04:48:48 -04:00
|
|
|
uintptr_t padding; // padding before string
|
2018-08-23 11:53:23 -04:00
|
|
|
DWORD user_value; // 7/20/2014: jichi additional parameters for PSP games
|
|
|
|
|
2019-02-02 16:54:13 -05:00
|
|
|
void(*text_fun)(DWORD stack, HookParam* hp, BYTE obsoleteAlwaysZero, DWORD* data, DWORD* split, DWORD* len);
|
|
|
|
bool(*filter_fun)(void* data, DWORD* len, HookParam* hp, BYTE obsoleteAlwaysZero); // jichi 10/24/2014: Add filter function. Return true if skip the text
|
|
|
|
bool(*hook_fun)(DWORD stack, HookParam* hp); // jichi 10/24/2014: Add generic hook function, return false if stop execution.
|
2019-06-18 04:48:48 -04:00
|
|
|
int(*length_fun)(uintptr_t stack, uintptr_t data); // data after padding added
|
2018-12-01 15:52:12 -05:00
|
|
|
|
|
|
|
char name[HOOK_NAME_SIZE];
|
2018-08-23 11:53:23 -04:00
|
|
|
};
|
|
|
|
|
2018-11-04 20:48:46 -05:00
|
|
|
struct ThreadParam
|
2018-08-23 11:53:23 -04:00
|
|
|
{
|
2019-01-09 22:35:01 -05:00
|
|
|
bool operator==(ThreadParam other) const { return processId == other.processId && addr == other.addr && ctx == other.ctx && ctx2 == other.ctx2; }
|
2018-11-04 20:48:46 -05:00
|
|
|
DWORD processId;
|
|
|
|
uint64_t addr;
|
|
|
|
uint64_t ctx; // The context of the hook: by default the first value on stack, usually the return address
|
|
|
|
uint64_t ctx2; // The subcontext of the hook: 0 by default, generated in a method specific to the hook
|
2018-08-23 11:53:23 -04:00
|
|
|
};
|
|
|
|
|
2019-06-02 02:09:17 -04:00
|
|
|
struct SearchParam
|
|
|
|
{
|
2019-07-16 21:55:40 +05:30
|
|
|
BYTE pattern[25] = { 0xcc, 0xcc, x64 ? 0x48 : 0x55, x64 ? 0x89 : 0x8b, 0xec }; // pattern in memory to search for
|
|
|
|
int length = x64 ? 4 : 5, // length of pattern (zero means this SearchParam is invalid and the default should be used)
|
|
|
|
offset = 2, // offset from start of pattern to add hook
|
|
|
|
searchTime = 20000, // ms
|
|
|
|
maxRecords = 100000;
|
|
|
|
uintptr_t padding = 0, minAddress = 0, maxAddress = (uintptr_t)-1;
|
|
|
|
void(*hookPostProcessor)(HookParam&) = nullptr;
|
2019-06-02 02:09:17 -04:00
|
|
|
};
|
2018-10-31 12:04:32 -04:00
|
|
|
|
2018-08-23 11:53:23 -04:00
|
|
|
struct InsertHookCmd // From host
|
|
|
|
{
|
2018-12-30 22:11:23 -05:00
|
|
|
InsertHookCmd(HookParam hp) : hp(hp) {}
|
2019-02-21 13:09:44 -05:00
|
|
|
HostCommandType command = HOST_COMMAND_NEW_HOOK;
|
2018-08-23 11:53:23 -04:00
|
|
|
HookParam hp;
|
|
|
|
};
|
|
|
|
|
2019-06-10 01:49:11 -04:00
|
|
|
struct RemoveHookCmd // From host
|
|
|
|
{
|
|
|
|
RemoveHookCmd(uint64_t address) : address(address) {}
|
|
|
|
HostCommandType command = HOST_COMMAND_REMOVE_HOOK;
|
|
|
|
uint64_t address;
|
|
|
|
};
|
|
|
|
|
2019-06-02 02:09:17 -04:00
|
|
|
struct FindHookCmd // From host
|
|
|
|
{
|
|
|
|
FindHookCmd(SearchParam sp) : sp(sp) {}
|
|
|
|
HostCommandType command = HOST_COMMAND_FIND_HOOK;
|
|
|
|
SearchParam sp;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct ConsoleOutputNotif // From dll
|
2018-08-23 11:53:23 -04:00
|
|
|
{
|
2019-02-13 16:45:00 -05:00
|
|
|
ConsoleOutputNotif(std::string message = "") { strncpy_s(this->message, message.c_str(), MESSAGE_SIZE - 1); }
|
2019-02-21 13:09:44 -05:00
|
|
|
HostNotificationType command = HOST_NOTIFICATION_TEXT;
|
2018-08-23 11:53:23 -04:00
|
|
|
char message[MESSAGE_SIZE] = {};
|
|
|
|
};
|
|
|
|
|
2019-06-02 02:09:17 -04:00
|
|
|
struct HookFoundNotif // From dll
|
|
|
|
{
|
|
|
|
HookFoundNotif(HookParam hp, wchar_t* text) : hp(hp) { wcsncpy_s(this->text, text, MESSAGE_SIZE - 1); }
|
|
|
|
HostNotificationType command = HOST_NOTIFICATION_FOUND_HOOK;
|
|
|
|
HookParam hp;
|
|
|
|
wchar_t text[MESSAGE_SIZE] = {}; // though type is wchar_t, may not be encoded in UTF-16 (it's just convenient to use wcs* functions)
|
|
|
|
};
|
|
|
|
|
|
|
|
struct HookRemovedNotif // From dll
|
2018-08-23 11:53:23 -04:00
|
|
|
{
|
2018-09-20 21:59:07 -04:00
|
|
|
HookRemovedNotif(uint64_t address) : address(address) {};
|
2019-02-21 13:09:44 -05:00
|
|
|
HostNotificationType command = HOST_NOTIFICATION_RMVHOOK;
|
2018-09-20 21:59:07 -04:00
|
|
|
uint64_t address;
|
2018-08-23 11:53:23 -04:00
|
|
|
};
|