mirror of
https://github.com/gabriellandau/PPLFault
synced 2026-06-08 14:20:58 +00:00
316 lines
8.2 KiB
C
316 lines
8.2 KiB
C
#pragma once
|
|
|
|
#include <phnt_windows.h>
|
|
#include <phnt.h>
|
|
#include <dbghelp.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
typedef NTSTATUS (NTAPI * RtlAdjustPrivilege_t)(
|
|
DWORD privilege,
|
|
BOOL bEnablePrivilege,
|
|
BOOL IsThreadPrivilege,
|
|
PBOOLEAN PreviousValue);
|
|
|
|
typedef HMODULE(WINAPI* LoadLibraryW_t)(
|
|
LPCWSTR lpLibFileName
|
|
);
|
|
|
|
typedef FARPROC(WINAPI* GetProcAddress_t)(
|
|
HMODULE hModule,
|
|
LPCSTR lpProcName
|
|
);
|
|
|
|
typedef HANDLE(WINAPI* OpenProcess_t)(
|
|
DWORD dwDesiredAccess,
|
|
BOOL bInheritHandle,
|
|
DWORD dwProcessId
|
|
);
|
|
|
|
typedef NTSTATUS (NTAPI * NtOpenProcess_t)(
|
|
PHANDLE ProcessHandle,
|
|
ACCESS_MASK DesiredAccess,
|
|
POBJECT_ATTRIBUTES ObjectAttributes,
|
|
PCLIENT_ID ClientId
|
|
);
|
|
|
|
typedef NTSTATUS (NTAPI *NtOpenThread_t)(
|
|
_Out_ PHANDLE ThreadHandle,
|
|
_In_ ACCESS_MASK DesiredAccess,
|
|
_In_ POBJECT_ATTRIBUTES ObjectAttributes,
|
|
_In_opt_ PCLIENT_ID ClientId
|
|
);
|
|
|
|
|
|
typedef HANDLE(WINAPI* CreateFileW_t)(
|
|
LPCWSTR lpFileName,
|
|
DWORD dwDesiredAccess,
|
|
DWORD dwShareMode,
|
|
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
|
|
DWORD dwCreationDisposition,
|
|
DWORD dwFlagsAndAttributes,
|
|
HANDLE hTemplateFile
|
|
);
|
|
|
|
typedef BOOL (WINAPI *ReadFile_t)(
|
|
HANDLE hFile,
|
|
LPVOID lpBuffer,
|
|
DWORD nNumberOfBytesToRead,
|
|
LPDWORD lpNumberOfBytesRead,
|
|
LPOVERLAPPED lpOverlapped
|
|
);
|
|
|
|
typedef BOOL(WINAPI* TerminateProcess_t)(
|
|
HANDLE hProcess,
|
|
UINT uExitCode
|
|
);
|
|
|
|
typedef NTSTATUS (NTAPI *NtTerminateProcess_t)(
|
|
HANDLE ProcessHandle,
|
|
NTSTATUS ExitStatus
|
|
);
|
|
|
|
typedef NTSTATUS (NTAPI *NtTerminateThread_t)(
|
|
IN HANDLE ThreadHandle,
|
|
IN NTSTATUS ExitStatus);
|
|
|
|
|
|
typedef LPVOID (WINAPI* VirtualAllocEx_t)(
|
|
HANDLE hProcess,
|
|
LPVOID lpAddress,
|
|
SIZE_T dwSize,
|
|
DWORD flAllocationType,
|
|
DWORD flProtect
|
|
);
|
|
|
|
typedef NTSTATUS (NTAPI * NtAllocateVirtualMemory_t)(
|
|
HANDLE ProcessHandle,
|
|
PVOID* BaseAddress,
|
|
ULONG_PTR ZeroBits,
|
|
PSIZE_T RegionSize,
|
|
ULONG AllocationType,
|
|
ULONG Protect
|
|
);
|
|
|
|
typedef BOOL (WINAPI *WriteProcessMemory_t)(
|
|
HANDLE hProcess,
|
|
LPVOID lpBaseAddress,
|
|
LPCVOID lpBuffer,
|
|
SIZE_T nSize,
|
|
SIZE_T* lpNumberOfBytesWritten
|
|
);
|
|
|
|
typedef NTSTATUS (NTAPI *NtWriteVirtualMemory_t)(
|
|
IN HANDLE ProcessHandle,
|
|
IN PVOID BaseAddress,
|
|
IN PVOID Buffer,
|
|
IN ULONG NumberOfBytesToWrite,
|
|
OUT PULONG NumberOfBytesWritten);
|
|
|
|
typedef HANDLE (WINAPI * CreateRemoteThread_t)(
|
|
HANDLE hProcess,
|
|
LPSECURITY_ATTRIBUTES lpThreadAttributes,
|
|
SIZE_T dwStackSize,
|
|
LPTHREAD_START_ROUTINE lpStartAddress,
|
|
LPVOID lpParameter,
|
|
DWORD dwCreationFlags,
|
|
LPDWORD lpThreadId
|
|
);
|
|
|
|
typedef NTSTATUS (NTAPI *RtlCreateUserThread_t)(
|
|
IN HANDLE ProcessHandle,
|
|
IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
|
|
IN BOOLEAN CreateSuspended,
|
|
IN ULONG StackZeroBits,
|
|
IN OUT PULONG StackReserved,
|
|
IN OUT PULONG StackCommit,
|
|
IN PVOID StartAddress,
|
|
IN PVOID StartParameter OPTIONAL,
|
|
OUT PHANDLE ThreadHandle,
|
|
OUT CLIENT_ID *ClientID);
|
|
|
|
typedef BOOL(WINAPI* MiniDumpWriteDump_t)(
|
|
HANDLE hProcess,
|
|
DWORD ProcessId,
|
|
HANDLE hFile,
|
|
MINIDUMP_TYPE DumpType,
|
|
PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
|
|
PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
|
|
PMINIDUMP_CALLBACK_INFORMATION CallbackParam
|
|
);
|
|
|
|
typedef NTSTATUS (NTAPI * NtWaitForSingleObject_t)(
|
|
HANDLE Handle,
|
|
BOOLEAN Alertable,
|
|
PLARGE_INTEGER Timeout
|
|
);
|
|
|
|
typedef NTSTATUS (NTAPI * NtCreateEvent_t)(
|
|
PHANDLE EventHandle,
|
|
ACCESS_MASK DesiredAccess,
|
|
POBJECT_ATTRIBUTES ObjectAttributes,
|
|
EVENT_TYPE EventType,
|
|
BOOLEAN InitialState
|
|
);
|
|
|
|
typedef NTSTATUS (NTAPI *NtSetEvent_t)(
|
|
HANDLE EventHandle,
|
|
PLONG PreviousState
|
|
);
|
|
|
|
typedef NTSTATUS (NTAPI *NtCreateMutant_t)(
|
|
OUT PHANDLE MutantHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
|
|
IN BOOLEAN InitialOwner);
|
|
|
|
typedef NTSTATUS (NTAPI * NtCreateSection_t)(
|
|
PHANDLE SectionHandle,
|
|
ACCESS_MASK DesiredAccess,
|
|
POBJECT_ATTRIBUTES ObjectAttributes,
|
|
PLARGE_INTEGER MaximumSize,
|
|
ULONG SectionPageProtection,
|
|
ULONG AllocationAttributes,
|
|
HANDLE FileHandle
|
|
);
|
|
|
|
typedef NTSTATUS (NTAPI * NtMapViewOfSection_t)(
|
|
HANDLE SectionHandle,
|
|
HANDLE ProcessHandle,
|
|
PVOID* BaseAddress,
|
|
ULONG_PTR ZeroBits,
|
|
SIZE_T CommitSize,
|
|
PLARGE_INTEGER SectionOffset,
|
|
PSIZE_T ViewSize,
|
|
SECTION_INHERIT InheritDisposition,
|
|
ULONG AllocationType,
|
|
ULONG Win32Protect
|
|
);
|
|
|
|
typedef ULONG (NTAPI *CsrGetProcessId_t)();
|
|
|
|
typedef enum
|
|
{
|
|
UserThreadShutdownInformation,
|
|
UserThreadFlags,
|
|
UserThreadTaskName,
|
|
UserThreadWOWInformation,
|
|
UserThreadHungStatus,
|
|
UserThreadInitiateShutdown,
|
|
UserThreadEndShutdown,
|
|
UserThreadUseDesktop,
|
|
UserThreadPolled,
|
|
UserThreadKeyboardState,
|
|
UserThreadCsrPort,
|
|
UserThreadResyncKeyState,
|
|
UserThreadUseActiveDesktop
|
|
} USERTHREADINFOCLASS;
|
|
|
|
typedef enum
|
|
{
|
|
HardErrorSetup,
|
|
HardErrorCleanup,
|
|
HardErrorAttach,
|
|
HardErrorAttachUser,
|
|
HardErrorDetach,
|
|
HardErrorAttachNoQueue,
|
|
HardErrorDetachNoQueue,
|
|
HardErrorQuery,
|
|
HardErrorInDefDesktop
|
|
} HARDERRORCONTROL;
|
|
|
|
typedef struct
|
|
{
|
|
HANDLE pDeskRestore;
|
|
HANDLE pDeskNew;
|
|
} DESKTOPRESTOREDATA, * PDESKTOPRESTOREDATA;
|
|
|
|
typedef struct
|
|
{
|
|
HANDLE Thread;
|
|
DESKTOPRESTOREDATA Restore;
|
|
} DESKTOPUSEDESKTOP, * PDESKTOPUSEDESKTOP;
|
|
|
|
typedef NTSTATUS (NTAPI *NtUserSetInformationThread_t)(
|
|
_In_ HANDLE Thread,
|
|
_In_ USERTHREADINFOCLASS ThreadInfoClass,
|
|
_In_ PVOID ThreadInformation,
|
|
_In_ ULONG ThreadInformationLength
|
|
);
|
|
|
|
typedef NTSTATUS (NTAPI * NtUserHardErrorControl_t)(
|
|
_In_ HARDERRORCONTROL Command,
|
|
_In_ HANDLE Thread,
|
|
_In_ PDESKTOPRESTOREDATA DesktopRestore
|
|
);
|
|
|
|
#define MAGIC1 0x1BADC0D3
|
|
#define MAGIC2 0xDEADBEEF
|
|
|
|
// 90 nop
|
|
// 48 87 c9 xchg rcx, rcx
|
|
// 48 87 d2 xchg rdx, rdx
|
|
// 4d 87 c0 xchg r8, r8
|
|
// 4d 87 c9 xchg r9, r9
|
|
// 90 nop
|
|
#define MAGIC_NOPS { 0x90, 0x48, 0x87, 0xC9, 0x48, 0x87, 0xD2, 0x4D, 0x87, 0xC0, 0x4D, 0x87, 0xC9, 0x90 }
|
|
#define MAGIC_NOPS_LENGTH 14
|
|
|
|
#define ETHREAD_PREVIOUSMODE_OFFSET 0x232
|
|
#define OBJECT_HEADER_SIZE 0x30
|
|
|
|
#define BNO L"\\BaseNamedObjects\\"
|
|
#define GLOBAL L"Global\\"
|
|
#define MUTEX_NAME_BASE L"GMMut"
|
|
#define REQ_NAME_BASE L"GMReq"
|
|
#define DONE_NAME_BASE L"GMDone"
|
|
#define SECTION_NAME_BASE L"GMSec"
|
|
|
|
typedef struct _IPC_SECTION
|
|
{
|
|
volatile PVOID pThread;
|
|
volatile NTSTATUS ntStatus;
|
|
} IPC_SECTION, *PIPC_SECTION;
|
|
|
|
typedef struct _SHELLCODE_PARAMS
|
|
{
|
|
DWORD magic1;
|
|
DWORD magic2;
|
|
|
|
DWORD mySize;
|
|
UCHAR magicNops[MAGIC_NOPS_LENGTH];
|
|
|
|
WCHAR mutexName[60];
|
|
WCHAR reqName[60];
|
|
WCHAR doneName[60];
|
|
WCHAR sectionName[60];
|
|
|
|
// User params
|
|
DWORD dwCsrssPid;
|
|
//PVOID pThreadObject;
|
|
|
|
// IAT
|
|
NtOpenProcess_t pNtOpenProcess;
|
|
NtTerminateProcess_t pNtTerminateProcess;
|
|
RtlAdjustPrivilege_t pRtlAdjustPrivilege;
|
|
NtAllocateVirtualMemory_t pNtAllocateVirtualMemory;
|
|
NtWriteVirtualMemory_t pNtWriteVirtualMemory;
|
|
RtlCreateUserThread_t pRtlCreateUserThread;
|
|
NtWaitForSingleObject_t pNtWaitForSingleObject;
|
|
NtCreateEvent_t pNtCreateEvent;
|
|
NtSetEvent_t pNtSetEvent;
|
|
NtCreateMutant_t pNtCreateMutant;
|
|
NtCreateSection_t pNtCreateSection;
|
|
NtMapViewOfSection_t pNtMapViewOfSection;
|
|
|
|
NtUserSetInformationThread_t pNtUserSetInformationThread;
|
|
NtUserHardErrorControl_t pNtUserHardErrorControl;
|
|
|
|
} SHELLCODE_PARAMS, * PSHELLCODE_PARAMS;
|
|
|
|
#ifdef __cplusplus
|
|
} // extern "C"
|
|
#endif
|