473 lines
13 KiB
Zig
473 lines
13 KiB
Zig
// Win32 type aliases, constants, and struct definitions — data layout only, no function types.
|
|
// 1. Base types — CHAR→i8, DWORD→u32, NTSTATUS→i32, BOOL→i32, ULONG_PTR→usize.
|
|
// 2. Pointers/handles — LPVOID→*anyopaque, HANDLE, HMODULE, PHANDLE, HINTERNET.
|
|
// 3. Strings — LPSTR→[*:0]u8, LPCWSTR→[*:0]const u16, FARPROC, PDWORD.
|
|
// 4. Inline helpers — NT_SUCCESS, memory/page constants (PAGE_NOACCESS→MEM_RELEASE).
|
|
// 5. Exception — EXCEPTION_SINGLE_STEP=0x80000004, CONTEXT_DEBUG_REGISTERS=0x00100010.
|
|
// 6. Startup — STARTUPINFOEXA, PROCESS_INFORMATION, PROC_THREAD_ATTRIBUTE_*.
|
|
// 7. COFF — section/symbol/relocation structs for BOF loader.
|
|
// 8. Crypto — BCRYPT_AES_ALGORITHM, ECDH P-256, AES-256-GCM sizes, auth mode info.
|
|
// 9. NT kernel — CONTEXT (debug regs at offset 192+), EXCEPTION_RECORD, OBJECT_ATTRIBUTES.
|
|
// 10. Security — TOKEN_PRIVILEGES, LUID, SE_PRIVILEGE_ENABLED, token access masks.
|
|
const std = @import("std");
|
|
|
|
pub const WINAPI = std.builtin.CallingConvention.winapi;
|
|
|
|
pub const CHAR = i8;
|
|
pub const UCHAR = u8;
|
|
pub const BYTE = u8;
|
|
pub const WORD = u16;
|
|
pub const WCHAR = u16;
|
|
pub const SHORT = i16;
|
|
pub const INT = i32;
|
|
pub const UINT = u32;
|
|
pub const LONG = i32;
|
|
pub const DWORD = u32;
|
|
pub const DWORD64 = u64;
|
|
pub const ULONG = u32;
|
|
pub const LONGLONG = i64;
|
|
pub const ULONGLONG = u64;
|
|
pub const BOOL = i32;
|
|
pub const BOOLEAN = u8;
|
|
pub const NTSTATUS = i32;
|
|
pub const HRESULT = i32;
|
|
pub const SIZE_T = usize;
|
|
pub const DWORD_PTR = usize;
|
|
pub const UINT_PTR = usize;
|
|
pub const ULONG_PTR = usize;
|
|
pub const LONG_PTR = isize;
|
|
pub const LARGE_INTEGER = i64;
|
|
pub const INTERNET_PORT = u16;
|
|
|
|
pub const LPVOID = *anyopaque;
|
|
pub const LPCVOID = *const anyopaque;
|
|
pub const HANDLE = *anyopaque;
|
|
pub const PHANDLE = *HANDLE;
|
|
pub const HMODULE = *anyopaque;
|
|
pub const HINSTANCE = *anyopaque;
|
|
pub const HINTERNET = *anyopaque;
|
|
|
|
pub const LPSTR = [*:0]u8;
|
|
pub const LPCSTR = [*:0]const u8;
|
|
pub const LPWSTR = [*:0]u16;
|
|
pub const LPCWSTR = [*:0]const u16;
|
|
|
|
pub const PDWORD = *DWORD;
|
|
pub const PULONG = *ULONG;
|
|
pub const PSIZE_T = *SIZE_T;
|
|
pub const PBOOL = *BOOL;
|
|
|
|
pub const FARPROC = *const fn() callconv(WINAPI) isize;
|
|
|
|
// 1a. type aliases done. below: inline helpers + memory/page constants
|
|
pub inline fn NT_SUCCESS(status: NTSTATUS) bool {
|
|
return status >= 0;
|
|
}
|
|
|
|
pub const MEM_COMMIT: ULONG = 0x00001000;
|
|
pub const MEM_RESERVE: ULONG = 0x00002000;
|
|
pub const MEM_RELEASE: ULONG = 0x00008000;
|
|
|
|
pub const PAGE_NOACCESS: ULONG = 0x01;
|
|
pub const PAGE_READONLY: ULONG = 0x02;
|
|
pub const PAGE_READWRITE: ULONG = 0x04;
|
|
pub const DLL_PROCESS_ATTACH: ULONG = 1;
|
|
pub const PAGE_EXECUTE: ULONG = 0x10;
|
|
pub const PAGE_EXECUTE_READ: ULONG = 0x20;
|
|
pub const PAGE_EXECUTE_READWRITE: ULONG = 0x40;
|
|
|
|
pub const CONTEXT_AMD64: DWORD = 0x00100000;
|
|
pub const CONTEXT_DEBUG_REGISTERS: DWORD = CONTEXT_AMD64 | 0x00000010; // 0x00100010
|
|
|
|
pub const EXCEPTION_SINGLE_STEP: DWORD = 0x80000004;
|
|
pub const EXCEPTION_CONTINUE_EXECUTION: LONG = -1;
|
|
pub const EXCEPTION_CONTINUE_SEARCH: LONG = 0;
|
|
|
|
// process/startup constants + structures
|
|
pub const STARTF_USESTDHANDLES: DWORD = 0x00000100;
|
|
|
|
pub const EXTENDED_STARTUPINFO_PRESENT: DWORD = 0x00080000;
|
|
pub const PROC_THREAD_ATTRIBUTE_PARENT_PROCESS: DWORD_PTR = 0x00020000;
|
|
|
|
pub const STARTUPINFOEXA = extern struct {
|
|
StartupInfo: STARTUPINFOA,
|
|
lpAttributeList: ?*anyopaque,
|
|
};
|
|
|
|
pub const CREATE_NO_WINDOW: DWORD = 0x08000000;
|
|
|
|
pub const MAX_PATH: usize = 260;
|
|
|
|
pub const WINHTTP_FLAG_SECURE: ULONG = 0x00800000;
|
|
pub const WINHTTP_ACCESS_TYPE_DEFAULT_PROXY: ULONG = 0;
|
|
pub const WINHTTP_ACCESS_TYPE_NAMED_PROXY: ULONG = 3;
|
|
pub const WINHTTP_ADDREQ_FLAG_ADD_IF_NEW: ULONG = 0x10000000;
|
|
pub const WINHTTP_OPTION_ENABLE_HTTP2_PROTOCOL: ULONG = 133;
|
|
pub const WINHTTP_PROTOCOL_FLAG_HTTP2: ULONG = 0x1;
|
|
|
|
pub const WINHTTP_WEB_SOCKET_BUFFER_TYPE = enum(u32) {
|
|
BINARY_MESSAGE = 0,
|
|
BINARY_FRAGMENT = 1,
|
|
UTF8_MESSAGE = 2,
|
|
UTF8_FRAGMENT = 3,
|
|
CLOSE = 4,
|
|
};
|
|
|
|
// 1c. PE/COFF constants for the BOF loader and export parsing
|
|
pub const IMAGE_DIRECTORY_ENTRY_EXPORT: usize = 0;
|
|
pub const IMAGE_SYM_CLASS_EXTERNAL: u8 = 2;
|
|
pub const IMAGE_FILE_MACHINE_AMD64: u16 = 0x8664;
|
|
|
|
pub const IMAGE_REL_AMD64_ABSOLUTE: u16 = 0x0000;
|
|
pub const IMAGE_REL_AMD64_ADDR64: u16 = 0x0001;
|
|
pub const IMAGE_REL_AMD64_ADDR32: u16 = 0x0002;
|
|
pub const IMAGE_REL_AMD64_ADDR32NB: u16 = 0x0003;
|
|
pub const IMAGE_REL_AMD64_REL32: u16 = 0x0004;
|
|
pub const IMAGE_REL_AMD64_REL32_1: u16 = 0x0005;
|
|
pub const IMAGE_REL_AMD64_REL32_2: u16 = 0x0006;
|
|
pub const IMAGE_REL_AMD64_REL32_3: u16 = 0x0007;
|
|
pub const IMAGE_REL_AMD64_REL32_4: u16 = 0x0008;
|
|
pub const IMAGE_REL_AMD64_REL32_5: u16 = 0x0009;
|
|
|
|
pub const COFF_SECT_EXEC: u32 = 0x20000000;
|
|
pub const COFF_SECT_WRITE: u32 = 0x80000000;
|
|
pub const COFF_SECT_DATA: u32 = 0x40000000;
|
|
|
|
// 1b. BCrypt crypto constants + structs for ECDH/AES-GCM
|
|
pub const BCRYPT_AES_ALGORITHM: LPCWSTR = &[_:0]u16{ 'a', 'e', 's' };
|
|
pub const BCRYPT_CHAINING_MODE: LPCWSTR = &[_:0]u16{ 'C', 'h', 'a', 'i', 'n', 'i', 'n', 'g', 'M', 'o', 'd', 'e' };
|
|
pub const BCRYPT_CHAIN_MODE_GCM: LPCWSTR = &[_:0]u16{ 'C', 'h', 'a', 'i', 'n', 'i', 'n', 'g', 'M', 'o', 'd', 'e', 'G', 'C', 'M' };
|
|
pub const BCRYPT_USE_SYSTEM_PREFERRED_RNG: ULONG = 0x00000002;
|
|
|
|
pub const BCRYPT_ECDH_P256_ALGORITHM: LPCWSTR = &[_:0]u16{ 'E', 'C', 'D', 'H', '_', 'P', '2', '5', '6' };
|
|
pub const BCRYPT_ECCPUBLIC_BLOB: LPCWSTR = &[_:0]u16{ 'E', 'C', 'C', 'P', 'U', 'B', 'L', 'I', 'C', 'B', 'L', 'O', 'B' };
|
|
pub const BCRYPT_KDF_RAW_SECRET: ?*const anyopaque = @as(?*const anyopaque, @ptrFromInt(3));
|
|
|
|
pub const AES_KEY_SIZE: usize = 32;
|
|
pub const GCM_NONCE_SIZE: usize = 12;
|
|
pub const GCM_TAG_SIZE: usize = 16;
|
|
|
|
pub fn BCRYPT_INIT_AUTH_MODE_INFO(info: *BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO) void {
|
|
info.cbSize = @sizeOf(BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO);
|
|
info.dwInfoVersion = 1;
|
|
info.pbNonce = null;
|
|
info.cbNonce = 0;
|
|
info.pbAuthData = null;
|
|
info.cbAuthData = 0;
|
|
info.pbTag = null;
|
|
info.cbTag = 0;
|
|
info.pbMacContext = null;
|
|
info.cbMacContext = 0;
|
|
info.dwFlags = 0;
|
|
info.pbIV = null;
|
|
info.cbIV = 0;
|
|
}
|
|
|
|
pub const UNICODE_STRING = extern struct {
|
|
Length: u16,
|
|
MaximumLength: u16,
|
|
Buffer: [*]u16,
|
|
};
|
|
|
|
pub const SYSTEM_INFO = extern struct {
|
|
u: extern union {
|
|
dwOemId: DWORD,
|
|
s: extern struct {
|
|
wProcessorArchitecture: WORD,
|
|
wReserved: WORD,
|
|
},
|
|
},
|
|
dwPageSize: DWORD,
|
|
lpMinimumApplicationAddress: LPVOID,
|
|
lpMaximumApplicationAddress: LPVOID,
|
|
dwActiveProcessorMask: DWORD_PTR,
|
|
dwNumberOfProcessors: DWORD,
|
|
dwProcessorType: DWORD,
|
|
dwAllocationGranularity: DWORD,
|
|
wProcessorLevel: WORD,
|
|
wProcessorRevision: WORD,
|
|
};
|
|
|
|
pub const COORD = extern struct {
|
|
X: SHORT,
|
|
Y: SHORT,
|
|
};
|
|
|
|
pub const MEMORY_BASIC_INFORMATION = extern struct {
|
|
BaseAddress: LPVOID,
|
|
AllocationBase: LPVOID,
|
|
AllocationProtect: DWORD,
|
|
RegionSize: SIZE_T,
|
|
State: DWORD,
|
|
Protect: DWORD,
|
|
Type: DWORD,
|
|
};
|
|
|
|
pub const SECURITY_ATTRIBUTES = extern struct {
|
|
nLength: DWORD,
|
|
lpSecurityDescriptor: ?LPVOID,
|
|
bInheritHandle: BOOL,
|
|
};
|
|
|
|
pub const PROCESS_INFORMATION = extern struct {
|
|
hProcess: HANDLE,
|
|
hThread: HANDLE,
|
|
dwProcessId: DWORD,
|
|
dwThreadId: DWORD,
|
|
};
|
|
|
|
pub const STARTUPINFOA = extern struct {
|
|
cb: DWORD,
|
|
lpReserved: LPSTR,
|
|
lpDesktop: LPSTR,
|
|
lpTitle: LPSTR,
|
|
dwX: DWORD,
|
|
dwY: DWORD,
|
|
dwXSize: DWORD,
|
|
dwYSize: DWORD,
|
|
dwXCountChars: DWORD,
|
|
dwYCountChars: DWORD,
|
|
dwFillAttribute: DWORD,
|
|
dwFlags: DWORD,
|
|
wShowWindow: WORD,
|
|
cbReserved2: WORD,
|
|
lpReserved2: *BYTE,
|
|
hStdInput: HANDLE,
|
|
hStdOutput: HANDLE,
|
|
hStdError: HANDLE,
|
|
};
|
|
|
|
pub const SYSTEMTIME = extern struct {
|
|
wYear: WORD,
|
|
wMonth: WORD,
|
|
wDayOfWeek: WORD,
|
|
wDay: WORD,
|
|
wHour: WORD,
|
|
wMinute: WORD,
|
|
wSecond: WORD,
|
|
wMilliseconds: WORD,
|
|
};
|
|
|
|
// 1d. NT kernel structures — CONTEXT, EXCEPTION_RECORD, object/process types
|
|
pub const CONTEXT = extern struct {
|
|
P1Home: DWORD64,
|
|
P2Home: DWORD64,
|
|
P3Home: DWORD64,
|
|
P4Home: DWORD64,
|
|
P5Home: DWORD64,
|
|
P6Home: DWORD64,
|
|
ContextFlags: DWORD,
|
|
MxCsr: DWORD,
|
|
SegCs: WORD,
|
|
SegDs: WORD,
|
|
SegEs: WORD,
|
|
SegFs: WORD,
|
|
SegGs: WORD,
|
|
SegSs: WORD,
|
|
EFlags: DWORD,
|
|
Dr0: DWORD64,
|
|
Dr1: DWORD64,
|
|
Dr2: DWORD64,
|
|
Dr3: DWORD64,
|
|
Dr6: DWORD64,
|
|
Dr7: DWORD64,
|
|
Rax: DWORD64,
|
|
Rcx: DWORD64,
|
|
Rdx: DWORD64,
|
|
Rbx: DWORD64,
|
|
Rsp: DWORD64,
|
|
Rbp: DWORD64,
|
|
Rsi: DWORD64,
|
|
Rdi: DWORD64,
|
|
R8: DWORD64,
|
|
R9: DWORD64,
|
|
R10: DWORD64,
|
|
R11: DWORD64,
|
|
R12: DWORD64,
|
|
R13: DWORD64,
|
|
R14: DWORD64,
|
|
R15: DWORD64,
|
|
Rip: DWORD64,
|
|
};
|
|
|
|
pub const EXCEPTION_RECORD = extern struct {
|
|
ExceptionCode: DWORD,
|
|
ExceptionFlags: DWORD,
|
|
ExceptionRecord: *EXCEPTION_RECORD,
|
|
ExceptionAddress: *anyopaque,
|
|
NumberParameters: DWORD,
|
|
ExceptionInformation: [15]ULONG_PTR,
|
|
};
|
|
|
|
pub const EXCEPTION_POINTERS = extern struct {
|
|
ExceptionRecord: *EXCEPTION_RECORD,
|
|
ContextRecord: *CONTEXT,
|
|
};
|
|
|
|
pub const RTL_OSVERSIONINFOW = extern struct {
|
|
dwOSVersionInfoSize: DWORD,
|
|
dwMajorVersion: DWORD,
|
|
dwMinorVersion: DWORD,
|
|
dwBuildNumber: DWORD,
|
|
dwPlatformId: DWORD,
|
|
szCSDVersion: [128]WCHAR,
|
|
};
|
|
|
|
pub const BCRYPT_ALG_HANDLE = *opaque {};
|
|
pub const BCRYPT_KEY_HANDLE = *opaque {};
|
|
pub const BCRYPT_SECRET_HANDLE = *opaque {};
|
|
|
|
// 1e. BCrypt auth mode info + COFF loader structs for BOF parsing
|
|
pub const BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO = extern struct {
|
|
cbSize: ULONG,
|
|
dwInfoVersion: ULONG,
|
|
pbNonce: ?*u8,
|
|
cbNonce: ULONG,
|
|
pbAuthData: ?*u8,
|
|
cbAuthData: ULONG,
|
|
pbTag: ?*u8,
|
|
cbTag: ULONG,
|
|
pbMacContext: ?*u8,
|
|
cbMacContext: ULONG,
|
|
dwFlags: ULONG,
|
|
pbIV: ?*u8,
|
|
cbIV: ULONG,
|
|
};
|
|
|
|
pub const coff_file_header_t = extern struct {
|
|
Machine: u16,
|
|
NumberOfSections: u16,
|
|
TimeDateStamp: u32,
|
|
PointerToSymbolTable: u32,
|
|
NumberOfSymbols: u32,
|
|
SizeOfOptionalHeader: u16,
|
|
Characteristics: u16,
|
|
};
|
|
|
|
pub const coff_section_header_t = extern struct {
|
|
Name: [8]u8,
|
|
VirtualSize: u32,
|
|
VirtualAddress: u32,
|
|
SizeOfRawData: u32,
|
|
PointerToRawData: u32,
|
|
PointerToRelocations: u32,
|
|
PointerToLinenumbers: u32,
|
|
NumberOfRelocations: u16,
|
|
NumberOfLinenumbers: u16,
|
|
Characteristics: u32,
|
|
};
|
|
|
|
pub const coff_symbol_t = extern struct {
|
|
Name: extern union {
|
|
ShortName: [8]u8,
|
|
LongName: extern struct {
|
|
Zeroes: u32,
|
|
Offset: u32,
|
|
},
|
|
},
|
|
Value: u32,
|
|
SectionNumber: i16,
|
|
Type: u16,
|
|
StorageClass: u8,
|
|
NumberOfAuxSymbols: u8,
|
|
};
|
|
|
|
pub const coff_reloc_t = extern struct {
|
|
VirtualAddress: u32,
|
|
SymbolTableIndex: u32,
|
|
Type: u16,
|
|
};
|
|
|
|
pub const coff_mapped_section_t = struct {
|
|
data: []u8,
|
|
characteristics: u32,
|
|
name: [8]u8,
|
|
};
|
|
|
|
pub const bof_data_parser_t = struct {
|
|
data: []const u8,
|
|
offset: usize,
|
|
};
|
|
|
|
pub const OBJECT_ATTRIBUTES = extern struct {
|
|
Length: ULONG,
|
|
RootDirectory: ?HANDLE,
|
|
ObjectName: ?*anyopaque,
|
|
Attributes: ULONG,
|
|
SecurityDescriptor: ?*anyopaque,
|
|
SecurityQualityOfService: ?*anyopaque,
|
|
};
|
|
|
|
pub const CLIENT_ID = extern struct {
|
|
UniqueProcess: HANDLE,
|
|
UniqueThread: ?HANDLE,
|
|
};
|
|
|
|
pub const PROCESS_INSTRUMENTATION_CALLBACK = extern struct {
|
|
Version: ULONG,
|
|
Reserved: ULONG,
|
|
Callback: ?*anyopaque,
|
|
};
|
|
|
|
pub const PROCESS_CREATE_INFO = extern struct {
|
|
Size: SIZE_T,
|
|
ProcessHandle: HANDLE,
|
|
ParentProcess: HANDLE,
|
|
};
|
|
|
|
pub const SECURITY_IMPERSONATION_LEVEL = enum(u32) {
|
|
SecurityAnonymous = 0,
|
|
SecurityIdentification = 1,
|
|
SecurityImpersonation = 2,
|
|
SecurityDelegation = 3,
|
|
};
|
|
|
|
pub const TOKEN_TYPE = enum(u32) {
|
|
TokenPrimary = 1,
|
|
TokenImpersonation = 2,
|
|
};
|
|
|
|
pub const TOKEN_DUPLICATE: DWORD = 0x0002;
|
|
pub const TOKEN_QUERY: DWORD = 0x0008;
|
|
pub const TOKEN_ADJUST_PRIVILEGES: DWORD = 0x0020;
|
|
pub const TOKEN_ASSIGN_PRIMARY: DWORD = 0x0001;
|
|
pub const TOKEN_IMPERSONATE: DWORD = 0x0004;
|
|
|
|
pub const LUID = extern struct {
|
|
LowPart: DWORD,
|
|
HighPart: LONG,
|
|
};
|
|
|
|
pub const LUID_AND_ATTRIBUTES = extern struct {
|
|
Luid: LUID,
|
|
Attributes: DWORD,
|
|
};
|
|
|
|
pub const TOKEN_PRIVILEGES = extern struct {
|
|
PrivilegeCount: DWORD,
|
|
Privileges: [1]LUID_AND_ATTRIBUTES,
|
|
};
|
|
|
|
// 1f. security/privilege/token constants
|
|
pub const SE_PRIVILEGE_ENABLED: DWORD = 0x00000002;
|
|
pub const GENERIC_READ: DWORD = 0x80000000;
|
|
pub const GENERIC_WRITE: DWORD = 0x40000000;
|
|
pub const OPEN_EXISTING: DWORD = 3;
|
|
pub const OPEN_ALWAYS: DWORD = 4;
|
|
pub const CREATE_ALWAYS: DWORD = 2;
|
|
pub const FILE_SHARE_READ: DWORD = 0x00000001;
|
|
pub const FILE_SHARE_WRITE: DWORD = 0x00000002;
|
|
pub const FILE_ATTRIBUTE_NORMAL: DWORD = 0x00000080;
|
|
pub const INVALID_HANDLE_VALUE: HANDLE = @ptrFromInt(~@as(usize, 0));
|
|
|
|
pub const CRITICAL_SECTION = extern struct {
|
|
DebugInfo: ?*anyopaque,
|
|
LockCount: LONG,
|
|
RecursionCount: LONG,
|
|
OwningThread: HANDLE,
|
|
LockSemaphore: HANDLE,
|
|
SpinCount: ULONG_PTR,
|
|
};
|
|
|
|
pub const PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE: DWORD_PTR = 0x00020016;
|