#pragma once #include #include #include #pragma region Defines #define HWSYSCALLS_DEBUG 1 // 0 disable, 1 enable #define UP -32 #define DOWN 32 #define STACK_ARGS_LENGTH 8 #define STACK_ARGS_RSP_OFFSET 0x28 #define X64_PEB_OFFSET 0x60 #pragma endregion #pragma region Macros #if HWSYSCALLS_DEBUG == 0 #define DEBUG_PRINT( STR, ... ) #else #define DEBUG_PRINT( STR, ... ) printf(STR, __VA_ARGS__ ); #endif #pragma endregion #pragma region Type Defintions typedef struct _UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR Buffer; } UNICODE_STRING, * PUNICODE_STRING; typedef struct _RTL_USER_PROCESS_PARAMETERS { BYTE Reserved1[16]; PVOID Reserved2[10]; UNICODE_STRING ImagePathName; UNICODE_STRING CommandLine; } RTL_USER_PROCESS_PARAMETERS, * PRTL_USER_PROCESS_PARAMETERS; typedef struct _PEB_LDR_DATA { BYTE Reserved1[8]; PVOID Reserved2[3]; LIST_ENTRY InMemoryOrderModuleList; } PEB_LDR_DATA, * PPEB_LDR_DATA; typedef struct _LDR_DATA_TABLE_ENTRY { PVOID Reserved1[2]; LIST_ENTRY InMemoryOrderLinks; PVOID Reserved2[2]; PVOID DllBase; PVOID EntryPoint; PVOID Reserved3; UNICODE_STRING FullDllName; BYTE Reserved4[8]; PVOID Reserved5[3]; union { ULONG CheckSum; PVOID Reserved6; }; ULONG TimeDateStamp; } LDR_DATA_TABLE_ENTRY, * PLDR_DATA_TABLE_ENTRY; typedef struct _PEB { BYTE Reserved1[2]; BYTE BeingDebugged; BYTE Reserved2[21]; PPEB_LDR_DATA LoaderData; PRTL_USER_PROCESS_PARAMETERS ProcessParameters; BYTE Reserved3[520]; PVOID PostProcessInitRoutine; BYTE Reserved4[136]; ULONG SessionId; } PEB, * PPEB; typedef BOOL(WINAPI* GetThreadContext_t)( _In_ HANDLE hThread, _Inout_ LPCONTEXT lpContext ); typedef BOOL(WINAPI* SetThreadContext_t)( _In_ HANDLE hThread, _In_ CONST CONTEXT* lpContext ); #pragma endregion #pragma region Function Declerations BOOL MaskCompare(const BYTE* pData, const BYTE* bMask, const char* szMask); DWORD_PTR FindPattern(DWORD_PTR dwAddress, DWORD dwLen, PBYTE bMask, PCHAR szMask); DWORD_PTR FindInModule(LPCSTR moduleName, PBYTE bMask, PCHAR szMask); UINT64 GetModuleAddress(LPWSTR sModuleName); UINT64 GetSymbolAddress(UINT64 moduleBase, const char* functionName); UINT64 PrepareSyscall(char* functionName); bool SetMainBreakpoint(); DWORD64 FindSyscallNumber(DWORD64 functionAddress); DWORD64 FindSyscallReturnAddress(DWORD64 functionAddress, WORD syscallNumber); LONG HWSyscallExceptionHandler(EXCEPTION_POINTERS* ExceptionInfo); bool InitHWSyscalls(); bool DeinitHWSyscalls(); #pragma endregion