From 34cacd54a94a6db901c81d323ddf466e45a3cd90 Mon Sep 17 00:00:00 2001 From: _xeroxz Date: Wed, 17 Feb 2021 19:18:28 -0800 Subject: [PATCH] merge from private repo --- README.md | 65 +++- Usermode Example/Example.sln | 31 -- Usermode Example/Example.vcxproj | 158 -------- Usermode Example/com.h | 9 - Usermode Example/main.cpp | 9 - Voyager/PayLoad (AMD)/PayLoad (AMD).vcxproj | 70 +++- .../PayLoad (AMD).vcxproj.filters | 18 +- Voyager/PayLoad (AMD)/debug.cpp | 69 ++++ Voyager/PayLoad (AMD)/debug.h | 13 + Voyager/PayLoad (AMD)/ia32.hpp | 18 +- Voyager/PayLoad (AMD)/mm.cpp | 363 ++++++++++++++++++ Voyager/PayLoad (AMD)/mm.h | 237 ++++++++++++ Voyager/PayLoad (AMD)/pg_table.cpp | 138 ------- Voyager/PayLoad (AMD)/pg_table.h | 167 -------- Voyager/PayLoad (AMD)/types.h | 95 ++++- Voyager/PayLoad (AMD)/vmexit.cpp | 27 ++ Voyager/PayLoad (AMD)/vmexit.h | 8 + Voyager/PayLoad (AMD)/vmexit_handler.cpp | 107 +++++- .../PayLoad (Intel)/PayLoad (Intel).vcxproj | 31 +- .../PayLoad (Intel).vcxproj.filters | 16 +- Voyager/PayLoad (Intel)/debug.cpp | 69 ++++ Voyager/PayLoad (Intel)/debug.h | 13 + Voyager/PayLoad (Intel)/ia32.hpp | 18 +- Voyager/PayLoad (Intel)/mm.cpp | 360 +++++++++++++++++ Voyager/PayLoad (Intel)/mm.h | 165 ++++++++ Voyager/PayLoad (Intel)/pg_table.cpp | 138 ------- Voyager/PayLoad (Intel)/pg_table.h | 167 -------- Voyager/PayLoad (Intel)/types.h | 73 +++- Voyager/PayLoad (Intel)/vmexit.cpp | 34 ++ Voyager/PayLoad (Intel)/vmexit.h | 9 + Voyager/PayLoad (Intel)/vmexit_handler.cpp | 110 +++++- Voyager/Voyager.sln | 109 ++++-- Voyager/Voyager/BootMgfw.c | 36 +- Voyager/Voyager/BootMgfw.h | 4 +- Voyager/Voyager/Hv.c | 9 +- Voyager/Voyager/Hv.h | 1 + Voyager/Voyager/HvLoader.c | 185 +++------ Voyager/Voyager/HvLoader.h | 32 +- Voyager/Voyager/{ShitHook.c => InlineHook.c} | 10 +- Voyager/Voyager/InlineHook.h | 15 + Voyager/Voyager/PagingTables.h | 44 +-- Voyager/Voyager/PayLoad.c | 50 ++- Voyager/Voyager/PayLoad.h | 25 +- Voyager/Voyager/ShitHook.h | 15 - Voyager/Voyager/Utils.h | 1 + Voyager/Voyager/Voyager.vcxproj | 35 +- Voyager/Voyager/Voyager.vcxproj.filters | 12 +- Voyager/Voyager/WinLoad.c | 110 ++---- Voyager/Voyager/WinLoad.h | 11 +- .../MdePkg/Include/IndustryStandard/Acpi10.h | 6 +- .../MdePkg/Include/IndustryStandard/Acpi20.h | 16 +- .../MdePkg/Include/IndustryStandard/Acpi30.h | 18 +- .../MdePkg/Include/IndustryStandard/Acpi40.h | 22 +- .../MdePkg/Include/IndustryStandard/Acpi50.h | 58 +-- .../MdePkg/Include/IndustryStandard/Acpi51.h | 68 ++-- .../MdePkg/Include/IndustryStandard/Acpi60.h | 76 ++-- .../MdePkg/Include/IndustryStandard/Acpi61.h | 76 ++-- .../MdePkg/Include/IndustryStandard/Acpi62.h | 112 +++--- .../MdePkg/Include/IndustryStandard/PeImage.h | 2 +- .../edk2/MdePkg/Include/Protocol/DevicePath.h | 12 +- .../MdePkg/Include/Protocol/GraphicsOutput.h | 2 +- .../MdePkg/Include/Protocol/LoadedImage.h | 2 +- .../edk2/MdePkg/Include/Uefi/UefiMultiPhase.h | 2 +- .../edk2/MdePkg/Include/Uefi/UefiSpec.h | 4 +- Voyager/example/example.vcxproj | 67 ++++ Voyager/example/example.vcxproj.filters | 38 ++ .../example/example.vcxproj.user | 0 Voyager/example/libvoyager.hpp | 151 ++++++++ Voyager/example/libvoyager.lib | Bin 0 -> 1066914 bytes Voyager/example/main.cpp | 81 ++++ Voyager/example/util/nt.hpp | 89 +++++ Voyager/example/util/util.hpp | 264 +++++++++++++ Voyager/example/vdm_ctx/vdm_ctx.cpp | 124 ++++++ Voyager/example/vdm_ctx/vdm_ctx.hpp | 125 ++++++ .../libvoyager}/com.asm | 0 Voyager/libvoyager/libvoyager.cpp | 81 ++++ Voyager/libvoyager/libvoyager.hpp | 151 ++++++++ Voyager/libvoyager/libvoyager.sln | 31 ++ Voyager/libvoyager/libvoyager.vcxproj | 68 ++++ .../libvoyager/libvoyager.vcxproj.filters | 4 +- Voyager/libvoyager/libvoyager.vcxproj.user | 4 + img/sections.PNG | Bin 0 -> 45545 bytes 82 files changed, 3755 insertions(+), 1508 deletions(-) delete mode 100644 Usermode Example/Example.sln delete mode 100644 Usermode Example/Example.vcxproj delete mode 100644 Usermode Example/com.h delete mode 100644 Usermode Example/main.cpp create mode 100644 Voyager/PayLoad (AMD)/debug.cpp create mode 100644 Voyager/PayLoad (AMD)/debug.h create mode 100644 Voyager/PayLoad (AMD)/mm.cpp create mode 100644 Voyager/PayLoad (AMD)/mm.h delete mode 100644 Voyager/PayLoad (AMD)/pg_table.cpp delete mode 100644 Voyager/PayLoad (AMD)/pg_table.h create mode 100644 Voyager/PayLoad (AMD)/vmexit.cpp create mode 100644 Voyager/PayLoad (AMD)/vmexit.h create mode 100644 Voyager/PayLoad (Intel)/debug.cpp create mode 100644 Voyager/PayLoad (Intel)/debug.h create mode 100644 Voyager/PayLoad (Intel)/mm.cpp create mode 100644 Voyager/PayLoad (Intel)/mm.h delete mode 100644 Voyager/PayLoad (Intel)/pg_table.cpp delete mode 100644 Voyager/PayLoad (Intel)/pg_table.h create mode 100644 Voyager/PayLoad (Intel)/vmexit.cpp create mode 100644 Voyager/PayLoad (Intel)/vmexit.h rename Voyager/Voyager/{ShitHook.c => InlineHook.c} (70%) create mode 100644 Voyager/Voyager/InlineHook.h delete mode 100644 Voyager/Voyager/ShitHook.h create mode 100644 Voyager/example/example.vcxproj create mode 100644 Voyager/example/example.vcxproj.filters rename Usermode Example/Example.vcxproj.user => Voyager/example/example.vcxproj.user (100%) create mode 100644 Voyager/example/libvoyager.hpp create mode 100644 Voyager/example/libvoyager.lib create mode 100644 Voyager/example/main.cpp create mode 100644 Voyager/example/util/nt.hpp create mode 100644 Voyager/example/util/util.hpp create mode 100644 Voyager/example/vdm_ctx/vdm_ctx.cpp create mode 100644 Voyager/example/vdm_ctx/vdm_ctx.hpp rename {Usermode Example => Voyager/libvoyager}/com.asm (100%) create mode 100644 Voyager/libvoyager/libvoyager.cpp create mode 100644 Voyager/libvoyager/libvoyager.hpp create mode 100644 Voyager/libvoyager/libvoyager.sln create mode 100644 Voyager/libvoyager/libvoyager.vcxproj rename Usermode Example/Example.vcxproj.filters => Voyager/libvoyager/libvoyager.vcxproj.filters (90%) create mode 100644 Voyager/libvoyager/libvoyager.vcxproj.user create mode 100644 img/sections.PNG diff --git a/README.md b/README.md index f547dd6..aa2a086 100644 --- a/README.md +++ b/README.md @@ -79,4 +79,67 @@ rename it to `payload.dll`. Put both `bootmgfw.efi` (Voyager.efi rename), and `p
- \ No newline at end of file + + +### libvoyager + +libvoyager is a tiny lib that allows a programmer to integrate voyager into VDM or other projects that require reading and writing to physical and virtual memory. There is +an example in the repo which contains example code for integrating into VDM. + +```cpp +vdm::read_phys_t _read_phys = + [&](void* addr, void* buffer, std::size_t size) -> bool +{ + const auto read_result = + voyager::read_phys((u64)addr, (u64)buffer, size); + + return read_result == + voyager::vmxroot_error_t::error_success; +}; + +vdm::write_phys_t _write_phys = + [&](void* addr, void* buffer, std::size_t size) -> bool +{ + const auto write_result = + voyager::write_phys((u64)addr, (u64)buffer, size); + + return write_result == + voyager::vmxroot_error_t::error_success; +}; +``` + +Any project that uses VDM can now use Voyager instead of a vulnerable driver. This includes all PTM projects. + +### Page Table Code + +mm.cpp and mm.hpp contain all of the memory managment code. Hyper-v has a self referencing PML4E at index 510. This is the same index for all versions of Hyper-v. +This is crucial as without knowing where the PML4 of the current logical processor is located in virtual memory, there is no way to interface with physical memory. +Each logical processor running under hyper-v has its own host cr3 value (each core has its own host PML4). + +###### Mapping PTE's + +In the Intel and AMD payloads of this project, there is a section for PDPT, PD, and PT. These sections need to be page aligned in +order for them to work (they are just putting this here as a warning). Each logical processor has two PTE's, one for source and one for destination. This allows for +copying of physical memory between two pages without requiring a buffer. + +```cpp + +auto mm::map_page(host_phys_t phys_addr, map_type_t map_type) -> u64 +{ + cpuid_eax_01 cpuid_value; + __cpuid((int*)&cpuid_value, 1); + + mm::pt[(cpuid_value + .cpuid_additional_information + .initial_apic_id * 2) + + (unsigned)map_type].pfn = phys_addr >> 12; + + __invlpg(reinterpret_cast( + get_map_virt(virt_addr_t{ phys_addr }.offset_4kb, map_type))); + + return get_map_virt(virt_addr_t{ phys_addr }.offset_4kb, map_type); +} +``` + +As you can see from the code above, the logical processor number which is obtained from CPUID instruction is mulitplied by the `map_type`. There can be a max of 256 cores on the system, if there +are more then 256 cores on the system then this code above will not work. \ No newline at end of file diff --git a/Usermode Example/Example.sln b/Usermode Example/Example.sln deleted file mode 100644 index 70996b7..0000000 --- a/Usermode Example/Example.sln +++ /dev/null @@ -1,31 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30503.244 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Example", "Example.vcxproj", "{09B41831-3164-48AD-8660-23457D82B73B}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {09B41831-3164-48AD-8660-23457D82B73B}.Debug|x64.ActiveCfg = Debug|x64 - {09B41831-3164-48AD-8660-23457D82B73B}.Debug|x64.Build.0 = Debug|x64 - {09B41831-3164-48AD-8660-23457D82B73B}.Debug|x86.ActiveCfg = Debug|Win32 - {09B41831-3164-48AD-8660-23457D82B73B}.Debug|x86.Build.0 = Debug|Win32 - {09B41831-3164-48AD-8660-23457D82B73B}.Release|x64.ActiveCfg = Release|x64 - {09B41831-3164-48AD-8660-23457D82B73B}.Release|x64.Build.0 = Release|x64 - {09B41831-3164-48AD-8660-23457D82B73B}.Release|x86.ActiveCfg = Release|Win32 - {09B41831-3164-48AD-8660-23457D82B73B}.Release|x86.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {E132D109-7F0D-4125-B737-B5D83E6FBCA8} - EndGlobalSection -EndGlobal diff --git a/Usermode Example/Example.vcxproj b/Usermode Example/Example.vcxproj deleted file mode 100644 index 4b74ae6..0000000 --- a/Usermode Example/Example.vcxproj +++ /dev/null @@ -1,158 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - Win32Proj - {09b41831-3164-48ad-8660-23457d82b73b} - DeepSpaceNetwork - 10.0 - Example - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - - true - - - false - - - true - - - false - - - - Level3 - true - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - - - - - Level3 - true - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - true - true - - - - - Level3 - true - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - true - true - - - - - - - - Document - - - - - - - - - - \ No newline at end of file diff --git a/Usermode Example/com.h b/Usermode Example/com.h deleted file mode 100644 index 4e0f783..0000000 --- a/Usermode Example/com.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once -#define VMEXIT_KEY 0xDEADBEEFDEADBEEF -enum class vmexit_command_t -{ - init_paging_tables = 0x111 - // add your commands here... -}; - -extern "C" size_t hypercall(size_t key, vmexit_command_t command); \ No newline at end of file diff --git a/Usermode Example/main.cpp b/Usermode Example/main.cpp deleted file mode 100644 index fdf7344..0000000 --- a/Usermode Example/main.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include "com.h" - -int main() -{ - auto result = hypercall(VMEXIT_KEY, vmexit_command_t::init_paging_tables); - std::printf("[+] hyper-v (CPUID) init page table result -> %d\n", result); - std::getchar(); -} \ No newline at end of file diff --git a/Voyager/PayLoad (AMD)/PayLoad (AMD).vcxproj b/Voyager/PayLoad (AMD)/PayLoad (AMD).vcxproj index d3fb4b0..8097e8b 100644 --- a/Voyager/PayLoad (AMD)/PayLoad (AMD).vcxproj +++ b/Voyager/PayLoad (AMD)/PayLoad (AMD).vcxproj @@ -56,7 +56,7 @@ Windows10 false - WindowsKernelModeDriver10.0 + v142 DynamicLibrary KMDF Universal @@ -65,7 +65,7 @@ Windows10 false - WindowsKernelModeDriver10.0 + v142 DynamicLibrary KMDF Universal @@ -74,7 +74,7 @@ Windows10 false - WindowsKernelModeDriver10.0 + v142 DynamicLibrary KMDF Universal @@ -83,7 +83,7 @@ Windows10 false - WindowsKernelModeDriver10.0 + v142 DynamicLibrary KMDF Universal @@ -92,7 +92,7 @@ Windows10 false - WindowsKernelModeDriver10.0 + v142 DynamicLibrary KMDF Universal @@ -101,7 +101,7 @@ Windows10 false - WindowsKernelModeDriver10.0 + v142 DynamicLibrary KMDF Universal @@ -110,7 +110,7 @@ Windows10 false - WindowsKernelModeDriver10.0 + v142 DynamicLibrary KMDF Universal @@ -119,7 +119,7 @@ Windows10 false - WindowsKernelModeDriver10.0 + v142 DynamicLibrary KMDF Universal @@ -128,7 +128,7 @@ Windows10 false - WindowsKernelModeDriver10.0 + v142 DynamicLibrary KMDF Universal @@ -137,7 +137,7 @@ Windows10 false - WindowsKernelModeDriver10.0 + v142 DynamicLibrary KMDF Universal @@ -198,9 +198,13 @@ false false _WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions);WINVER=1909; + Disabled + MultiThreaded + false vmexit_handler + libcmt.lib;libucrt.lib;libvcruntime.lib;%(AdditionalDependencies) @@ -210,9 +214,13 @@ false false _WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions);WINVER=1903; + Disabled + MultiThreaded + false vmexit_handler + libcmt.lib;libucrt.lib;libvcruntime.lib;%(AdditionalDependencies) @@ -222,9 +230,13 @@ false false _WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions);WINVER=1809; + Disabled + MultiThreaded + false vmexit_handler + libcmt.lib;libucrt.lib;libvcruntime.lib;%(AdditionalDependencies) @@ -234,9 +246,13 @@ false false _WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions);WINVER=1803; + Disabled + MultiThreaded + false vmexit_handler + libcmt.lib;libucrt.lib;libvcruntime.lib;%(AdditionalDependencies) @@ -246,9 +262,13 @@ false false _WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions);WINVER=1709 + Disabled + MultiThreaded + false vmexit_handler + libcmt.lib;libucrt.lib;libvcruntime.lib;%(AdditionalDependencies) @@ -258,9 +278,13 @@ false false _WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions);WINVER=1703 + Disabled + MultiThreaded + false vmexit_handler + libcmt.lib;libucrt.lib;libvcruntime.lib;%(AdditionalDependencies) @@ -270,9 +294,13 @@ false false _WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions);WINVER=1607 + Disabled + MultiThreaded + false vmexit_handler + libcmt.lib;libucrt.lib;libvcruntime.lib;%(AdditionalDependencies) @@ -282,9 +310,13 @@ false false _WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions);WINVER=1511; + Disabled + MultiThreaded + false vmexit_handler + libcmt.lib;libucrt.lib;libvcruntime.lib;%(AdditionalDependencies) @@ -293,10 +325,14 @@ false false false - _WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions);WINVER=1903; + _WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions);WINVER=1507; + Disabled + MultiThreaded + false vmexit_handler + libcmt.lib;libucrt.lib;libvcruntime.lib;%(AdditionalDependencies) @@ -306,21 +342,29 @@ false false _WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions);WINVER=2004; + Disabled + MultiThreaded + false vmexit_handler + libcmt.lib;libucrt.lib;libvcruntime.lib;%(AdditionalDependencies) + - + + - + + + diff --git a/Voyager/PayLoad (AMD)/PayLoad (AMD).vcxproj.filters b/Voyager/PayLoad (AMD)/PayLoad (AMD).vcxproj.filters index 6fa82c1..6b15131 100644 --- a/Voyager/PayLoad (AMD)/PayLoad (AMD).vcxproj.filters +++ b/Voyager/PayLoad (AMD)/PayLoad (AMD).vcxproj.filters @@ -14,10 +14,16 @@ Header Files - + Header Files - + + Header Files + + + Header Files + + Header Files @@ -25,7 +31,13 @@ Source Files - + + Source Files + + + Source Files + + Source Files diff --git a/Voyager/PayLoad (AMD)/debug.cpp b/Voyager/PayLoad (AMD)/debug.cpp new file mode 100644 index 0000000..013c4ec --- /dev/null +++ b/Voyager/PayLoad (AMD)/debug.cpp @@ -0,0 +1,69 @@ +#include "debug.h" + +auto dbg::debug_print_decimal(long long number) -> void +{ + if (number < 0) + { + __outbyte(PORT_NUM, '-'); + number = -number; + } + + for (auto d = 1000000000000000000; d != 0; d /= 10) + if ((number / d) != 0) + __outbyte(PORT_NUM, alphabet[(number / d) % 10]); +} + +auto dbg::debug_print_hex(u64 number, const bool show_zeros) -> void +{ + for (auto d = 0x1000000000000000; d != 0; d /= 0x10) + if (show_zeros || (number / d) != 0) + __outbyte(PORT_NUM, alphabet[(number / d) % 0x10]); +} + +auto dbg::print(const char* format, ...) -> void +{ + va_list args; + va_start(args, format); + + while (format[0]) + { + if (format[0] == '%') + { + switch (format[1]) + { + case 'd': + debug_print_decimal(va_arg(args, int)); + format += 2; + continue; + case 'x': + debug_print_hex(va_arg(args, u32), false); + format += 2; + continue; + case 'l': + if (format[2] == 'l') + { + switch (format[3]) + { + case 'd': + debug_print_decimal(va_arg(args, u64)); + format += 4; + continue; + case 'x': + debug_print_hex(va_arg(args, u64), false); + format += 4; + continue; + } + } + break; + case 'p': + debug_print_hex(va_arg(args, u64), true); + format += 2; + continue; + } + } + + __outbyte(PORT_NUM, format[0]); + ++format; + } + va_end(args); +} \ No newline at end of file diff --git a/Voyager/PayLoad (AMD)/debug.h b/Voyager/PayLoad (AMD)/debug.h new file mode 100644 index 0000000..fda84d7 --- /dev/null +++ b/Voyager/PayLoad (AMD)/debug.h @@ -0,0 +1,13 @@ +#pragma once +#include +#include +#include "types.h" + +#define PORT_NUM 0x2F8 +namespace dbg +{ + constexpr char alphabet[] = "0123456789ABCDEF"; + auto debug_print_decimal(long long number) -> void; + auto debug_print_hex(u64 number, const bool show_zeros) -> void; + auto print(const char* format, ...) -> void; +} \ No newline at end of file diff --git a/Voyager/PayLoad (AMD)/ia32.hpp b/Voyager/PayLoad (AMD)/ia32.hpp index dc0400c..256a0c3 100644 --- a/Voyager/PayLoad (AMD)/ia32.hpp +++ b/Voyager/PayLoad (AMD)/ia32.hpp @@ -14132,7 +14132,7 @@ typedef union }; UINT64_t flags; -} pml4e_64; +} pml4e; /** * @brief Format of a 4-Level Page-Directory-Pointer-Table Entry (PDPTE) that Maps a 1-GByte Page @@ -14431,7 +14431,7 @@ typedef union }; UINT64_t flags; -} pdpte_64; +} pdpte; /** * @brief Format of a 4-Level Page-Directory Entry that Maps a 2-MByte Page @@ -14730,7 +14730,7 @@ typedef union }; UINT64_t flags; -} pde_64; +} pde; /** * @brief Format of a 4-Level Page-Table Entry that Maps a 4-KByte Page @@ -14891,7 +14891,7 @@ typedef union }; UINT64_t flags; -} pte_64; +} pte; /** * @brief Format of a common Page-Table Entry @@ -18281,7 +18281,7 @@ typedef union }; UINT64_t flags; -} ept_pml4; +} ept_pml4e; /** * @brief Format of an EPT Page-Directory-Pointer-Table Entry (PDPTE) that Maps a 1-GByte Page @@ -18412,7 +18412,7 @@ typedef union }; UINT64_t flags; -} epdpte_1gb; +} ept_pdpte_1gb; /** * @brief Format of an EPT Page-Directory-Pointer-Table Entry (PDPTE) that References an EPT Page Directory @@ -18489,7 +18489,7 @@ typedef union }; UINT64_t flags; -} epdpte; +} ept_pdpte; /** * @brief Format of an EPT Page-Directory Entry (PDE) that Maps a 2-MByte Page @@ -18697,7 +18697,7 @@ typedef union }; UINT64_t flags; -} epde; +} ept_pde; /** * @brief Format of an EPT Page-Table Entry that Maps a 4-KByte Page @@ -18820,7 +18820,7 @@ typedef union }; UINT64_t flags; -} epte; +} ept_pte; /** * @brief Format of a common EPT Entry diff --git a/Voyager/PayLoad (AMD)/mm.cpp b/Voyager/PayLoad (AMD)/mm.cpp new file mode 100644 index 0000000..29fedca --- /dev/null +++ b/Voyager/PayLoad (AMD)/mm.cpp @@ -0,0 +1,363 @@ +#include "mm.h" +#include "debug.h" + +auto mm::map_guest_phys(guest_phys_t phys_addr, map_type_t map_type) -> u64 +{ + //const auto host_phys = + //translate_guest_physical( + //phys_addr, map_type); + + //if (!host_phys) + //return {}; + + return map_page(phys_addr, map_type); +} + +auto mm::map_guest_virt(guest_phys_t dirbase, guest_virt_t virt_addr, map_type_t map_type) -> u64 +{ + const auto guest_phys = + translate_guest_virtual( + dirbase, virt_addr, map_type); + + if (!guest_phys) + return {}; + + return map_guest_phys(guest_phys, map_type); +} + +auto mm::map_page(host_phys_t phys_addr, map_type_t map_type) -> u64 +{ + cpuid_eax_01 cpuid_value; + __cpuid((int*)&cpuid_value, 1); + + mm::pt[(cpuid_value + .cpuid_additional_information + .initial_apic_id * 2) + + (unsigned)map_type].pfn = phys_addr >> 12; + + __invlpg(reinterpret_cast( + get_map_virt(virt_addr_t{ phys_addr }.offset_4kb, map_type))); + + return get_map_virt(virt_addr_t{ phys_addr }.offset_4kb, map_type); +} + +auto mm::get_map_virt(u16 offset, map_type_t map_type) -> u64 +{ + cpuid_eax_01 cpuid_value; + __cpuid((int*)&cpuid_value, 1); + virt_addr_t virt_addr{ MAPPING_ADDRESS_BASE }; + + virt_addr.pt_index = (cpuid_value + .cpuid_additional_information + .initial_apic_id * 2) + + (unsigned)map_type; + + return virt_addr.value + offset; +} + +auto mm::translate(host_virt_t host_virt) -> u64 +{ + virt_addr_t virt_addr{ host_virt }; + virt_addr_t cursor{ (u64)hyperv_pml4 }; + + if (!reinterpret_cast(cursor.value)[virt_addr.pml4_index].present) + return {}; + + cursor.pt_index = virt_addr.pml4_index; + if (!reinterpret_cast(cursor.value)[virt_addr.pdpt_index].present) + return {}; + + // handle 1gb large page... + if (reinterpret_cast(cursor.value)[virt_addr.pdpt_index].large_page) + return (reinterpret_cast(cursor.value) + [virt_addr.pdpt_index].pfn << 30) + virt_addr.offset_1gb; + + cursor.pd_index = virt_addr.pml4_index; + cursor.pt_index = virt_addr.pdpt_index; + if (!reinterpret_cast(cursor.value)[virt_addr.pd_index].present) + return {}; + + // handle 2mb large page... + if (reinterpret_cast(cursor.value)[virt_addr.pd_index].large_page) + return (reinterpret_cast(cursor.value) + [virt_addr.pd_index].pfn << 21) + virt_addr.offset_2mb; + + cursor.pdpt_index = virt_addr.pml4_index; + cursor.pd_index = virt_addr.pdpt_index; + cursor.pt_index = virt_addr.pd_index; + if (!reinterpret_cast(cursor.value)[virt_addr.pt_index].present) + return {}; + + return (reinterpret_cast(cursor.value) + [virt_addr.pt_index].pfn << 12) + virt_addr.offset_4kb; +} + +auto mm::translate_guest_virtual(guest_phys_t dirbase, guest_virt_t guest_virt, map_type_t map_type) -> u64 +{ + virt_addr_t virt_addr{ guest_virt }; + + const auto pml4 = + reinterpret_cast( + map_guest_phys(dirbase, map_type)); + + if (!pml4 || !pml4[virt_addr.pml4_index].present) + return {}; + + const auto pdpt = + reinterpret_cast(map_guest_phys( + pml4[virt_addr.pml4_index].pfn << 12, map_type)); + + if (!pdpt || !pdpt[virt_addr.pdpt_index].present) + return {}; + + // handle 1gb pages... + if (pdpt[virt_addr.pdpt_index].large_page) + return (pdpt[virt_addr.pdpt_index].pfn << 12) + virt_addr.offset_1gb; + + const auto pd = + reinterpret_cast(map_guest_phys( + pdpt[virt_addr.pdpt_index].pfn << 12, map_type)); + + if (!pd || !pd[virt_addr.pd_index].present) + return {}; + + // handle 2mb pages... + if (pd[virt_addr.pd_index].large_page) + return (pd[virt_addr.pd_index].pfn << 12) + virt_addr.offset_2mb; + + const auto pt = + reinterpret_cast(map_guest_phys( + pd[virt_addr.pd_index].pfn << 12, map_type)); + + if (!pt || !pt[virt_addr.pt_index].present) + return {}; + + return (pt[virt_addr.pt_index].pfn << 12) + virt_addr.offset_4kb; +} + +auto mm::translate_guest_physical(guest_phys_t phys_addr, map_type_t map_type) -> u64 +{ + phys_addr_t guest_phys{ phys_addr }; + const auto vmcb = svm::get_vmcb(); + + const auto npt_pml4 = + reinterpret_cast( + map_page(vmcb->ncr3, map_type)); + + if (!npt_pml4[guest_phys.pml4_index].present) + return {}; + + const auto npt_pdpt = + reinterpret_cast( + map_page(npt_pml4[guest_phys.pml4_index].pfn << 12, map_type)); + + if (!npt_pdpt[guest_phys.pdpt_index].present) + return {}; + + const auto npt_pd = + reinterpret_cast( + map_page(npt_pdpt[guest_phys.pdpt_index].pfn << 12, map_type)); + + if (!npt_pd[guest_phys.pd_index].present) + return {}; + + // handle 2mb pages... + if (reinterpret_cast(npt_pd)[guest_phys.pd_index].large_page) + return (reinterpret_cast(npt_pd) + [guest_phys.pd_index].pfn << 21) + guest_phys.offset_2mb; + + const auto npt_pt = + reinterpret_cast( + map_page(npt_pd[guest_phys.pd_index].pfn << 12, map_type)); + + if (!npt_pt[guest_phys.pt_index].present) + return {}; + + return (npt_pt[guest_phys.pt_index].pfn << 12) + guest_phys.offset_4kb; +} + +auto mm::init() -> svm::vmxroot_error_t +{ + const auto pdpt_phys = + translate(reinterpret_cast(pdpt)); + + const auto pd_phys = + translate(reinterpret_cast(pd)); + + const auto pt_phys = + translate(reinterpret_cast(pt)); + + if (!pdpt_phys || !pd_phys || !pt_phys) + return svm::vmxroot_error_t::invalid_host_virtual; + + // setup mapping page table entries... + { + hyperv_pml4[MAPPING_PML4_IDX].present = true; + hyperv_pml4[MAPPING_PML4_IDX].pfn = pdpt_phys >> 12; + hyperv_pml4[MAPPING_PML4_IDX].user_supervisor = false; + hyperv_pml4[MAPPING_PML4_IDX].writeable = true; + + pdpt[511].present = true; + pdpt[511].pfn = pd_phys >> 12; + pdpt[511].user_supervisor = false; + pdpt[511].rw = true; + + pd[511].present = true; + pd[511].pfn = pt_phys >> 12; + pd[511].user_supervisor = false; + pd[511].rw = true; + } + + // each core will have its own page it can use to map + // physical memory into virtual memory :^) + for (auto idx = 0u; idx < 512; ++idx) + { + pt[idx].present = true; + pt[idx].user_supervisor = false; + pt[idx].rw = true; + } + + const auto mapped_pml4 = + reinterpret_cast( + mm::map_page(__readcr3())); + + // check to make sure translate works... + if (translate((u64)mapped_pml4) != __readcr3()) + return svm::vmxroot_error_t::vmxroot_translate_failure; + + // check to make sure the self ref pml4e is valid... + if (mapped_pml4[SELF_REF_PML4_IDX].pfn != __readcr3() >> 12) + return svm::vmxroot_error_t::invalid_self_ref_pml4e; + + // check to make sure the mapping pml4e is valid... + if (mapped_pml4[MAPPING_PML4_IDX].pfn != pdpt_phys >> 12) + return svm::vmxroot_error_t::invalid_mapping_pml4e; + + return svm::vmxroot_error_t::error_success; +} + +auto mm::read_guest_phys(guest_phys_t dirbase, guest_phys_t guest_phys, + guest_virt_t guest_virt, u64 size) -> svm::vmxroot_error_t +{ + // handle reading over page boundaries of both src and dest... + while (size) + { + auto dest_current_size = PAGE_4KB - + virt_addr_t{ guest_virt }.offset_4kb; + + if (size < dest_current_size) + dest_current_size = size; + + auto src_current_size = PAGE_4KB - + phys_addr_t{ guest_phys }.offset_4kb; + + if (size < src_current_size) + src_current_size = size; + + auto current_size = + min(dest_current_size, src_current_size); + + const auto mapped_dest = + reinterpret_cast( + map_guest_virt(dirbase, guest_virt, map_type_t::map_dest)); + + if (!mapped_dest) + return svm::vmxroot_error_t::invalid_guest_virtual; + + const auto mapped_src = + reinterpret_cast( + map_guest_phys(guest_phys, map_type_t::map_src)); + + if (!mapped_src) + return svm::vmxroot_error_t::invalid_guest_physical; + + memcpy(mapped_dest, mapped_src, current_size); + guest_phys += current_size; + guest_virt += current_size; + size -= current_size; + } + + return svm::vmxroot_error_t::error_success; +} + +auto mm::write_guest_phys(guest_phys_t dirbase, + guest_phys_t guest_phys, guest_virt_t guest_virt, u64 size) -> svm::vmxroot_error_t +{ + // handle reading over page boundaries of both src and dest... + while (size) + { + auto dest_current_size = PAGE_4KB - + virt_addr_t{ guest_virt }.offset_4kb; + + if (size < dest_current_size) + dest_current_size = size; + + auto src_current_size = PAGE_4KB - + phys_addr_t{ guest_phys }.offset_4kb; + + if (size < src_current_size) + src_current_size = size; + + auto current_size = + min(dest_current_size, src_current_size); + + const auto mapped_src = + reinterpret_cast( + map_guest_virt(dirbase, guest_virt, map_type_t::map_src)); + + if (!mapped_src) + return svm::vmxroot_error_t::invalid_guest_virtual; + + const auto mapped_dest = + reinterpret_cast( + map_guest_phys(guest_phys, map_type_t::map_dest)); + + if (!mapped_src) + return svm::vmxroot_error_t::invalid_guest_physical; + + memcpy(mapped_dest, mapped_src, current_size); + guest_phys += current_size; + guest_virt += current_size; + size -= current_size; + } + + return svm::vmxroot_error_t::error_success; +} + +auto mm::copy_guest_virt(guest_phys_t dirbase_src, guest_virt_t virt_src, + guest_virt_t dirbase_dest, guest_virt_t virt_dest, u64 size) -> svm::vmxroot_error_t +{ + while (size) + { + auto dest_size = PAGE_4KB - virt_addr_t{ virt_dest }.offset_4kb; + if (size < dest_size) + dest_size = size; + + auto src_size = PAGE_4KB - virt_addr_t{ virt_src }.offset_4kb; + if (size < src_size) + src_size = size; + + const auto mapped_src = + reinterpret_cast( + map_guest_virt(dirbase_src, virt_src, map_type_t::map_src)); + + if (!mapped_src) + return svm::vmxroot_error_t::invalid_guest_virtual; + + const auto mapped_dest = + reinterpret_cast( + map_guest_virt(dirbase_dest, virt_dest, map_type_t::map_dest)); + + if (!mapped_dest) + return svm::vmxroot_error_t::invalid_guest_virtual; + + auto current_size = min(dest_size, src_size); + memcpy(mapped_dest, mapped_src, current_size); + + virt_src += current_size; + virt_dest += current_size; + size -= current_size; + } + + return svm::vmxroot_error_t::error_success; +} \ No newline at end of file diff --git a/Voyager/PayLoad (AMD)/mm.h b/Voyager/PayLoad (AMD)/mm.h new file mode 100644 index 0000000..391977b --- /dev/null +++ b/Voyager/PayLoad (AMD)/mm.h @@ -0,0 +1,237 @@ +#pragma once +#include "types.h" + +#define SELF_REF_PML4_IDX 510 +#define MAPPING_PML4_IDX 100 + +#define MAPPING_ADDRESS_BASE 0x0000327FFFE00000 +#define SELF_REF_PML4 0xFFFFFF7FBFDFE000 + +#define EPT_LARGE_PDPTE_OFFSET(_) (((u64)(_)) & ((0x1000 * 0x200 * 0x200) - 1)) +#define EPT_LARGE_PDE_OFFSET(_) (((u64)(_)) & ((0x1000 * 0x200) - 1)) + +#pragma section(".pdpt", read, write) +#pragma section(".pd", read, write) +#pragma section(".pt", read, write) + +namespace mm +{ + enum class map_type_t + { + map_src, + map_dest + }; + + typedef union _virt_addr_t + { + u64 value; + struct + { + u64 offset_4kb : 12; + u64 pt_index : 9; + u64 pd_index : 9; + u64 pdpt_index : 9; + u64 pml4_index : 9; + u64 reserved : 16; + }; + + struct + { + u64 offset_2mb : 21; + u64 pd_index : 9; + u64 pdpt_index : 9; + u64 pml4_index : 9; + u64 reserved : 16; + }; + + struct + { + u64 offset_1gb : 30; + u64 pdpt_index : 9; + u64 pml4_index : 9; + u64 reserved : 16; + }; + + } virt_addr_t, * pvirt_addr_t; + using phys_addr_t = virt_addr_t; + + typedef union _pml4e + { + u64 value; + struct + { + u64 present : 1; + u64 writeable : 1; + u64 user_supervisor : 1; + u64 page_write_through : 1; + u64 page_cache : 1; + u64 accessed : 1; + u64 ignore_1 : 1; + u64 page_size : 1; + u64 ignore_2 : 4; + u64 pfn : 36; + u64 reserved : 4; + u64 ignore_3 : 11; + u64 nx : 1; + }; + } pml4e, * ppml4e; + + typedef union _pdpte + { + u64 value; + struct + { + u64 present : 1; + u64 rw : 1; + u64 user_supervisor : 1; + u64 page_write_through : 1; + u64 page_cache : 1; + u64 accessed : 1; + u64 ignore_1 : 1; + u64 large_page : 1; + u64 ignore_2 : 4; + u64 pfn : 36; + u64 reserved : 4; + u64 ignore_3 : 11; + u64 nx : 1; + }; + } pdpte, * ppdpte; + + typedef union _pde + { + u64 value; + struct + { + u64 present : 1; + u64 rw : 1; + u64 user_supervisor : 1; + u64 page_write_through : 1; + u64 page_cache : 1; + u64 accessed : 1; + u64 ignore_1 : 1; + u64 large_page : 1; + u64 ignore_2 : 4; + u64 pfn : 36; + u64 reserved : 4; + u64 ignore_3 : 11; + u64 nx : 1; + }; + } pde, * ppde; + + typedef union _pte + { + u64 value; + struct + { + u64 present : 1; + u64 rw : 1; + u64 user_supervisor : 1; + u64 page_write_through : 1; + u64 page_cache : 1; + u64 accessed : 1; + u64 dirty : 1; + u64 access_type : 1; + u64 global : 1; + u64 ignore_2 : 3; + u64 pfn : 36; + u64 reserved : 4; + u64 ignore_3 : 7; + u64 pk : 4; + u64 nx : 1; + }; + } pte, * ppte; + + typedef struct _npt_pml4e + { + union + { + u64 value; + struct + { + u64 present : 1; + u64 writeable : 1; + u64 user : 1; + u64 write_through : 1; + u64 cache_disable : 1; + u64 accessed : 1; + u64 reserved1 : 3; + u64 avl : 3; + u64 pfn : 40; + u64 reserved2 : 11; + u64 nx : 1; + }; + }; + } npt_pml4e, *pnpt_pml4e, npt_pdpte, + *pnpt_pdpte, npt_pde, *pnpt_pde; + + typedef struct _npt_pte + { + union + { + u64 value; + struct + { + u64 present : 1; + u64 writeable : 1; + u64 user : 1; + u64 write_through : 1; + u64 cache_disable : 1; + u64 accessed : 1; + u64 dirty : 1; + u64 pat : 1; + u64 global : 1; + u64 avl : 3; + u64 pfn : 40; + u64 reserved : 11; + u64 nx : 1; + }; + }; + } npt_pte, *pnpt_pte; + + typedef struct _npt_pde_2mb + { + union + { + u64 value; + struct + { + u64 present : 1; + u64 writeable : 1; + u64 user : 1; + u64 write_through : 1; + u64 cache_disable : 1; + u64 accessed : 1; + u64 dirty : 1; + u64 large_page : 1; + u64 global : 1; + u64 avl : 3; + u64 pat : 1; + u64 reserved1 : 8; + u64 pfn : 31; + u64 reserved2 : 11; + u64 nx : 1; + }; + }; + } npt_pde_2mb, * pnpt_pde_2mb; + + __declspec(allocate(".pdpt")) inline pdpte pdpt[512]; + __declspec(allocate(".pd")) inline pde pd[512]; + __declspec(allocate(".pt")) inline pte pt[512]; + + inline const ppml4e hyperv_pml4{ reinterpret_cast(SELF_REF_PML4) }; + + auto init() -> svm::vmxroot_error_t; + auto map_guest_phys(guest_phys_t phys_addr, map_type_t map_type = map_type_t::map_src) -> u64; + auto map_guest_virt(guest_phys_t dirbase, guest_virt_t virt_addr, map_type_t map_type = map_type_t::map_src) -> u64; + + auto map_page(host_phys_t phys_addr, map_type_t map_type = map_type_t::map_src) -> u64; + auto get_map_virt(u16 offset = 0u, map_type_t map_type = map_type_t::map_src) -> u64; + + auto translate(host_virt_t host_virt) -> u64; + auto translate_guest_physical(guest_phys_t guest_phys, map_type_t map_type = map_type_t::map_src) -> u64; + auto translate_guest_virtual(guest_phys_t dirbase, guest_virt_t guest_virt, map_type_t map_type = map_type_t::map_src) -> u64; + + auto read_guest_phys(guest_phys_t dirbase, guest_phys_t guest_phys, guest_virt_t guest_virt, u64 size) -> svm::vmxroot_error_t; + auto write_guest_phys(guest_phys_t dirbase, guest_phys_t guest_phys, guest_virt_t guest_virt, u64 size) -> svm::vmxroot_error_t; + auto copy_guest_virt(guest_phys_t dirbase_src, guest_virt_t virt_src, guest_virt_t dirbase_dest, guest_virt_t virt_dest, u64 size) ->svm::vmxroot_error_t; +} \ No newline at end of file diff --git a/Voyager/PayLoad (AMD)/pg_table.cpp b/Voyager/PayLoad (AMD)/pg_table.cpp deleted file mode 100644 index e523f21..0000000 --- a/Voyager/PayLoad (AMD)/pg_table.cpp +++ /dev/null @@ -1,138 +0,0 @@ -#include "pg_table.h" - -namespace pg_table -{ - void* translate(void* virtual_address, const ptable_entries entries) - { - virt_addr_t virt_addr{ virtual_address }; - virt_addr_t cursor{ hyperv_pml4 }; - - if (entries) entries->pml4e = reinterpret_cast(cursor.value)[virt_addr.pml4_index]; - if (!reinterpret_cast(cursor.value)[virt_addr.pml4_index].present) - return nullptr; - - // set the cursor to self reference so that when we read - // the addresses pointed to by cursor its going to be a pdpt... - cursor.pdpt_index = virt_addr_t{ hyperv_pml4 }.pml4_index; - cursor.pd_index = virt_addr_t{ hyperv_pml4 }.pml4_index; - cursor.pt_index = virt_addr.pml4_index; - if (entries) entries->pdpte = reinterpret_cast(cursor.value)[virt_addr.pdpt_index]; - - if (!reinterpret_cast(cursor.value)[virt_addr.pdpt_index].present) - return nullptr; - - // set the cursor to self reference so that when we read - // the addresses pointed to by cursor its going to be a pd... - cursor.pdpt_index = virt_addr_t{ hyperv_pml4 }.pml4_index; - cursor.pd_index = virt_addr.pml4_index; - cursor.pt_index = virt_addr.pdpt_index; - if (entries) entries->pde = reinterpret_cast(cursor.value)[virt_addr.pd_index]; - - if (!reinterpret_cast(cursor.value)[virt_addr.pd_index].present) - return nullptr; - - // set the cursor to self reference so that when we read - // the addresses pointed to by cursor its going to be a pt... - cursor.pdpt_index = virt_addr.pml4_index; - cursor.pd_index = virt_addr.pdpt_index; - cursor.pt_index = virt_addr.pd_index; - if (entries) entries->pte = reinterpret_cast(cursor.value)[virt_addr.pt_index]; - - if (!reinterpret_cast(cursor.value)[virt_addr.pt_index].present) - return nullptr; - - return reinterpret_cast( - reinterpret_cast(cursor.value)[virt_addr.pt_index].pfn << 12); - } - - void* translate(void* virtual_address, u32 pml4_pfn, const ptable_entries entries) - { - virt_addr_t virt_addr{ virtual_address }; - const auto cursor = get_cursor_page(); - - set_cursor_page(pml4_pfn); - if (!reinterpret_cast(cursor)[virt_addr.pml4_index].present) - return nullptr; - - if (entries) entries->pml4e = reinterpret_cast(cursor)[virt_addr.pml4_index]; - set_cursor_page(reinterpret_cast(cursor)[virt_addr.pml4_index].pfn); - if (!reinterpret_cast(cursor)[virt_addr.pdpt_index].present) - return nullptr; - - if (entries) entries->pdpte = reinterpret_cast(cursor)[virt_addr.pdpt_index]; - set_cursor_page(reinterpret_cast(cursor)[virt_addr.pdpt_index].pfn); - if (!reinterpret_cast(cursor)[virt_addr.pd_index].present) - return nullptr; - - if (entries) entries->pde = reinterpret_cast(cursor)[virt_addr.pd_index]; - set_cursor_page(reinterpret_cast(cursor)[virt_addr.pd_index].pfn); - if (!reinterpret_cast(cursor)[virt_addr.pt_index].present) - return nullptr; - - if (entries) entries->pte = reinterpret_cast(cursor)[virt_addr.pt_index]; - return reinterpret_cast( - reinterpret_cast(cursor)[virt_addr.pt_index].pfn << 12); - } - - void set_cursor_page(u32 phys_pfn) - { - cpuid_eax_01 cpuid_value; - __cpuid((int*)&cpuid_value, 1); - pg_table::pt[cpuid_value - .cpuid_additional_information - .initial_apic_id].pfn = phys_pfn; - - // flush tlb for this page and then ensure the instruction stream - // is seralized as to not execute instructions out of order and access the page - // before the TLB is flushed... - __invlpg(get_cursor_page()); - _mm_lfence(); - } - - void* get_cursor_page() - { - cpuid_eax_01 cpuid_value; - __cpuid((int*)&cpuid_value, 1); - constexpr auto cursor_page = 0x00007F7FFFE00000; - - virt_addr_t virt_addr{ reinterpret_cast(cursor_page) }; - virt_addr.pt_index = cpuid_value - .cpuid_additional_information - .initial_apic_id; - - return virt_addr.value; - } - - bool init_pg_tables() - { - auto pdpt_phys = reinterpret_cast(translate(pdpt)); - auto pd_phys = reinterpret_cast(translate(pd)); - auto pt_phys = reinterpret_cast(translate(pt)); - - if (!pdpt_phys || !pd_phys || !pt_phys) - return false; - - hyperv_pml4[254].present = true; - hyperv_pml4[254].pfn = pdpt_phys >> 12; - hyperv_pml4[254].user_supervisor = false; - hyperv_pml4[254].rw = true; - - pdpt[511].present = true; - pdpt[511].pfn = pd_phys >> 12; - pdpt[511].user_supervisor = false; - pdpt[511].rw = true; - - pd[511].present = true; - pd[511].pfn = pt_phys >> 12; - pd[511].user_supervisor = false; - pd[511].rw = true; - - for (auto idx = 0u; idx < 512; ++idx) - { - pt[idx].present = true; - pt[idx].user_supervisor = false; - pt[idx].rw = true; - } - return true; - } -} \ No newline at end of file diff --git a/Voyager/PayLoad (AMD)/pg_table.h b/Voyager/PayLoad (AMD)/pg_table.h deleted file mode 100644 index 42bce15..0000000 --- a/Voyager/PayLoad (AMD)/pg_table.h +++ /dev/null @@ -1,167 +0,0 @@ -#pragma once -#include "types.h" -#include "ia32.hpp" - -#pragma section(".pdpt", read, write) -#pragma section(".pd", read, write) -#pragma section(".pt", read, write) - -namespace pg_table -{ - typedef union _virt_addr_t - { - void* value; - struct - { - u64 offset : 12; - u64 pt_index : 9; - u64 pd_index : 9; - u64 pdpt_index : 9; - u64 pml4_index : 9; - u64 reserved : 16; - }; - } virt_addr_t, * pvirt_addr_t; - - typedef union _pml4e - { - u64 value; - struct - { - u64 present : 1; // Must be 1, region invalid if 0. - u64 rw : 1; // If 0, writes not allowed. - u64 user_supervisor : 1; // If 0, user-mode accesses not allowed. - u64 PageWriteThrough : 1; // Determines the memory type used to access PDPT. - u64 page_cache : 1; // Determines the memory type used to access PDPT. - u64 accessed : 1; // If 0, this entry has not been used for translation. - u64 Ignored1 : 1; - u64 page_size : 1; // Must be 0 for PML4E. - u64 Ignored2 : 4; - u64 pfn : 36; // The page frame number of the PDPT of this PML4E. - u64 Reserved : 4; - u64 Ignored3 : 11; - u64 nx : 1; // If 1, instruction fetches not allowed. - }; - } pml4e, * ppml4e; - - typedef union _pdpte - { - u64 value; - struct - { - u64 present : 1; // Must be 1, region invalid if 0. - u64 rw : 1; // If 0, writes not allowed. - u64 user_supervisor : 1; // If 0, user-mode accesses not allowed. - u64 PageWriteThrough : 1; // Determines the memory type used to access PD. - u64 page_cache : 1; // Determines the memory type used to access PD. - u64 accessed : 1; // If 0, this entry has not been used for translation. - u64 Ignored1 : 1; - u64 page_size : 1; // If 1, this entry maps a 1GB page. - u64 Ignored2 : 4; - u64 pfn : 36; // The page frame number of the PD of this PDPTE. - u64 Reserved : 4; - u64 Ignored3 : 11; - u64 nx : 1; // If 1, instruction fetches not allowed. - }; - } pdpte, * ppdpte; - - typedef union _pde - { - u64 value; - struct - { - u64 present : 1; // Must be 1, region invalid if 0. - u64 rw : 1; // If 0, writes not allowed. - u64 user_supervisor : 1; // If 0, user-mode accesses not allowed. - u64 PageWriteThrough : 1; // Determines the memory type used to access PT. - u64 page_cache : 1; // Determines the memory type used to access PT. - u64 accessed : 1; // If 0, this entry has not been used for translation. - u64 Ignored1 : 1; - u64 page_size : 1; // If 1, this entry maps a 2MB page. - u64 Ignored2 : 4; - u64 pfn : 36; // The page frame number of the PT of this PDE. - u64 Reserved : 4; - u64 Ignored3 : 11; - u64 nx : 1; // If 1, instruction fetches not allowed. - }; - } pde, * ppde; - - typedef union _pte - { - u64 value; - struct - { - u64 present : 1; // Must be 1, region invalid if 0. - u64 rw : 1; // If 0, writes not allowed. - u64 user_supervisor : 1; // If 0, user-mode accesses not allowed. - u64 PageWriteThrough : 1; // Determines the memory type used to access the memory. - u64 page_cache : 1; // Determines the memory type used to access the memory. - u64 accessed : 1; // If 0, this entry has not been used for translation. - u64 Dirty : 1; // If 0, the memory backing this page has not been written to. - u64 PageAccessType : 1; // Determines the memory type used to access the memory. - u64 Global : 1; // If 1 and the PGE bit of CR4 is set, translations are global. - u64 Ignored2 : 3; - u64 pfn : 36; // The page frame number of the backing physical page. - u64 reserved : 4; - u64 Ignored3 : 7; - u64 ProtectionKey : 4; // If the PKE bit of CR4 is set, determines the protection key. - u64 nx : 1; // If 1, instruction fetches not allowed. - }; - } pte, * ppte; - - typedef struct _table_entries - { - pg_table::pml4e pml4e; - pg_table::pdpte pdpte; - pg_table::pde pde; - pg_table::pte pte; - } table_entries, *ptable_entries; - - /// - /// payload paging tables... - /// - __declspec(allocate(".pdpt")) inline pdpte pdpt[512]; - __declspec(allocate(".pd")) inline pde pd[512]; - __declspec(allocate(".pt")) inline pte pt[512]; - - /// - /// self referencing pml4e is at 255... - /// - inline const ppml4e hyperv_pml4{ reinterpret_cast(0x00007FBFDFEFF000) }; - - /// - /// only does address translation for hyper-v's context - /// - /// virtual address to be translated... - /// optional - /// returns a physical address... - void* translate(void* virt_addr, const ptable_entries entries = nullptr); - - /// - /// translates linear virtual addresses to linear physical addresses... - /// - /// virtual address to translate... - /// page map level four page frame number... - /// (optional) pointer to a table_entries structure... - /// linear physical address... - void* translate(void* virtual_address, u32 pml4_pfn, const ptable_entries entries = nullptr); - - /// - // changes the cursor address to the specified physical address... - // after doing so, the TLB entry for that address is going to be flushed... - // a memory fence is applied to prevent out of order execution... - /// - /// pfn of the physical page to change the cursor too... - void set_cursor_page(u32 phys_pfn); - - /// - /// get the cursor page... each core has its own cursor page... - /// - /// cursor page for the current core... - void* get_cursor_page(); - - /// - /// initalizes paging tables (connects pdpt->pd->pt) - /// - /// was the setup successful? - bool init_pg_tables(); -} \ No newline at end of file diff --git a/Voyager/PayLoad (AMD)/types.h b/Voyager/PayLoad (AMD)/types.h index 07d69b3..08d1002 100644 --- a/Voyager/PayLoad (AMD)/types.h +++ b/Voyager/PayLoad (AMD)/types.h @@ -5,10 +5,18 @@ #include #include +#include +#include +#include "ia32.hpp" + #define VMEXIT_KEY 0xDEADBEEFDEADBEEF -#define PORT_NUM 0x2F8 +#define PAGE_4KB 0x1000 +#define PAGE_2MB PAGE_4KB * 512 +#define PAGE_1GB PAGE_2MB * 512 + +#define PORT_NUM_3 0x3E8 #define DBG_PRINT(arg) \ - __outbytestring(PORT_NUM, (unsigned char*)arg, sizeof arg); + __outbytestring(PORT_NUM_3, (unsigned char*)arg, sizeof arg); #if WINVER == 2004 #define offset_vmcb_base 0x103B0 @@ -223,14 +231,13 @@ using u32 = unsigned int; using u64 = unsigned long long; using u128 = __m128; +using guest_virt_t = u64; +using guest_phys_t = u64; +using host_virt_t = u64; +using host_phys_t = u64; + namespace svm { - enum class vmexit_command_t - { - init_paging_tables = 0x111 - // add your commands here... - }; - typedef struct __declspec(align(16)) _guest_context { u8 gap0[8]; @@ -408,16 +415,86 @@ namespace svm u64 lastexcepto; // +0x290 } vmcb, *pvmcb; + // AMD does not have a vmread/vmwrite instruction... only a vmload + // and vmsave instruction... this means I had to hunt down the damn + // VMCB location... this is the pointer chain to the VMCB... + // + // TODO: could sig scan for this in Voyager... + __forceinline auto get_vmcb() -> pvmcb + { + return *reinterpret_cast( + *reinterpret_cast( + *reinterpret_cast( + __readgsqword(0) + offset_vmcb_base) + + offset_vmcb_link) + offset_vmcb); + } + + enum class vmexit_command_t + { + init_page_tables, + read_guest_phys, + write_guest_phys, + copy_guest_virt, + get_dirbase, + translate + }; + + enum class vmxroot_error_t + { + error_success, + pml4e_not_present, + pdpte_not_present, + pde_not_present, + pte_not_present, + vmxroot_translate_failure, + invalid_self_ref_pml4e, + invalid_mapping_pml4e, + invalid_host_virtual, + invalid_guest_physical, + invalid_guest_virtual, + page_table_init_failed + }; + + typedef union _command_t + { + struct _copy_phys + { + host_phys_t phys_addr; + guest_virt_t buffer; + u64 size; + } copy_phys; + + struct _copy_virt + { + guest_phys_t dirbase_src; + guest_virt_t virt_src; + guest_phys_t dirbase_dest; + guest_virt_t virt_dest; + u64 size; + } copy_virt; + + struct _translate_virt + { + guest_virt_t virt_src; + guest_phys_t phys_addr; + } translate_virt; + + guest_phys_t dirbase; + + } command_t, * pcommand_t; + using vcpu_run_t = pgs_base_struct (__fastcall*)(void*, guest_context*); + #pragma pack(push, 1) typedef struct _voyager_t { - u64 vcpu_run_rva; // RVA from vcpu_run entry ---> back to original vcpu_run... + u64 vcpu_run_rva; u64 hyperv_module_base; u64 hyperv_module_size; u64 record_base; u64 record_size; } voyager_t, * pvoyager_t; #pragma pack(pop) + __declspec(dllexport) inline voyager_t voyager_context; } \ No newline at end of file diff --git a/Voyager/PayLoad (AMD)/vmexit.cpp b/Voyager/PayLoad (AMD)/vmexit.cpp new file mode 100644 index 0000000..c61846b --- /dev/null +++ b/Voyager/PayLoad (AMD)/vmexit.cpp @@ -0,0 +1,27 @@ +#include "vmexit.h" +#include "debug.h" + +namespace vmexit +{ + auto get_command(guest_virt_t command_ptr) -> svm::command_t + { + const auto vmcb = svm::get_vmcb(); + const auto guest_dirbase = cr3{ vmcb->cr3 }.pml4_pfn << 12; + + const auto command_page = + mm::map_guest_virt(guest_dirbase, command_ptr); + + return *reinterpret_cast(command_page); + } + + auto set_command(guest_virt_t command_ptr, svm::command_t& command_data) -> void + { + const auto vmcb = svm::get_vmcb(); + const auto guest_dirbase = cr3{ vmcb->cr3 }.pml4_pfn << 12; + + const auto command_page = + mm::map_guest_virt(guest_dirbase, command_ptr); + + *reinterpret_cast(command_page) = command_data; + } +} \ No newline at end of file diff --git a/Voyager/PayLoad (AMD)/vmexit.h b/Voyager/PayLoad (AMD)/vmexit.h new file mode 100644 index 0000000..de0dcca --- /dev/null +++ b/Voyager/PayLoad (AMD)/vmexit.h @@ -0,0 +1,8 @@ +#pragma once +#include "mm.h" + +namespace vmexit +{ + auto get_command(guest_virt_t command_ptr) -> svm::command_t; + auto set_command(guest_virt_t command_ptr, svm::command_t& command_data) -> void; +} \ No newline at end of file diff --git a/Voyager/PayLoad (AMD)/vmexit_handler.cpp b/Voyager/PayLoad (AMD)/vmexit_handler.cpp index 8fde2f9..0403e65 100644 --- a/Voyager/PayLoad (AMD)/vmexit_handler.cpp +++ b/Voyager/PayLoad (AMD)/vmexit_handler.cpp @@ -1,31 +1,106 @@ #include "types.h" -#include "pg_table.h" +#include "mm.h" +#include "vmexit.h" +#include "debug.h" -svm::pgs_base_struct vmexit_handler(void* unknown, svm::pguest_context context) +auto vmexit_handler(void* unknown, svm::pguest_context context) -> svm::pgs_base_struct { - // AMD does not have a vmread/vmwrite instruction... only a vmload - // and vmsave instruction... this means I had to hunt down the damn - // VMCB location... this is the pointer chain to the VMCB... - // - // TODO: could sig scan for this in Voyager... - const auto vmcb = *reinterpret_cast( - *reinterpret_cast( - *reinterpret_cast( - __readgsqword(0) + offset_vmcb_base) - + offset_vmcb_link) + offset_vmcb); - + const auto vmcb = svm::get_vmcb(); if (vmcb->exitcode == VMEXIT_CPUID && context->rcx == VMEXIT_KEY) { switch ((svm::vmexit_command_t)context->rdx) { - case svm::vmexit_command_t::init_paging_tables: - vmcb->rax = pg_table::init_pg_tables(); + case svm::vmexit_command_t::init_page_tables: + { + vmcb->rax = (u64) mm::init(); + break; + } + case svm::vmexit_command_t::get_dirbase: + { + auto command_data = + vmexit::get_command(context->r8); + + command_data.dirbase = + cr3{ vmcb->cr3 }.pml4_pfn << 12; + + vmcb->rax = (u64)svm::vmxroot_error_t::error_success; + + vmexit::set_command( + context->r8, command_data); + break; + } + case svm::vmexit_command_t::read_guest_phys: + { + auto command_data = + vmexit::get_command(context->r8); + + const auto guest_dirbase = + cr3{ vmcb->cr3 }.pml4_pfn << 12; + + vmcb->rax = (u64)mm::read_guest_phys( + guest_dirbase, + command_data.copy_phys.phys_addr, + command_data.copy_phys.buffer, + command_data.copy_phys.size); + + vmexit::set_command( + context->r8, command_data); + break; + } + case svm::vmexit_command_t::write_guest_phys: + { + auto command_data = + vmexit::get_command(context->r8); + + const auto guest_dirbase = + cr3{ vmcb->cr3 }.pml4_pfn << 12; + + vmcb->rax = (u64) mm::write_guest_phys( + guest_dirbase, + command_data.copy_phys.phys_addr, + command_data.copy_phys.buffer, + command_data.copy_phys.size); + + vmexit::set_command( + context->r8, command_data); + break; + } + case svm::vmexit_command_t::copy_guest_virt: + { + auto command_data = + vmexit::get_command(context->r8); + + auto virt_data = command_data.copy_virt; + vmcb->rax = (u64) mm::copy_guest_virt( + virt_data.dirbase_src, + virt_data.virt_src, + virt_data.dirbase_dest, + virt_data.virt_dest, + virt_data.size); + break; + } + case svm::vmexit_command_t::translate: + { + auto command_data = + vmexit::get_command(context->r8); + + const auto guest_dirbase = + cr3{ vmcb->cr3 }.pml4_pfn << 12; + + command_data.translate_virt.phys_addr = + mm::translate_guest_virtual(guest_dirbase, + command_data.translate_virt.virt_src); + + vmcb->rax = (u64)svm::vmxroot_error_t::error_success; + + vmexit::set_command( + context->r8, command_data); break; + } default: break; } - // advance RIP and return back to VMLOAD/VMRUN... vmcb->rip = vmcb->nrip; return reinterpret_cast(__readgsqword(0)); } diff --git a/Voyager/PayLoad (Intel)/PayLoad (Intel).vcxproj b/Voyager/PayLoad (Intel)/PayLoad (Intel).vcxproj index 802739e..cd82d24 100644 --- a/Voyager/PayLoad (Intel)/PayLoad (Intel).vcxproj +++ b/Voyager/PayLoad (Intel)/PayLoad (Intel).vcxproj @@ -57,7 +57,7 @@ Windows10 false - WindowsKernelModeDriver10.0 + v142 DynamicLibrary KMDF Universal @@ -66,7 +66,7 @@ Windows10 false - WindowsKernelModeDriver10.0 + v142 DynamicLibrary KMDF Universal @@ -75,7 +75,7 @@ Windows10 false - WindowsKernelModeDriver10.0 + v142 DynamicLibrary KMDF Universal @@ -84,7 +84,7 @@ Windows10 false - WindowsKernelModeDriver10.0 + v142 DynamicLibrary KMDF Universal @@ -93,7 +93,7 @@ Windows10 false - WindowsKernelModeDriver10.0 + v142 DynamicLibrary KMDF Universal @@ -102,7 +102,7 @@ Windows10 false - WindowsKernelModeDriver10.0 + v142 DynamicLibrary KMDF Universal @@ -120,7 +120,7 @@ Windows10 false - WindowsKernelModeDriver10.0 + v142 DynamicLibrary KMDF Universal @@ -129,7 +129,7 @@ Windows10 false - WindowsKernelModeDriver10.0 + v142 DynamicLibrary KMDF Universal @@ -174,7 +174,7 @@ Windows10 false - WindowsKernelModeDriver10.0 + v142 DynamicLibrary KMDF Universal @@ -183,7 +183,7 @@ Windows10 false - WindowsKernelModeDriver10.0 + v142 DynamicLibrary KMDF Universal @@ -332,6 +332,7 @@ false true false + WINVER=1809;%(PreprocessorDefinitions) true @@ -652,7 +653,7 @@ false true false - %(PreprocessorDefinitions);WINVER=2004; + %(PreprocessorDefinitions);WINVER=1511 true @@ -662,13 +663,17 @@ - + + + + - + + diff --git a/Voyager/PayLoad (Intel)/PayLoad (Intel).vcxproj.filters b/Voyager/PayLoad (Intel)/PayLoad (Intel).vcxproj.filters index 43101bd..30ce426 100644 --- a/Voyager/PayLoad (Intel)/PayLoad (Intel).vcxproj.filters +++ b/Voyager/PayLoad (Intel)/PayLoad (Intel).vcxproj.filters @@ -14,7 +14,13 @@ Source Files - + + Source Files + + + Source Files + + Source Files @@ -25,7 +31,13 @@ Header Files - + + Header Files + + + Header Files + + Header Files diff --git a/Voyager/PayLoad (Intel)/debug.cpp b/Voyager/PayLoad (Intel)/debug.cpp new file mode 100644 index 0000000..013c4ec --- /dev/null +++ b/Voyager/PayLoad (Intel)/debug.cpp @@ -0,0 +1,69 @@ +#include "debug.h" + +auto dbg::debug_print_decimal(long long number) -> void +{ + if (number < 0) + { + __outbyte(PORT_NUM, '-'); + number = -number; + } + + for (auto d = 1000000000000000000; d != 0; d /= 10) + if ((number / d) != 0) + __outbyte(PORT_NUM, alphabet[(number / d) % 10]); +} + +auto dbg::debug_print_hex(u64 number, const bool show_zeros) -> void +{ + for (auto d = 0x1000000000000000; d != 0; d /= 0x10) + if (show_zeros || (number / d) != 0) + __outbyte(PORT_NUM, alphabet[(number / d) % 0x10]); +} + +auto dbg::print(const char* format, ...) -> void +{ + va_list args; + va_start(args, format); + + while (format[0]) + { + if (format[0] == '%') + { + switch (format[1]) + { + case 'd': + debug_print_decimal(va_arg(args, int)); + format += 2; + continue; + case 'x': + debug_print_hex(va_arg(args, u32), false); + format += 2; + continue; + case 'l': + if (format[2] == 'l') + { + switch (format[3]) + { + case 'd': + debug_print_decimal(va_arg(args, u64)); + format += 4; + continue; + case 'x': + debug_print_hex(va_arg(args, u64), false); + format += 4; + continue; + } + } + break; + case 'p': + debug_print_hex(va_arg(args, u64), true); + format += 2; + continue; + } + } + + __outbyte(PORT_NUM, format[0]); + ++format; + } + va_end(args); +} \ No newline at end of file diff --git a/Voyager/PayLoad (Intel)/debug.h b/Voyager/PayLoad (Intel)/debug.h new file mode 100644 index 0000000..fda84d7 --- /dev/null +++ b/Voyager/PayLoad (Intel)/debug.h @@ -0,0 +1,13 @@ +#pragma once +#include +#include +#include "types.h" + +#define PORT_NUM 0x2F8 +namespace dbg +{ + constexpr char alphabet[] = "0123456789ABCDEF"; + auto debug_print_decimal(long long number) -> void; + auto debug_print_hex(u64 number, const bool show_zeros) -> void; + auto print(const char* format, ...) -> void; +} \ No newline at end of file diff --git a/Voyager/PayLoad (Intel)/ia32.hpp b/Voyager/PayLoad (Intel)/ia32.hpp index dc0400c..256a0c3 100644 --- a/Voyager/PayLoad (Intel)/ia32.hpp +++ b/Voyager/PayLoad (Intel)/ia32.hpp @@ -14132,7 +14132,7 @@ typedef union }; UINT64_t flags; -} pml4e_64; +} pml4e; /** * @brief Format of a 4-Level Page-Directory-Pointer-Table Entry (PDPTE) that Maps a 1-GByte Page @@ -14431,7 +14431,7 @@ typedef union }; UINT64_t flags; -} pdpte_64; +} pdpte; /** * @brief Format of a 4-Level Page-Directory Entry that Maps a 2-MByte Page @@ -14730,7 +14730,7 @@ typedef union }; UINT64_t flags; -} pde_64; +} pde; /** * @brief Format of a 4-Level Page-Table Entry that Maps a 4-KByte Page @@ -14891,7 +14891,7 @@ typedef union }; UINT64_t flags; -} pte_64; +} pte; /** * @brief Format of a common Page-Table Entry @@ -18281,7 +18281,7 @@ typedef union }; UINT64_t flags; -} ept_pml4; +} ept_pml4e; /** * @brief Format of an EPT Page-Directory-Pointer-Table Entry (PDPTE) that Maps a 1-GByte Page @@ -18412,7 +18412,7 @@ typedef union }; UINT64_t flags; -} epdpte_1gb; +} ept_pdpte_1gb; /** * @brief Format of an EPT Page-Directory-Pointer-Table Entry (PDPTE) that References an EPT Page Directory @@ -18489,7 +18489,7 @@ typedef union }; UINT64_t flags; -} epdpte; +} ept_pdpte; /** * @brief Format of an EPT Page-Directory Entry (PDE) that Maps a 2-MByte Page @@ -18697,7 +18697,7 @@ typedef union }; UINT64_t flags; -} epde; +} ept_pde; /** * @brief Format of an EPT Page-Table Entry that Maps a 4-KByte Page @@ -18820,7 +18820,7 @@ typedef union }; UINT64_t flags; -} epte; +} ept_pte; /** * @brief Format of a common EPT Entry diff --git a/Voyager/PayLoad (Intel)/mm.cpp b/Voyager/PayLoad (Intel)/mm.cpp new file mode 100644 index 0000000..fd0e729 --- /dev/null +++ b/Voyager/PayLoad (Intel)/mm.cpp @@ -0,0 +1,360 @@ +#include "mm.h" + +auto mm::map_guest_phys(guest_phys_t phys_addr, map_type_t map_type) -> u64 +{ + const auto host_phys = + translate_guest_physical( + phys_addr, map_type); + + if (!host_phys) + return {}; + + return map_page(host_phys, map_type); +} + +auto mm::map_guest_virt(guest_phys_t dirbase, guest_virt_t virt_addr, map_type_t map_type) -> u64 +{ + const auto guest_phys = + translate_guest_virtual( + dirbase, virt_addr, map_type); + + if (!guest_phys) + return {}; + + return map_guest_phys(guest_phys, map_type); +} + +auto mm::map_page(host_phys_t phys_addr, map_type_t map_type) -> u64 +{ + cpuid_eax_01 cpuid_value; + __cpuid((int*)&cpuid_value, 1); + + mm::pt[(cpuid_value + .cpuid_additional_information + .initial_apic_id * 2) + + (unsigned)map_type].pfn = phys_addr >> 12; + + __invlpg(reinterpret_cast( + get_map_virt(virt_addr_t{ phys_addr }.offset_4kb, map_type))); + + return get_map_virt(virt_addr_t{ phys_addr }.offset_4kb, map_type); +} + +auto mm::get_map_virt(u16 offset, map_type_t map_type) -> u64 +{ + cpuid_eax_01 cpuid_value; + __cpuid((int*)&cpuid_value, 1); + virt_addr_t virt_addr{ MAPPING_ADDRESS_BASE }; + + virt_addr.pt_index = (cpuid_value + .cpuid_additional_information + .initial_apic_id * 2) + + (unsigned)map_type; + + return virt_addr.value + offset; +} + +auto mm::translate(host_virt_t host_virt) -> u64 +{ + virt_addr_t virt_addr{ host_virt }; + virt_addr_t cursor{ (u64)hyperv_pml4 }; + + if (!reinterpret_cast(cursor.value)[virt_addr.pml4_index].present) + return {}; + + cursor.pt_index = virt_addr.pml4_index; + if (!reinterpret_cast(cursor.value)[virt_addr.pdpt_index].present) + return {}; + + // handle 1gb large page... + if (reinterpret_cast(cursor.value)[virt_addr.pdpt_index].large_page) + return (reinterpret_cast(cursor.value) + [virt_addr.pdpt_index].pfn << 12) + virt_addr.offset_1gb; + + cursor.pd_index = virt_addr.pml4_index; + cursor.pt_index = virt_addr.pdpt_index; + if (!reinterpret_cast(cursor.value)[virt_addr.pd_index].present) + return {}; + + // handle 2mb large page... + if (reinterpret_cast(cursor.value)[virt_addr.pd_index].large_page) + return (reinterpret_cast(cursor.value) + [virt_addr.pd_index].pfn << 12) + virt_addr.offset_2mb; + + cursor.pdpt_index = virt_addr.pml4_index; + cursor.pd_index = virt_addr.pdpt_index; + cursor.pt_index = virt_addr.pd_index; + if (!reinterpret_cast(cursor.value)[virt_addr.pt_index].present) + return {}; + + return (reinterpret_cast(cursor.value) + [virt_addr.pt_index].pfn << 12) + virt_addr.offset_4kb; +} + +auto mm::translate_guest_virtual(guest_phys_t dirbase, guest_virt_t guest_virt, map_type_t map_type) -> u64 +{ + virt_addr_t virt_addr{ guest_virt }; + const auto pml4 = + reinterpret_cast(map_guest_phys(dirbase, map_type)); + + if (!pml4[virt_addr.pml4_index].present) + return {}; + + const auto pdpt = + reinterpret_cast(map_guest_phys( + pml4[virt_addr.pml4_index].pfn << 12, map_type)); + + if (!pdpt[virt_addr.pdpt_index].present) + return {}; + + // handle 1gb pages... + if (pdpt[virt_addr.pdpt_index].large_page) + return (pdpt[virt_addr.pdpt_index].pfn << 12) + virt_addr.offset_1gb; + + const auto pd = + reinterpret_cast(map_guest_phys( + pdpt[virt_addr.pdpt_index].pfn << 12, map_type)); + + if (!pd[virt_addr.pd_index].present) + return {}; + + // handle 2mb pages... + if (pd[virt_addr.pd_index].large_page) + return (pd[virt_addr.pd_index].pfn << 12) + virt_addr.offset_2mb; + + const auto pt = + reinterpret_cast(map_guest_phys( + pd[virt_addr.pd_index].pfn << 12, map_type)); + + if (!pt[virt_addr.pt_index].present) + return {}; + + return (pt[virt_addr.pt_index].pfn << 12) + virt_addr.offset_4kb; +} + +auto mm::translate_guest_physical(guest_phys_t phys_addr, map_type_t map_type) -> u64 +{ + ept_pointer eptp; + phys_addr_t guest_phys{ phys_addr }; + __vmx_vmread(VMCS_CTRL_EPT_POINTER, (size_t*)&eptp); + + const auto epml4 = reinterpret_cast( + map_page(eptp.page_frame_number << 12, map_type)); + + const auto epdpt_large = + reinterpret_cast(map_page( + epml4[guest_phys.pml4_index].page_frame_number << 12, map_type)); + + // handle 1gb page... + if (epdpt_large[guest_phys.pdpt_index].large_page) + return (epdpt_large[guest_phys.pdpt_index].page_frame_number + * 0x1000 * 0x200 * 0x200) + EPT_LARGE_PDPTE_OFFSET(phys_addr); + + const auto epdpt = + reinterpret_cast(epdpt_large); + + const auto epd_large = + reinterpret_cast(map_page( + epdpt[guest_phys.pdpt_index].page_frame_number << 12, map_type)); + + // handle 2mb page... + if (epd_large[guest_phys.pd_index].large_page) + return (epd_large[guest_phys.pd_index].page_frame_number + * 0x1000 * 0x200) + EPT_LARGE_PDE_OFFSET(phys_addr); + + const auto epd = + reinterpret_cast(epd_large); + + const auto ept = + reinterpret_cast(map_page( + epd[guest_phys.pd_index].page_frame_number << 12, map_type)); + + auto result = ept[guest_phys.pt_index].page_frame_number << 12; + return result; +} + +auto mm::init() -> vmxroot_error_t +{ + const auto pdpt_phys = + translate(reinterpret_cast(pdpt)); + + const auto pd_phys = + translate(reinterpret_cast(pd)); + + const auto pt_phys = + translate(reinterpret_cast(pt)); + + if (!pdpt_phys || !pd_phys || !pt_phys) + return vmxroot_error_t::invalid_host_virtual; + + // setup mapping page table entries... + { + hyperv_pml4[MAPPING_PML4_IDX].present = true; + hyperv_pml4[MAPPING_PML4_IDX].pfn = pdpt_phys >> 12; + hyperv_pml4[MAPPING_PML4_IDX].user_supervisor = false; + hyperv_pml4[MAPPING_PML4_IDX].writeable = true; + + pdpt[511].present = true; + pdpt[511].pfn = pd_phys >> 12; + pdpt[511].user_supervisor = false; + pdpt[511].rw = true; + + pd[511].present = true; + pd[511].pfn = pt_phys >> 12; + pd[511].user_supervisor = false; + pd[511].rw = true; + } + + // each core will have its own page it can use to map + // physical memory into virtual memory :^) + for (auto idx = 0u; idx < 512; ++idx) + { + pt[idx].present = true; + pt[idx].user_supervisor = false; + pt[idx].rw = true; + } + + const auto mapped_pml4 = + reinterpret_cast( + mm::map_page(__readcr3())); + + // check to make sure translate works... + if (translate((u64)mapped_pml4) != __readcr3()) + return vmxroot_error_t::vmxroot_translate_failure; + + // check to make sure the self ref pml4e is valid... + if (mapped_pml4[SELF_REF_PML4_IDX].pfn != __readcr3() >> 12) + return vmxroot_error_t::invalid_self_ref_pml4e; + + // check to make sure the mapping pml4e is valid... + if (mapped_pml4[MAPPING_PML4_IDX].pfn != pdpt_phys >> 12) + return vmxroot_error_t::invalid_mapping_pml4e; + + return vmxroot_error_t::error_success; +} + +auto mm::read_guest_phys(guest_phys_t dirbase, guest_phys_t guest_phys, + guest_virt_t guest_virt, u64 size) -> vmxroot_error_t +{ + // handle reading over page boundaries of both src and dest... + while (size) + { + auto dest_current_size = PAGE_4KB - + virt_addr_t{ guest_virt }.offset_4kb; + + if (size < dest_current_size) + dest_current_size = size; + + auto src_current_size = PAGE_4KB - + phys_addr_t{ guest_phys }.offset_4kb; + + if (size < src_current_size) + src_current_size = size; + + auto current_size = + min(dest_current_size, src_current_size); + + const auto mapped_dest = + reinterpret_cast( + map_guest_virt(dirbase, guest_virt, map_type_t::map_dest)); + + if (!mapped_dest) + return vmxroot_error_t::invalid_guest_virtual; + + const auto mapped_src = + reinterpret_cast( + map_guest_phys(guest_phys, map_type_t::map_src)); + + if (!mapped_src) + return vmxroot_error_t::invalid_guest_physical; + + memcpy(mapped_dest, mapped_src, current_size); + guest_phys += current_size; + guest_virt += current_size; + size -= current_size; + } + + return vmxroot_error_t::error_success; +} + +auto mm::write_guest_phys(guest_phys_t dirbase, + guest_phys_t guest_phys, guest_virt_t guest_virt, u64 size) -> vmxroot_error_t +{ + // handle reading over page boundaries of both src and dest... + while (size) + { + auto dest_current_size = PAGE_4KB - + virt_addr_t{ guest_virt }.offset_4kb; + + if (size < dest_current_size) + dest_current_size = size; + + auto src_current_size = PAGE_4KB - + phys_addr_t{ guest_phys }.offset_4kb; + + if (size < src_current_size) + src_current_size = size; + + auto current_size = + min(dest_current_size, src_current_size); + + const auto mapped_src = + reinterpret_cast( + map_guest_virt(dirbase, guest_virt, map_type_t::map_src)); + + if (!mapped_src) + return vmxroot_error_t::invalid_guest_virtual; + + const auto mapped_dest = + reinterpret_cast( + map_guest_phys(guest_phys, map_type_t::map_dest)); + + if (!mapped_src) + return vmxroot_error_t::invalid_guest_physical; + + memcpy(mapped_dest, mapped_src, current_size); + guest_phys += current_size; + guest_virt += current_size; + size -= current_size; + } + + return vmxroot_error_t::error_success; +} + +auto mm::copy_guest_virt(guest_phys_t dirbase_src, guest_virt_t virt_src, + guest_virt_t dirbase_dest, guest_virt_t virt_dest, u64 size) -> vmxroot_error_t +{ + while (size) + { + auto dest_size = PAGE_4KB - virt_addr_t{ virt_dest }.offset_4kb; + if (size < dest_size) + dest_size = size; + + auto src_size = PAGE_4KB - virt_addr_t{ virt_src }.offset_4kb; + if (size < src_size) + src_size = size; + + const auto mapped_src = + reinterpret_cast( + map_guest_virt(dirbase_src, virt_src, map_type_t::map_src)); + + if (!mapped_src) + return vmxroot_error_t::invalid_guest_virtual; + + const auto mapped_dest = + reinterpret_cast( + map_guest_virt(dirbase_dest, virt_dest, map_type_t::map_dest)); + + if (!mapped_dest) + return vmxroot_error_t::invalid_guest_virtual; + + auto current_size = min(dest_size, src_size); + memcpy(mapped_dest, mapped_src, current_size); + + virt_src += current_size; + virt_dest += current_size; + size -= current_size; + } + + return vmxroot_error_t::error_success; +} \ No newline at end of file diff --git a/Voyager/PayLoad (Intel)/mm.h b/Voyager/PayLoad (Intel)/mm.h new file mode 100644 index 0000000..099850c --- /dev/null +++ b/Voyager/PayLoad (Intel)/mm.h @@ -0,0 +1,165 @@ +#pragma once +#include "types.h" +#include "debug.h" + +#define SELF_REF_PML4_IDX 510 +#define MAPPING_PML4_IDX 100 + +#define MAPPING_ADDRESS_BASE 0x0000327FFFE00000 +#define SELF_REF_PML4 0xFFFFFF7FBFDFE000 + +#define EPT_LARGE_PDPTE_OFFSET(_) (((u64)(_)) & ((0x1000 * 0x200 * 0x200) - 1)) +#define EPT_LARGE_PDE_OFFSET(_) (((u64)(_)) & ((0x1000 * 0x200) - 1)) + +#pragma section(".pdpt", read, write) +#pragma section(".pd", read, write) +#pragma section(".pt", read, write) + +namespace mm +{ + enum class map_type_t + { + map_src, + map_dest + }; + + typedef union _virt_addr_t + { + u64 value; + struct + { + u64 offset_4kb : 12; + u64 pt_index : 9; + u64 pd_index : 9; + u64 pdpt_index : 9; + u64 pml4_index : 9; + u64 reserved : 16; + }; + + struct + { + u64 offset_2mb : 21; + u64 pd_index : 9; + u64 pdpt_index : 9; + u64 pml4_index : 9; + u64 reserved : 16; + }; + + struct + { + u64 offset_1gb : 30; + u64 pdpt_index : 9; + u64 pml4_index : 9; + u64 reserved : 16; + }; + + } virt_addr_t, * pvirt_addr_t; + using phys_addr_t = virt_addr_t; + + typedef union _pml4e + { + u64 value; + struct + { + u64 present : 1; + u64 writeable : 1; + u64 user_supervisor : 1; + u64 page_write_through : 1; + u64 page_cache : 1; + u64 accessed : 1; + u64 ignore_1 : 1; + u64 page_size : 1; + u64 ignore_2 : 4; + u64 pfn : 36; + u64 reserved : 4; + u64 ignore_3 : 11; + u64 nx : 1; + }; + } pml4e, * ppml4e; + + typedef union _pdpte + { + u64 value; + struct + { + u64 present : 1; + u64 rw : 1; + u64 user_supervisor : 1; + u64 page_write_through : 1; + u64 page_cache : 1; + u64 accessed : 1; + u64 ignore_1 : 1; + u64 large_page : 1; + u64 ignore_2 : 4; + u64 pfn : 36; + u64 reserved : 4; + u64 ignore_3 : 11; + u64 nx : 1; + }; + } pdpte, * ppdpte; + + typedef union _pde + { + u64 value; + struct + { + u64 present : 1; + u64 rw : 1; + u64 user_supervisor : 1; + u64 page_write_through : 1; + u64 page_cache : 1; + u64 accessed : 1; + u64 ignore_1 : 1; + u64 large_page : 1; + u64 ignore_2 : 4; + u64 pfn : 36; + u64 reserved : 4; + u64 ignore_3 : 11; + u64 nx : 1; + }; + } pde, * ppde; + + typedef union _pte + { + u64 value; + struct + { + u64 present : 1; + u64 rw : 1; + u64 user_supervisor : 1; + u64 page_write_through : 1; + u64 page_cache : 1; + u64 accessed : 1; + u64 dirty : 1; + u64 access_type : 1; + u64 global : 1; + u64 ignore_2 : 3; + u64 pfn : 36; + u64 reserved : 4; + u64 ignore_3 : 7; + u64 pk : 4; + u64 nx : 1; + }; + } pte, * ppte; + + __declspec(allocate(".pdpt")) inline pdpte pdpt[512]; + __declspec(allocate(".pd")) inline pde pd[512]; + __declspec(allocate(".pt")) inline pte pt[512]; + + inline const ppml4e hyperv_pml4{ reinterpret_cast(SELF_REF_PML4) }; + + auto init() -> vmxroot_error_t; + auto map_guest_phys(guest_phys_t phys_addr, map_type_t map_type = map_type_t::map_src) -> u64; + auto map_guest_virt(guest_phys_t dirbase, guest_virt_t virt_addr, map_type_t map_type = map_type_t::map_src) -> u64; + + auto map_page(host_phys_t phys_addr, map_type_t map_type = map_type_t::map_src) -> u64; + auto get_map_virt(u16 offset = 0u, map_type_t map_type = map_type_t::map_src) -> u64; + + auto translate(host_virt_t host_virt) -> u64; + auto translate_guest_physical(guest_phys_t guest_phys, map_type_t map_type = map_type_t::map_src) -> u64; + auto translate_guest_virtual(guest_phys_t dirbase, guest_virt_t guest_virt, map_type_t map_type = map_type_t::map_src) -> u64; + + auto read_guest_phys(guest_phys_t dirbase, guest_phys_t guest_phys, guest_virt_t guest_virt, u64 size) -> vmxroot_error_t; + auto write_guest_phys(guest_phys_t dirbase, guest_phys_t guest_phys, guest_virt_t guest_virt, u64 size) -> vmxroot_error_t; + auto copy_guest_virt(guest_phys_t dirbase_src, guest_virt_t virt_src, guest_virt_t dirbase_dest, guest_virt_t virt_dest, u64 size) -> vmxroot_error_t; +} \ No newline at end of file diff --git a/Voyager/PayLoad (Intel)/pg_table.cpp b/Voyager/PayLoad (Intel)/pg_table.cpp deleted file mode 100644 index e523f21..0000000 --- a/Voyager/PayLoad (Intel)/pg_table.cpp +++ /dev/null @@ -1,138 +0,0 @@ -#include "pg_table.h" - -namespace pg_table -{ - void* translate(void* virtual_address, const ptable_entries entries) - { - virt_addr_t virt_addr{ virtual_address }; - virt_addr_t cursor{ hyperv_pml4 }; - - if (entries) entries->pml4e = reinterpret_cast(cursor.value)[virt_addr.pml4_index]; - if (!reinterpret_cast(cursor.value)[virt_addr.pml4_index].present) - return nullptr; - - // set the cursor to self reference so that when we read - // the addresses pointed to by cursor its going to be a pdpt... - cursor.pdpt_index = virt_addr_t{ hyperv_pml4 }.pml4_index; - cursor.pd_index = virt_addr_t{ hyperv_pml4 }.pml4_index; - cursor.pt_index = virt_addr.pml4_index; - if (entries) entries->pdpte = reinterpret_cast(cursor.value)[virt_addr.pdpt_index]; - - if (!reinterpret_cast(cursor.value)[virt_addr.pdpt_index].present) - return nullptr; - - // set the cursor to self reference so that when we read - // the addresses pointed to by cursor its going to be a pd... - cursor.pdpt_index = virt_addr_t{ hyperv_pml4 }.pml4_index; - cursor.pd_index = virt_addr.pml4_index; - cursor.pt_index = virt_addr.pdpt_index; - if (entries) entries->pde = reinterpret_cast(cursor.value)[virt_addr.pd_index]; - - if (!reinterpret_cast(cursor.value)[virt_addr.pd_index].present) - return nullptr; - - // set the cursor to self reference so that when we read - // the addresses pointed to by cursor its going to be a pt... - cursor.pdpt_index = virt_addr.pml4_index; - cursor.pd_index = virt_addr.pdpt_index; - cursor.pt_index = virt_addr.pd_index; - if (entries) entries->pte = reinterpret_cast(cursor.value)[virt_addr.pt_index]; - - if (!reinterpret_cast(cursor.value)[virt_addr.pt_index].present) - return nullptr; - - return reinterpret_cast( - reinterpret_cast(cursor.value)[virt_addr.pt_index].pfn << 12); - } - - void* translate(void* virtual_address, u32 pml4_pfn, const ptable_entries entries) - { - virt_addr_t virt_addr{ virtual_address }; - const auto cursor = get_cursor_page(); - - set_cursor_page(pml4_pfn); - if (!reinterpret_cast(cursor)[virt_addr.pml4_index].present) - return nullptr; - - if (entries) entries->pml4e = reinterpret_cast(cursor)[virt_addr.pml4_index]; - set_cursor_page(reinterpret_cast(cursor)[virt_addr.pml4_index].pfn); - if (!reinterpret_cast(cursor)[virt_addr.pdpt_index].present) - return nullptr; - - if (entries) entries->pdpte = reinterpret_cast(cursor)[virt_addr.pdpt_index]; - set_cursor_page(reinterpret_cast(cursor)[virt_addr.pdpt_index].pfn); - if (!reinterpret_cast(cursor)[virt_addr.pd_index].present) - return nullptr; - - if (entries) entries->pde = reinterpret_cast(cursor)[virt_addr.pd_index]; - set_cursor_page(reinterpret_cast(cursor)[virt_addr.pd_index].pfn); - if (!reinterpret_cast(cursor)[virt_addr.pt_index].present) - return nullptr; - - if (entries) entries->pte = reinterpret_cast(cursor)[virt_addr.pt_index]; - return reinterpret_cast( - reinterpret_cast(cursor)[virt_addr.pt_index].pfn << 12); - } - - void set_cursor_page(u32 phys_pfn) - { - cpuid_eax_01 cpuid_value; - __cpuid((int*)&cpuid_value, 1); - pg_table::pt[cpuid_value - .cpuid_additional_information - .initial_apic_id].pfn = phys_pfn; - - // flush tlb for this page and then ensure the instruction stream - // is seralized as to not execute instructions out of order and access the page - // before the TLB is flushed... - __invlpg(get_cursor_page()); - _mm_lfence(); - } - - void* get_cursor_page() - { - cpuid_eax_01 cpuid_value; - __cpuid((int*)&cpuid_value, 1); - constexpr auto cursor_page = 0x00007F7FFFE00000; - - virt_addr_t virt_addr{ reinterpret_cast(cursor_page) }; - virt_addr.pt_index = cpuid_value - .cpuid_additional_information - .initial_apic_id; - - return virt_addr.value; - } - - bool init_pg_tables() - { - auto pdpt_phys = reinterpret_cast(translate(pdpt)); - auto pd_phys = reinterpret_cast(translate(pd)); - auto pt_phys = reinterpret_cast(translate(pt)); - - if (!pdpt_phys || !pd_phys || !pt_phys) - return false; - - hyperv_pml4[254].present = true; - hyperv_pml4[254].pfn = pdpt_phys >> 12; - hyperv_pml4[254].user_supervisor = false; - hyperv_pml4[254].rw = true; - - pdpt[511].present = true; - pdpt[511].pfn = pd_phys >> 12; - pdpt[511].user_supervisor = false; - pdpt[511].rw = true; - - pd[511].present = true; - pd[511].pfn = pt_phys >> 12; - pd[511].user_supervisor = false; - pd[511].rw = true; - - for (auto idx = 0u; idx < 512; ++idx) - { - pt[idx].present = true; - pt[idx].user_supervisor = false; - pt[idx].rw = true; - } - return true; - } -} \ No newline at end of file diff --git a/Voyager/PayLoad (Intel)/pg_table.h b/Voyager/PayLoad (Intel)/pg_table.h deleted file mode 100644 index 42bce15..0000000 --- a/Voyager/PayLoad (Intel)/pg_table.h +++ /dev/null @@ -1,167 +0,0 @@ -#pragma once -#include "types.h" -#include "ia32.hpp" - -#pragma section(".pdpt", read, write) -#pragma section(".pd", read, write) -#pragma section(".pt", read, write) - -namespace pg_table -{ - typedef union _virt_addr_t - { - void* value; - struct - { - u64 offset : 12; - u64 pt_index : 9; - u64 pd_index : 9; - u64 pdpt_index : 9; - u64 pml4_index : 9; - u64 reserved : 16; - }; - } virt_addr_t, * pvirt_addr_t; - - typedef union _pml4e - { - u64 value; - struct - { - u64 present : 1; // Must be 1, region invalid if 0. - u64 rw : 1; // If 0, writes not allowed. - u64 user_supervisor : 1; // If 0, user-mode accesses not allowed. - u64 PageWriteThrough : 1; // Determines the memory type used to access PDPT. - u64 page_cache : 1; // Determines the memory type used to access PDPT. - u64 accessed : 1; // If 0, this entry has not been used for translation. - u64 Ignored1 : 1; - u64 page_size : 1; // Must be 0 for PML4E. - u64 Ignored2 : 4; - u64 pfn : 36; // The page frame number of the PDPT of this PML4E. - u64 Reserved : 4; - u64 Ignored3 : 11; - u64 nx : 1; // If 1, instruction fetches not allowed. - }; - } pml4e, * ppml4e; - - typedef union _pdpte - { - u64 value; - struct - { - u64 present : 1; // Must be 1, region invalid if 0. - u64 rw : 1; // If 0, writes not allowed. - u64 user_supervisor : 1; // If 0, user-mode accesses not allowed. - u64 PageWriteThrough : 1; // Determines the memory type used to access PD. - u64 page_cache : 1; // Determines the memory type used to access PD. - u64 accessed : 1; // If 0, this entry has not been used for translation. - u64 Ignored1 : 1; - u64 page_size : 1; // If 1, this entry maps a 1GB page. - u64 Ignored2 : 4; - u64 pfn : 36; // The page frame number of the PD of this PDPTE. - u64 Reserved : 4; - u64 Ignored3 : 11; - u64 nx : 1; // If 1, instruction fetches not allowed. - }; - } pdpte, * ppdpte; - - typedef union _pde - { - u64 value; - struct - { - u64 present : 1; // Must be 1, region invalid if 0. - u64 rw : 1; // If 0, writes not allowed. - u64 user_supervisor : 1; // If 0, user-mode accesses not allowed. - u64 PageWriteThrough : 1; // Determines the memory type used to access PT. - u64 page_cache : 1; // Determines the memory type used to access PT. - u64 accessed : 1; // If 0, this entry has not been used for translation. - u64 Ignored1 : 1; - u64 page_size : 1; // If 1, this entry maps a 2MB page. - u64 Ignored2 : 4; - u64 pfn : 36; // The page frame number of the PT of this PDE. - u64 Reserved : 4; - u64 Ignored3 : 11; - u64 nx : 1; // If 1, instruction fetches not allowed. - }; - } pde, * ppde; - - typedef union _pte - { - u64 value; - struct - { - u64 present : 1; // Must be 1, region invalid if 0. - u64 rw : 1; // If 0, writes not allowed. - u64 user_supervisor : 1; // If 0, user-mode accesses not allowed. - u64 PageWriteThrough : 1; // Determines the memory type used to access the memory. - u64 page_cache : 1; // Determines the memory type used to access the memory. - u64 accessed : 1; // If 0, this entry has not been used for translation. - u64 Dirty : 1; // If 0, the memory backing this page has not been written to. - u64 PageAccessType : 1; // Determines the memory type used to access the memory. - u64 Global : 1; // If 1 and the PGE bit of CR4 is set, translations are global. - u64 Ignored2 : 3; - u64 pfn : 36; // The page frame number of the backing physical page. - u64 reserved : 4; - u64 Ignored3 : 7; - u64 ProtectionKey : 4; // If the PKE bit of CR4 is set, determines the protection key. - u64 nx : 1; // If 1, instruction fetches not allowed. - }; - } pte, * ppte; - - typedef struct _table_entries - { - pg_table::pml4e pml4e; - pg_table::pdpte pdpte; - pg_table::pde pde; - pg_table::pte pte; - } table_entries, *ptable_entries; - - /// - /// payload paging tables... - /// - __declspec(allocate(".pdpt")) inline pdpte pdpt[512]; - __declspec(allocate(".pd")) inline pde pd[512]; - __declspec(allocate(".pt")) inline pte pt[512]; - - /// - /// self referencing pml4e is at 255... - /// - inline const ppml4e hyperv_pml4{ reinterpret_cast(0x00007FBFDFEFF000) }; - - /// - /// only does address translation for hyper-v's context - /// - /// virtual address to be translated... - /// optional - /// returns a physical address... - void* translate(void* virt_addr, const ptable_entries entries = nullptr); - - /// - /// translates linear virtual addresses to linear physical addresses... - /// - /// virtual address to translate... - /// page map level four page frame number... - /// (optional) pointer to a table_entries structure... - /// linear physical address... - void* translate(void* virtual_address, u32 pml4_pfn, const ptable_entries entries = nullptr); - - /// - // changes the cursor address to the specified physical address... - // after doing so, the TLB entry for that address is going to be flushed... - // a memory fence is applied to prevent out of order execution... - /// - /// pfn of the physical page to change the cursor too... - void set_cursor_page(u32 phys_pfn); - - /// - /// get the cursor page... each core has its own cursor page... - /// - /// cursor page for the current core... - void* get_cursor_page(); - - /// - /// initalizes paging tables (connects pdpt->pd->pt) - /// - /// was the setup successful? - bool init_pg_tables(); -} \ No newline at end of file diff --git a/Voyager/PayLoad (Intel)/types.h b/Voyager/PayLoad (Intel)/types.h index 8267fd6..c3e7c79 100644 --- a/Voyager/PayLoad (Intel)/types.h +++ b/Voyager/PayLoad (Intel)/types.h @@ -3,10 +3,14 @@ #include #include -#define PORT_NUM 0x2F8 +#include +#include +#include "ia32.hpp" + #define VMEXIT_KEY 0xDEADBEEFDEADBEEF -#define DBG_PRINT(arg) \ - __outbytestring(PORT_NUM, (unsigned char*)arg, sizeof arg); +#define PAGE_4KB 0x1000 +#define PAGE_2MB PAGE_4KB * 512 +#define PAGE_1GB PAGE_2MB * 512 using u8 = unsigned char; using u16 = unsigned short; @@ -14,12 +18,65 @@ using u32 = unsigned int; using u64 = unsigned long long; using u128 = __m128; +using guest_virt_t = u64; +using guest_phys_t = u64; +using host_virt_t = u64; +using host_phys_t = u64; + enum class vmexit_command_t { - init_paging_tables = 0x111 - // add your commands here... + init_page_tables, + read_guest_phys, + write_guest_phys, + copy_guest_virt, + get_dirbase, + translate +}; + +enum class vmxroot_error_t +{ + error_success, + pml4e_not_present, + pdpte_not_present, + pde_not_present, + pte_not_present, + vmxroot_translate_failure, + invalid_self_ref_pml4e, + invalid_mapping_pml4e, + invalid_host_virtual, + invalid_guest_physical, + invalid_guest_virtual, + page_table_init_failed }; +typedef union _command_t +{ + struct _copy_phys + { + host_phys_t phys_addr; + guest_virt_t buffer; + u64 size; + } copy_phys; + + struct _copy_virt + { + guest_phys_t dirbase_src; + guest_virt_t virt_src; + guest_phys_t dirbase_dest; + guest_virt_t virt_dest; + u64 size; + } copy_virt; + + struct _translate_virt + { + guest_virt_t virt_src; + guest_phys_t phys_addr; + } translate_virt; + + guest_phys_t dirbase; + +} command_t, * pcommand_t; + typedef struct _context_t { u64 rax; @@ -55,12 +112,12 @@ using vmexit_handler_t = void(__fastcall*)(pcontext_t context, void* unknown); #pragma pack(push, 1) typedef struct _voyager_t { - // RVA from golden record entry ---> back to original vmexit handler... u64 vmexit_handler_rva; u64 hyperv_module_base; u64 hyperv_module_size; - u64 record_base; - u64 record_size; + u64 payload_base; + u64 payload_size; } voyager_t, *pvoyager_t; #pragma pack(pop) + __declspec(dllexport) inline voyager_t voyager_context; \ No newline at end of file diff --git a/Voyager/PayLoad (Intel)/vmexit.cpp b/Voyager/PayLoad (Intel)/vmexit.cpp new file mode 100644 index 0000000..cc7a08d --- /dev/null +++ b/Voyager/PayLoad (Intel)/vmexit.cpp @@ -0,0 +1,34 @@ +#include "vmexit.h" + +namespace vmexit +{ + auto get_command(guest_virt_t command_ptr) -> command_t + { + u64 guest_dirbase; + __vmx_vmread(VMCS_GUEST_CR3, &guest_dirbase); + + // cr3 can contain other high bits so just to be safe + // get the pfn and bitshift it... + guest_dirbase = cr3{ guest_dirbase }.pml4_pfn << 12; + + const auto command_page = + mm::map_guest_virt(guest_dirbase, command_ptr); + + return *reinterpret_cast(command_page); + } + + auto set_command(guest_virt_t command_ptr, command_t& command_data) -> void + { + u64 guest_dirbase; + __vmx_vmread(VMCS_GUEST_CR3, &guest_dirbase); + + // cr3 can contain other high bits so just to be safe + // get the pfn and bitshift it... + guest_dirbase = cr3{ guest_dirbase }.pml4_pfn << 12; + + const auto command_page = + mm::map_guest_virt(guest_dirbase, command_ptr); + + *reinterpret_cast(command_page) = command_data; + } +} \ No newline at end of file diff --git a/Voyager/PayLoad (Intel)/vmexit.h b/Voyager/PayLoad (Intel)/vmexit.h new file mode 100644 index 0000000..8049ff7 --- /dev/null +++ b/Voyager/PayLoad (Intel)/vmexit.h @@ -0,0 +1,9 @@ +#pragma once +#include "mm.h" +#include "debug.h" + +namespace vmexit +{ + auto get_command(guest_virt_t command_ptr) -> command_t; + auto set_command(guest_virt_t command_ptr, command_t& command_data) -> void; +} \ No newline at end of file diff --git a/Voyager/PayLoad (Intel)/vmexit_handler.cpp b/Voyager/PayLoad (Intel)/vmexit_handler.cpp index 191c73b..b456ccf 100644 --- a/Voyager/PayLoad (Intel)/vmexit_handler.cpp +++ b/Voyager/PayLoad (Intel)/vmexit_handler.cpp @@ -1,4 +1,4 @@ -#include "pg_table.h" +#include "vmexit.h" #if WINVER > 1803 void vmexit_handler(pcontext_t* context, void* unknown) @@ -6,6 +6,7 @@ void vmexit_handler(pcontext_t* context, void* unknown) void vmexit_handler(pcontext_t context, void* unknown) #endif { + #if WINVER > 1803 pcontext_t guest_registers = *context; #else @@ -18,15 +19,113 @@ void vmexit_handler(pcontext_t context, void* unknown) { if (guest_registers->rcx == VMEXIT_KEY) { - switch ((vmexit_command_t)(guest_registers->rdx)) + switch ((vmexit_command_t)guest_registers->rdx) + { + case vmexit_command_t::init_page_tables: + { + guest_registers->rax = (u64) mm::init(); + break; + } + case vmexit_command_t::get_dirbase: + { + auto command_data = + vmexit::get_command(guest_registers->r8); + + u64 guest_dirbase; + __vmx_vmread(VMCS_GUEST_CR3, &guest_dirbase); + + // cr3 can contain other high bits so just to be safe + // get the pfn and bitshift it... + guest_dirbase = cr3{ guest_dirbase }.pml4_pfn << 12; + command_data.dirbase = guest_dirbase; + guest_registers->rax = (u64) vmxroot_error_t::error_success; + + vmexit::set_command( + guest_registers->r8, command_data); + break; + } + case vmexit_command_t::read_guest_phys: + { + auto command_data = + vmexit::get_command(guest_registers->r8); + + u64 guest_dirbase; + __vmx_vmread(VMCS_GUEST_CR3, &guest_dirbase); + // from 1809-1909 PCIDE is enabled in CR4 and so cr3 contains some other stuff... + guest_dirbase = cr3{ guest_dirbase }.pml4_pfn << 12; + + guest_registers->rax = + (u64) mm::read_guest_phys( + guest_dirbase, + command_data.copy_phys.phys_addr, + command_data.copy_phys.buffer, + command_data.copy_phys.size); + + vmexit::set_command( + guest_registers->r8, command_data); + break; + } + case vmexit_command_t::write_guest_phys: + { + auto command_data = + vmexit::get_command(guest_registers->r8); + + u64 guest_dirbase; + __vmx_vmread(VMCS_GUEST_CR3, &guest_dirbase); + // from 1809-1909 PCIDE is enabled in CR4 and so cr3 contains some other stuff... + guest_dirbase = cr3{ guest_dirbase }.pml4_pfn << 12; + + guest_registers->rax = + (u64) mm::write_guest_phys( + guest_dirbase, + command_data.copy_phys.phys_addr, + command_data.copy_phys.buffer, + command_data.copy_phys.size); + + vmexit::set_command( + guest_registers->r8, command_data); + break; + } + case vmexit_command_t::copy_guest_virt: + { + auto command_data = + vmexit::get_command(guest_registers->r8); + + auto virt_data = command_data.copy_virt; + guest_registers->rax = + (u64)mm::copy_guest_virt( + virt_data.dirbase_src, + virt_data.virt_src, + virt_data.dirbase_dest, + virt_data.virt_dest, + virt_data.size); + break; + } + case vmexit_command_t::translate: { - case vmexit_command_t::init_paging_tables: - guest_registers->rax = pg_table::init_pg_tables(); + auto command_data = + vmexit::get_command(guest_registers->r8); + + u64 guest_dirbase; + __vmx_vmread(VMCS_GUEST_CR3, &guest_dirbase); + guest_dirbase = cr3{ guest_dirbase }.pml4_pfn << 12; + + command_data.translate_virt.phys_addr = + mm::translate_guest_virtual(guest_dirbase, + command_data.translate_virt.virt_src); + + guest_registers->rax = + (u64) vmxroot_error_t::error_success; + + vmexit::set_command( + guest_registers->r8, command_data); break; + } default: break; } + // advance instruction pointer... size_t rip, exec_len; __vmx_vmread(VMCS_GUEST_RIP, &rip); __vmx_vmread(VMCS_VMEXIT_INSTRUCTION_LENGTH, &exec_len); @@ -35,8 +134,7 @@ void vmexit_handler(pcontext_t context, void* unknown) } } - // since there are alot of contexts being created and switched about, - // all hooks are done relative inside of hyper-v... + // call original vmexit handler... reinterpret_cast( reinterpret_cast(&vmexit_handler) - voyager_context.vmexit_handler_rva)(context, unknown); diff --git a/Voyager/Voyager.sln b/Voyager/Voyager.sln index 1458968..0ad851d 100644 --- a/Voyager/Voyager.sln +++ b/Voyager/Voyager.sln @@ -3,12 +3,16 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.30503.244 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Voyager", "Voyager\Voyager.vcxproj", "{540D433F-C2DF-49A6-895C-F5C74B014777}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PayLoad (Intel)", "PayLoad (Intel)\PayLoad (Intel).vcxproj", "{223D1FDE-331E-4028-9083-1673A5161C99}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PayLoad (AMD)", "PayLoad (AMD)\PayLoad (AMD).vcxproj", "{C5122D8B-DEC8-458F-9342-3A4AC3152BEF}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Voyager", "Voyager\Voyager.vcxproj", "{540D433F-C2DF-49A6-895C-F5C74B014777}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example", "example\example.vcxproj", "{1770C4FB-345F-40DD-B4A2-2A5DC8A50866}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libvoyager", "libvoyager\libvoyager.vcxproj", "{F468E79E-CC93-4A7F-844E-984117B5B08B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution 1507|x64 = 1507|x64 @@ -21,33 +25,14 @@ Global 1903|x64 = 1903|x64 1909|x64 = 1909|x64 2004|x64 = 2004|x64 + Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {540D433F-C2DF-49A6-895C-F5C74B014777}.1507|x64.ActiveCfg = 1507|x64 - {540D433F-C2DF-49A6-895C-F5C74B014777}.1507|x64.Build.0 = 1507|x64 - {540D433F-C2DF-49A6-895C-F5C74B014777}.1511|x64.ActiveCfg = 1511|x64 - {540D433F-C2DF-49A6-895C-F5C74B014777}.1511|x64.Build.0 = 1511|x64 - {540D433F-C2DF-49A6-895C-F5C74B014777}.1607|x64.ActiveCfg = 1607|x64 - {540D433F-C2DF-49A6-895C-F5C74B014777}.1607|x64.Build.0 = 1607|x64 - {540D433F-C2DF-49A6-895C-F5C74B014777}.1703|x64.ActiveCfg = 1703|x64 - {540D433F-C2DF-49A6-895C-F5C74B014777}.1703|x64.Build.0 = 1703|x64 - {540D433F-C2DF-49A6-895C-F5C74B014777}.1709|x64.ActiveCfg = 1709|x64 - {540D433F-C2DF-49A6-895C-F5C74B014777}.1709|x64.Build.0 = 1709|x64 - {540D433F-C2DF-49A6-895C-F5C74B014777}.1803|x64.ActiveCfg = 1803|x64 - {540D433F-C2DF-49A6-895C-F5C74B014777}.1803|x64.Build.0 = 1803|x64 - {540D433F-C2DF-49A6-895C-F5C74B014777}.1809|x64.ActiveCfg = 1809|x64 - {540D433F-C2DF-49A6-895C-F5C74B014777}.1809|x64.Build.0 = 1809|x64 - {540D433F-C2DF-49A6-895C-F5C74B014777}.1903|x64.ActiveCfg = 1903|x64 - {540D433F-C2DF-49A6-895C-F5C74B014777}.1903|x64.Build.0 = 1903|x64 - {540D433F-C2DF-49A6-895C-F5C74B014777}.1909|x64.ActiveCfg = 1909|x64 - {540D433F-C2DF-49A6-895C-F5C74B014777}.1909|x64.Build.0 = 1909|x64 - {540D433F-C2DF-49A6-895C-F5C74B014777}.2004|x64.ActiveCfg = 2004|x64 - {540D433F-C2DF-49A6-895C-F5C74B014777}.2004|x64.Build.0 = 2004|x64 {223D1FDE-331E-4028-9083-1673A5161C99}.1507|x64.ActiveCfg = 1507|x64 {223D1FDE-331E-4028-9083-1673A5161C99}.1507|x64.Build.0 = 1507|x64 - {223D1FDE-331E-4028-9083-1673A5161C99}.1511|x64.ActiveCfg = 1607|x64 - {223D1FDE-331E-4028-9083-1673A5161C99}.1511|x64.Build.0 = 1607|x64 - {223D1FDE-331E-4028-9083-1673A5161C99}.1511|x64.Deploy.0 = 1607|x64 + {223D1FDE-331E-4028-9083-1673A5161C99}.1511|x64.ActiveCfg = 1511|x64 + {223D1FDE-331E-4028-9083-1673A5161C99}.1511|x64.Build.0 = 1511|x64 + {223D1FDE-331E-4028-9083-1673A5161C99}.1511|x64.Deploy.0 = 1511|x64 {223D1FDE-331E-4028-9083-1673A5161C99}.1607|x64.ActiveCfg = 1607|x64 {223D1FDE-331E-4028-9083-1673A5161C99}.1607|x64.Build.0 = 1607|x64 {223D1FDE-331E-4028-9083-1673A5161C99}.1703|x64.ActiveCfg = 1703|x64 @@ -56,14 +41,16 @@ Global {223D1FDE-331E-4028-9083-1673A5161C99}.1709|x64.Build.0 = 1709|x64 {223D1FDE-331E-4028-9083-1673A5161C99}.1803|x64.ActiveCfg = 1803|x64 {223D1FDE-331E-4028-9083-1673A5161C99}.1803|x64.Build.0 = 1803|x64 - {223D1FDE-331E-4028-9083-1673A5161C99}.1809|x64.ActiveCfg = 1909|x64 - {223D1FDE-331E-4028-9083-1673A5161C99}.1809|x64.Build.0 = 1909|x64 + {223D1FDE-331E-4028-9083-1673A5161C99}.1809|x64.ActiveCfg = 1809|x64 + {223D1FDE-331E-4028-9083-1673A5161C99}.1809|x64.Build.0 = 1809|x64 {223D1FDE-331E-4028-9083-1673A5161C99}.1903|x64.ActiveCfg = 1903|x64 {223D1FDE-331E-4028-9083-1673A5161C99}.1903|x64.Build.0 = 1903|x64 {223D1FDE-331E-4028-9083-1673A5161C99}.1909|x64.ActiveCfg = 1909|x64 {223D1FDE-331E-4028-9083-1673A5161C99}.1909|x64.Build.0 = 1909|x64 {223D1FDE-331E-4028-9083-1673A5161C99}.2004|x64.ActiveCfg = 2004|x64 {223D1FDE-331E-4028-9083-1673A5161C99}.2004|x64.Build.0 = 2004|x64 + {223D1FDE-331E-4028-9083-1673A5161C99}.Release|x64.ActiveCfg = 2004|x64 + {223D1FDE-331E-4028-9083-1673A5161C99}.Release|x64.Build.0 = 2004|x64 {C5122D8B-DEC8-458F-9342-3A4AC3152BEF}.1507|x64.ActiveCfg = 1507|x64 {C5122D8B-DEC8-458F-9342-3A4AC3152BEF}.1507|x64.Build.0 = 1507|x64 {C5122D8B-DEC8-458F-9342-3A4AC3152BEF}.1511|x64.ActiveCfg = 1511|x64 @@ -84,6 +71,74 @@ Global {C5122D8B-DEC8-458F-9342-3A4AC3152BEF}.1909|x64.Build.0 = 1909|x64 {C5122D8B-DEC8-458F-9342-3A4AC3152BEF}.2004|x64.ActiveCfg = 2004|x64 {C5122D8B-DEC8-458F-9342-3A4AC3152BEF}.2004|x64.Build.0 = 2004|x64 + {C5122D8B-DEC8-458F-9342-3A4AC3152BEF}.Release|x64.ActiveCfg = 2004|x64 + {C5122D8B-DEC8-458F-9342-3A4AC3152BEF}.Release|x64.Build.0 = 2004|x64 + {540D433F-C2DF-49A6-895C-F5C74B014777}.1507|x64.ActiveCfg = 1507|x64 + {540D433F-C2DF-49A6-895C-F5C74B014777}.1507|x64.Build.0 = 1507|x64 + {540D433F-C2DF-49A6-895C-F5C74B014777}.1511|x64.ActiveCfg = 1511|x64 + {540D433F-C2DF-49A6-895C-F5C74B014777}.1511|x64.Build.0 = 1511|x64 + {540D433F-C2DF-49A6-895C-F5C74B014777}.1607|x64.ActiveCfg = 1607|x64 + {540D433F-C2DF-49A6-895C-F5C74B014777}.1607|x64.Build.0 = 1607|x64 + {540D433F-C2DF-49A6-895C-F5C74B014777}.1703|x64.ActiveCfg = 1703|x64 + {540D433F-C2DF-49A6-895C-F5C74B014777}.1703|x64.Build.0 = 1703|x64 + {540D433F-C2DF-49A6-895C-F5C74B014777}.1709|x64.ActiveCfg = 1709|x64 + {540D433F-C2DF-49A6-895C-F5C74B014777}.1709|x64.Build.0 = 1709|x64 + {540D433F-C2DF-49A6-895C-F5C74B014777}.1803|x64.ActiveCfg = 1803|x64 + {540D433F-C2DF-49A6-895C-F5C74B014777}.1803|x64.Build.0 = 1803|x64 + {540D433F-C2DF-49A6-895C-F5C74B014777}.1809|x64.ActiveCfg = 1809|x64 + {540D433F-C2DF-49A6-895C-F5C74B014777}.1809|x64.Build.0 = 1809|x64 + {540D433F-C2DF-49A6-895C-F5C74B014777}.1903|x64.ActiveCfg = 1903|x64 + {540D433F-C2DF-49A6-895C-F5C74B014777}.1903|x64.Build.0 = 1903|x64 + {540D433F-C2DF-49A6-895C-F5C74B014777}.1909|x64.ActiveCfg = 1909|x64 + {540D433F-C2DF-49A6-895C-F5C74B014777}.1909|x64.Build.0 = 1909|x64 + {540D433F-C2DF-49A6-895C-F5C74B014777}.2004|x64.ActiveCfg = 2004|x64 + {540D433F-C2DF-49A6-895C-F5C74B014777}.2004|x64.Build.0 = 2004|x64 + {540D433F-C2DF-49A6-895C-F5C74B014777}.Release|x64.ActiveCfg = 2004|x64 + {540D433F-C2DF-49A6-895C-F5C74B014777}.Release|x64.Build.0 = 2004|x64 + {1770C4FB-345F-40DD-B4A2-2A5DC8A50866}.1507|x64.ActiveCfg = Release|x64 + {1770C4FB-345F-40DD-B4A2-2A5DC8A50866}.1507|x64.Build.0 = Release|x64 + {1770C4FB-345F-40DD-B4A2-2A5DC8A50866}.1511|x64.ActiveCfg = Release|x64 + {1770C4FB-345F-40DD-B4A2-2A5DC8A50866}.1511|x64.Build.0 = Release|x64 + {1770C4FB-345F-40DD-B4A2-2A5DC8A50866}.1607|x64.ActiveCfg = Release|x64 + {1770C4FB-345F-40DD-B4A2-2A5DC8A50866}.1607|x64.Build.0 = Release|x64 + {1770C4FB-345F-40DD-B4A2-2A5DC8A50866}.1703|x64.ActiveCfg = Release|x64 + {1770C4FB-345F-40DD-B4A2-2A5DC8A50866}.1703|x64.Build.0 = Release|x64 + {1770C4FB-345F-40DD-B4A2-2A5DC8A50866}.1709|x64.ActiveCfg = Release|x64 + {1770C4FB-345F-40DD-B4A2-2A5DC8A50866}.1709|x64.Build.0 = Release|x64 + {1770C4FB-345F-40DD-B4A2-2A5DC8A50866}.1803|x64.ActiveCfg = Release|x64 + {1770C4FB-345F-40DD-B4A2-2A5DC8A50866}.1803|x64.Build.0 = Release|x64 + {1770C4FB-345F-40DD-B4A2-2A5DC8A50866}.1809|x64.ActiveCfg = Release|x64 + {1770C4FB-345F-40DD-B4A2-2A5DC8A50866}.1809|x64.Build.0 = Release|x64 + {1770C4FB-345F-40DD-B4A2-2A5DC8A50866}.1903|x64.ActiveCfg = Release|x64 + {1770C4FB-345F-40DD-B4A2-2A5DC8A50866}.1903|x64.Build.0 = Release|x64 + {1770C4FB-345F-40DD-B4A2-2A5DC8A50866}.1909|x64.ActiveCfg = Release|x64 + {1770C4FB-345F-40DD-B4A2-2A5DC8A50866}.1909|x64.Build.0 = Release|x64 + {1770C4FB-345F-40DD-B4A2-2A5DC8A50866}.2004|x64.ActiveCfg = Release|x64 + {1770C4FB-345F-40DD-B4A2-2A5DC8A50866}.2004|x64.Build.0 = Release|x64 + {1770C4FB-345F-40DD-B4A2-2A5DC8A50866}.Release|x64.ActiveCfg = Release|x64 + {1770C4FB-345F-40DD-B4A2-2A5DC8A50866}.Release|x64.Build.0 = Release|x64 + {F468E79E-CC93-4A7F-844E-984117B5B08B}.1507|x64.ActiveCfg = Release|x64 + {F468E79E-CC93-4A7F-844E-984117B5B08B}.1507|x64.Build.0 = Release|x64 + {F468E79E-CC93-4A7F-844E-984117B5B08B}.1511|x64.ActiveCfg = Release|x64 + {F468E79E-CC93-4A7F-844E-984117B5B08B}.1511|x64.Build.0 = Release|x64 + {F468E79E-CC93-4A7F-844E-984117B5B08B}.1607|x64.ActiveCfg = Release|x64 + {F468E79E-CC93-4A7F-844E-984117B5B08B}.1607|x64.Build.0 = Release|x64 + {F468E79E-CC93-4A7F-844E-984117B5B08B}.1703|x64.ActiveCfg = Release|x64 + {F468E79E-CC93-4A7F-844E-984117B5B08B}.1703|x64.Build.0 = Release|x64 + {F468E79E-CC93-4A7F-844E-984117B5B08B}.1709|x64.ActiveCfg = Release|x64 + {F468E79E-CC93-4A7F-844E-984117B5B08B}.1709|x64.Build.0 = Release|x64 + {F468E79E-CC93-4A7F-844E-984117B5B08B}.1803|x64.ActiveCfg = Release|x64 + {F468E79E-CC93-4A7F-844E-984117B5B08B}.1803|x64.Build.0 = Release|x64 + {F468E79E-CC93-4A7F-844E-984117B5B08B}.1809|x64.ActiveCfg = Release|x64 + {F468E79E-CC93-4A7F-844E-984117B5B08B}.1809|x64.Build.0 = Release|x64 + {F468E79E-CC93-4A7F-844E-984117B5B08B}.1903|x64.ActiveCfg = Release|x64 + {F468E79E-CC93-4A7F-844E-984117B5B08B}.1903|x64.Build.0 = Release|x64 + {F468E79E-CC93-4A7F-844E-984117B5B08B}.1909|x64.ActiveCfg = Release|x64 + {F468E79E-CC93-4A7F-844E-984117B5B08B}.1909|x64.Build.0 = Release|x64 + {F468E79E-CC93-4A7F-844E-984117B5B08B}.2004|x64.ActiveCfg = Release|x64 + {F468E79E-CC93-4A7F-844E-984117B5B08B}.2004|x64.Build.0 = Release|x64 + {F468E79E-CC93-4A7F-844E-984117B5B08B}.Release|x64.ActiveCfg = Release|x64 + {F468E79E-CC93-4A7F-844E-984117B5B08B}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Voyager/Voyager/BootMgfw.c b/Voyager/Voyager/BootMgfw.c index 242cef9..124a8d4 100644 --- a/Voyager/Voyager/BootMgfw.c +++ b/Voyager/Voyager/BootMgfw.c @@ -1,7 +1,7 @@ #include "BootMgfw.h" #include "SplashScreen.h" -SHITHOOK BootMgfwShitHook; +INLINE_HOOK BootMgfwShitHook; EFI_STATUS EFIAPI RestoreBootMgfw(VOID) { UINTN HandleCount = NULL; @@ -200,10 +200,10 @@ EFI_STATUS EFIAPI InstallBootMgfwHooks(EFI_HANDLE ImageHandle) #if WINVER >= 1703 Print(L"BootMgfw.BlImgStartBootApplication -> 0x%p\n", ArchStartBootApplication); - MakeShitHook(&BootMgfwShitHook, ArchStartBootApplication, &ArchStartBootApplicationHook, TRUE); + MakeInlineHook(&BootMgfwShitHook, ArchStartBootApplication, &ArchStartBootApplicationHook, TRUE); #else Print(L"BootMgfw.BlImgStartBootApplication -> 0x%p\n", RESOLVE_RVA(ArchStartBootApplication, 5, 1)); - MakeShitHook(&BootMgfwShitHook, RESOLVE_RVA(ArchStartBootApplication, 5, 1), &ArchStartBootApplicationHook, TRUE); + MakeInlineHook(&BootMgfwShitHook, RESOLVE_RVA(ArchStartBootApplication, 5, 1), &ArchStartBootApplicationHook, TRUE); #endif return EFI_SUCCESS; } @@ -211,19 +211,11 @@ EFI_STATUS EFIAPI InstallBootMgfwHooks(EFI_HANDLE ImageHandle) EFI_STATUS EFIAPI ArchStartBootApplicationHook(VOID* AppEntry, VOID* ImageBase, UINT32 ImageSize, UINT8 BootOption, VOID* ReturnArgs) { // disable ArchStartBootApplication shithook - DisableShitHook(&BootMgfwShitHook); + DisableInlineHook(&BootMgfwShitHook); // on 1703 and below, winload does not export any functions if (!GetExport(ImageBase, "BlLdrLoadImage")) { - VOID* HvlpTransferToHypervisor = - FindPattern( - ImageBase, - ImageSize, - TRANS_TO_HV_SIG, - TRANS_TO_HV_MASK - ); - VOID* ImgLoadPEImageEx = FindPattern( ImageBase, @@ -232,31 +224,17 @@ EFI_STATUS EFIAPI ArchStartBootApplicationHook(VOID* AppEntry, VOID* ImageBase, LOAD_PE_IMG_MASK ); - MmMapPhysicalMemory = - RESOLVE_RVA( - FindPattern( - ImageBase, - ImageSize, - MAP_PHYSICAL_SIG, - MAP_PHYSICAL_MASK), - 5, 1); - gST->ConOut->ClearScreen(gST->ConOut); gST->ConOut->OutputString(gST->ConOut, AsciiArt); Print(L"\n"); Print(L"Hyper-V PayLoad Size -> 0x%x\n", PayLoadSize()); Print(L"winload.BlImgLoadPEImageEx -> 0x%p\n", RESOLVE_RVA(ImgLoadPEImageEx, 10, 6)); - Print(L"winload.HvlpTransferToHypervisor -> 0x%p\n", RESOLVE_RVA(HvlpTransferToHypervisor, 13, 9)); - - MakeShitHook(&TransferControlShitHook, RESOLVE_RVA(HvlpTransferToHypervisor, 13, 9), &TransferToHyperV, TRUE); - MakeShitHook(&WinLoadImageShitHook, RESOLVE_RVA(ImgLoadPEImageEx, 10, 6), &BlImgLoadPEImageEx, TRUE); + MakeInlineHook(&WinLoadImageShitHook, RESOLVE_RVA(ImgLoadPEImageEx, 10, 6), &BlImgLoadPEImageEx, TRUE); } else // else the installed windows version is between 2004 and 1709 { VOID* LdrLoadImage = GetExport(ImageBase, "BlLdrLoadImage"); - MmMapPhysicalMemory = GetExport(ImageBase, "BlMmMapPhysicalAddressEx"); - VOID* ImgAllocateImageBuffer = FindPattern( ImageBase, @@ -273,8 +251,8 @@ EFI_STATUS EFIAPI ArchStartBootApplicationHook(VOID* AppEntry, VOID* ImageBase, Print(L"winload.BlLdrLoadImage -> 0x%p\n", LdrLoadImage); Print(L"winload.BlImgAllocateImageBuffer -> 0x%p\n", RESOLVE_RVA(ImgAllocateImageBuffer, 5, 1)); - MakeShitHook(&WinLoadImageShitHook, LdrLoadImage, &BlLdrLoadImage, TRUE); - MakeShitHook(&WinLoadAllocateImageHook, RESOLVE_RVA(ImgAllocateImageBuffer, 5, 1), &BlImgAllocateImageBuffer, TRUE); + MakeInlineHook(&WinLoadImageShitHook, LdrLoadImage, &BlLdrLoadImage, TRUE); + MakeInlineHook(&WinLoadAllocateImageHook, RESOLVE_RVA(ImgAllocateImageBuffer, 5, 1), &BlImgAllocateImageBuffer, TRUE); } return ((IMG_ARCH_START_BOOT_APPLICATION)BootMgfwShitHook.Address)(AppEntry, ImageBase, ImageSize, BootOption, ReturnArgs); } \ No newline at end of file diff --git a/Voyager/Voyager/BootMgfw.h b/Voyager/Voyager/BootMgfw.h index 5fde795..2a23dfb 100644 --- a/Voyager/Voyager/BootMgfw.h +++ b/Voyager/Voyager/BootMgfw.h @@ -20,7 +20,7 @@ static_assert(sizeof(START_BOOT_APPLICATION_SIG) == sizeof(START_BOOT_APPLICATIO #define PAYLOAD_PATH L"\\efi\\microsoft\\boot\\payload.dll" #define WINDOWS_BOOTMGFW_BACKUP_PATH L"\\efi\\microsoft\\boot\\bootmgfw.efi.backup" -extern SHITHOOK BootMgfwShitHook; +extern INLINE_HOOK BootMgfwShitHook; typedef EFI_STATUS(EFIAPI* IMG_ARCH_START_BOOT_APPLICATION)(VOID*, VOID*, UINT32, UINT8, VOID*); /// @@ -54,4 +54,4 @@ EFI_STATUS EFIAPI InstallBootMgfwHooks(EFI_HANDLE BootMgfwPath); /// Unknown /// Unknown /// original function's return value... -EFI_STATUS EFIAPI ArchStartBootApplicationHook(VOID* AppEntry, VOID* ImageBase, UINT32 ImageSize, UINT8 BootOption, VOID* ReturnArgs); +EFI_STATUS EFIAPI ArchStartBootApplicationHook(VOID* AppEntry, VOID* ImageBase, UINT32 ImageSize, UINT8 BootOption, VOID* ReturnArgs); \ No newline at end of file diff --git a/Voyager/Voyager/Hv.c b/Voyager/Voyager/Hv.c index 85d5965..88ec1d1 100644 --- a/Voyager/Voyager/Hv.c +++ b/Voyager/Voyager/Hv.c @@ -1,5 +1,6 @@ #include "Hv.h" +PVOYAGER_T PayLoadDataPtr = NULL; VOID* MapModule(PVOYAGER_T VoyagerData, UINT8* ImageBase) { if (!VoyagerData || !ImageBase) @@ -13,10 +14,7 @@ VOID* MapModule(PVOYAGER_T VoyagerData, UINT8* ImageBase) if (ntHeaders->Signature != EFI_IMAGE_NT_SIGNATURE) return NULL; - // Map headers (no reason not too here, memory is unaccessable from guest lol) MemCopy(VoyagerData->ModuleBase, ImageBase, ntHeaders->OptionalHeader.SizeOfHeaders); - - // Map sections EFI_IMAGE_SECTION_HEADER* sections = (EFI_IMAGE_SECTION_HEADER*)((UINT8*)&ntHeaders->OptionalHeader + ntHeaders->FileHeader.SizeOfOptionalHeader); for (UINT32 i = 0; i < ntHeaders->FileHeader.NumberOfSections; ++i) { @@ -32,7 +30,6 @@ VOID* MapModule(PVOYAGER_T VoyagerData, UINT8* ImageBase) } } - // set exported pointer to voyager context... EFI_IMAGE_EXPORT_DIRECTORY* ExportDir = (EFI_IMAGE_EXPORT_DIRECTORY*)( VoyagerData->ModuleBase + ntHeaders->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); @@ -125,7 +122,7 @@ VOID MakeVoyagerData UINT64 VmExitFunction = VmExitHandlerCallRip + *(INT32*)((UINT64)(VmExitHandlerCall + 1)); // + 1 to skip E8 (call) and read 4 bytes (RVA) VoyagerData->VmExitHandlerRva = ((UINT64)PayLoadEntry(PayLoadBase)) - (UINT64)VmExitFunction; } - else + else // else AMD { VOID* VmExitHandlerCall = FindPattern( @@ -167,7 +164,7 @@ VOID* HookVmExit(VOID* HypervBase, VOID* HypervSize, VOID* VmExitHook) *(INT32*)((UINT64)(VmExitHandlerCall + 1)) = NewVmExitRVA; return VmExitFunction; } - else + else // else AMD { VOID* VmExitHandlerCall = FindPattern( diff --git a/Voyager/Voyager/Hv.h b/Voyager/Voyager/Hv.h index 6d42f54..32d24bd 100644 --- a/Voyager/Voyager/Hv.h +++ b/Voyager/Voyager/Hv.h @@ -1,6 +1,7 @@ #pragma once #include "PayLoad.h" +extern PVOYAGER_T PayLoadDataPtr; #if WINVER == 2004 #define INTEL_VMEXIT_HANDLER_SIG "\x65\xC6\x04\x25\x6D\x00\x00\x00\x00\x48\x8B\x4C\x24\x00\x48\x8B\x54\x24\x00\xE8\x00\x00\x00\x00\xE9" #define INTEL_VMEXIT_HANDLER_MASK "xxxxxxxxxxxxx?xxxx?x????x" diff --git a/Voyager/Voyager/HvLoader.c b/Voyager/Voyager/HvLoader.c index 5e07874..09eee9e 100644 --- a/Voyager/Voyager/HvLoader.c +++ b/Voyager/Voyager/HvLoader.c @@ -1,9 +1,9 @@ #include "HvLoader.h" -SHITHOOK HvLoadImageHook; -SHITHOOK HvLoadImageBufferHook; -SHITHOOK HvLoadAllocImageHook; -SHITHOOK TransferControlShitHook; +INLINE_HOOK HvLoadImageHook; +INLINE_HOOK HvLoadImageBufferHook; +INLINE_HOOK HvLoadAllocImageHook; +INLINE_HOOK TransferControlShitHook; BOOLEAN HvExtendedAllocation = FALSE; BOOLEAN HvHookedHyperV = FALSE; @@ -29,7 +29,7 @@ EFI_STATUS EFIAPI HvBlImgLoadPEImageFromSourceBuffer ) { // disable hook and call the original... - DisableShitHook(&HvLoadImageBufferHook); + DisableInlineHook(&HvLoadImageBufferHook); EFI_STATUS Result = ((HV_LDR_LOAD_IMAGE_BUFFER)HvLoadImageBufferHook.Address) ( a1, @@ -51,59 +51,40 @@ EFI_STATUS EFIAPI HvBlImgLoadPEImageFromSourceBuffer // keep hooking until we have extended hyper-v allocation and hooked into hyper-v... if(!HvExtendedAllocation && !HvHookedHyperV) - EnableShitHook(&HvLoadImageBufferHook); + EnableInlineHook(&HvLoadImageBufferHook); if (HvExtendedAllocation && !HvHookedHyperV) { HvHookedHyperV = TRUE; - EFI_IMAGE_DOS_HEADER* HypervDosHeader = *ImageBase; - if (HypervDosHeader->e_magic != EFI_IMAGE_DOS_SIGNATURE) - return Result; - - EFI_IMAGE_NT_HEADERS64* HypervNtHeader = (UINT64)HypervDosHeader + HypervDosHeader->e_lfanew; - if (HypervNtHeader->Signature != EFI_IMAGE_NT_SIGNATURE) - return Result; - - EFI_IMAGE_SECTION_HEADER* pSection = ((UINT64)&HypervNtHeader->OptionalHeader) + - HypervNtHeader->FileHeader.SizeOfOptionalHeader; - - for (UINT16 idx = 0; idx < HypervNtHeader->FileHeader.NumberOfSections; ++idx, ++pSection) - { - if (!AsciiStrCmp(&pSection->Name, ".reloc")) - { - VOYAGER_T VoyagerData; - - // - // the payload's base address needs to be page aligned in - // order for the paging table sections to be page aligned... - // - UINT32 PageRemainder = (0x1000 - (((*ImageBase + pSection->VirtualAddress + pSection->Misc.VirtualSize) << 52) >> 52)); - MakeVoyagerData - ( - &VoyagerData, - *ImageBase, - *ImageSize, - *ImageBase + pSection->VirtualAddress + pSection->Misc.VirtualSize + PageRemainder, - PayLoadSize() - ); - - HookVmExit - ( - VoyagerData.HypervModuleBase, - VoyagerData.HypervModuleSize, - MapModule(&VoyagerData, PayLoad) - ); - - // make the .reloc section RWX and increase the sections size... - pSection->Characteristics = SECTION_RWX; - pSection->Misc.VirtualSize += PayLoadSize(); - } - } + VOYAGER_T VoyagerData; + + // add a new section to hyper-v called "payload", then fill in voyager data + // and hook the vmexit handler... + MakeVoyagerData + ( + &VoyagerData, + *ImageBase, + *ImageSize, + AddSection + ( + *ImageBase, + "payload", + PayLoadSize(), + SECTION_RWX + ), + PayLoadSize() + ); + + HookVmExit + ( + VoyagerData.HypervModuleBase, + VoyagerData.HypervModuleSize, + MapModule(&VoyagerData, PayLoad) + ); // extend the size of the image in hyper-v's nt headers and LDR data entry... // this is required, if this is not done, then hyper-v will simply not be loaded... - HypervNtHeader->OptionalHeader.SizeOfImage += PayLoadSize(); - *ImageSize += PayLoadSize(); + *ImageSize += NT_HEADER(*ImageBase)->OptionalHeader.SizeOfImage; } return Result; } @@ -126,7 +107,7 @@ EFI_STATUS EFIAPI HvBlImgLoadPEImageEx ) { // disable shithook and call the original... - DisableShitHook(&HvLoadImageHook); + DisableInlineHook(&HvLoadImageHook); EFI_STATUS Result = ((HV_LDR_LOAD_IMAGE)HvLoadImageHook.Address) ( DeviceId, @@ -146,59 +127,40 @@ EFI_STATUS EFIAPI HvBlImgLoadPEImageEx // keep hooking until we have extended hyper-v allocation and hooked into hyper-v... if(!HvExtendedAllocation && !HvHookedHyperV) - EnableShitHook(&HvLoadImageHook); + EnableInlineHook(&HvLoadImageHook); if (HvExtendedAllocation && !HvHookedHyperV) { HvHookedHyperV = TRUE; - EFI_IMAGE_DOS_HEADER* HypervDosHeader = *ImageBase; - if (HypervDosHeader->e_magic != EFI_IMAGE_DOS_SIGNATURE) - return Result; - - EFI_IMAGE_NT_HEADERS64* HypervNtHeader = (UINT64)HypervDosHeader + HypervDosHeader->e_lfanew; - if (HypervNtHeader->Signature != EFI_IMAGE_NT_SIGNATURE) - return Result; - - EFI_IMAGE_SECTION_HEADER* pSection = ((UINT64)&HypervNtHeader->OptionalHeader) + - HypervNtHeader->FileHeader.SizeOfOptionalHeader; - - for (UINT16 idx = 0; idx < HypervNtHeader->FileHeader.NumberOfSections; ++idx, ++pSection) - { - if (!AsciiStrCmp(&pSection->Name, ".reloc")) - { - VOYAGER_T VoyagerData; - - // - // the payload's base address needs to be page aligned in - // order for the paging table sections to be page aligned... - // - UINT32 PageRemainder = (0x1000 - (((*ImageBase + pSection->VirtualAddress + pSection->Misc.VirtualSize) << 52) >> 52)); - MakeVoyagerData - ( - &VoyagerData, - *ImageBase, - *ImageSize, - *ImageBase + pSection->VirtualAddress + pSection->Misc.VirtualSize + PageRemainder, - PayLoadSize() - ); - - HookVmExit - ( - VoyagerData.HypervModuleBase, - VoyagerData.HypervModuleSize, - MapModule(&VoyagerData, PayLoad) - ); - - // make the .reloc section RWX and increase the sections size... - pSection->Characteristics = SECTION_RWX; - pSection->Misc.VirtualSize += PayLoadSize(); - } - } + VOYAGER_T VoyagerData; + + // add a new section to hyper-v called "payload", then fill in voyager data + // and hook the vmexit handler... + MakeVoyagerData + ( + &VoyagerData, + *ImageBase, + *ImageSize, + AddSection + ( + *ImageBase, + "payload", + PayLoadSize(), + SECTION_RWX + ), + PayLoadSize() + ); + + HookVmExit + ( + VoyagerData.HypervModuleBase, + VoyagerData.HypervModuleSize, + MapModule(&VoyagerData, PayLoad) + ); // extend the size of the image in hyper-v's nt headers and LDR data entry... // this is required, if this is not done, then hyper-v will simply not be loaded... - HypervNtHeader->OptionalHeader.SizeOfImage += PayLoadSize(); - *ImageSize += PayLoadSize(); + *ImageSize = NT_HEADER(*ImageBase)->OptionalHeader.SizeOfImage; } return Result; } @@ -223,7 +185,7 @@ UINT64 EFIAPI HvBlImgAllocateImageBuffer } // disable shithook and call the original function.... - DisableShitHook(&HvLoadAllocImageHook); + DisableInlineHook(&HvLoadAllocImageHook); UINT64 Result = ((ALLOCATE_IMAGE_BUFFER)HvLoadAllocImageHook.Address) ( imageBuffer, @@ -236,30 +198,7 @@ UINT64 EFIAPI HvBlImgAllocateImageBuffer // continue shithooking this function until we have extended the allocation of hyper-v... if(!HvExtendedAllocation) - EnableShitHook(&HvLoadAllocImageHook); + EnableInlineHook(&HvLoadAllocImageHook); return Result; -} - -VOID TransferToHyperV(UINT64 Pml4PhysicalAddress, VOID* Unknown, VOID* AssemblyStub, VOID* Unknown2) -{ - PML4E_T SelfRefEntry; - PPML4E_T Pml4 = NULL; - MmMapPhysicalMemory(&Pml4, Pml4PhysicalAddress, 0x1000, NULL, NULL); - - // setup self referencing paging table entry... - Pml4[255].Value = NULL; - Pml4[255].Present = TRUE; - Pml4[255].Pfn = Pml4PhysicalAddress >> 12; - Pml4[255].UserSuperVisor = FALSE; - Pml4[255].ReadWrite = TRUE; - - DisableShitHook(&TransferControlShitHook); - ((VOID(__fastcall*)(VOID*, VOID*, VOID*, VOID*))TransferControlShitHook.Address) - ( - Pml4PhysicalAddress, - Unknown, - AssemblyStub, - Unknown2 - ); } \ No newline at end of file diff --git a/Voyager/Voyager/HvLoader.h b/Voyager/Voyager/HvLoader.h index 375d893..5e12c27 100644 --- a/Voyager/Voyager/HvLoader.h +++ b/Voyager/Voyager/HvLoader.h @@ -1,13 +1,13 @@ #pragma once #include "PayLoad.h" #include "Hv.h" -#include "ShitHook.h" +#include "InlineHook.h" #include "PagingTables.h" -extern SHITHOOK HvLoadImageHook; -extern SHITHOOK HvLoadAllocImageHook; -extern SHITHOOK HvLoadImageBufferHook; -extern SHITHOOK TransferControlShitHook; +extern INLINE_HOOK HvLoadImageHook; +extern INLINE_HOOK HvLoadAllocImageHook; +extern INLINE_HOOK HvLoadImageBufferHook; +extern INLINE_HOOK TransferControlShitHook; #define HV_ALLOCATE_IMAGE_BUFFER_SIG "\xE8\x00\x00\x00\x00\x8B\xF8\x85\xC0\x79\x0A" #define HV_ALLOCATE_IMAGE_BUFFER_MASK "x????xxxxxx" @@ -21,14 +21,6 @@ static_assert(sizeof(HV_LOAD_PE_IMG_FROM_BUFFER_SIG) == sizeof(HV_LOAD_PE_IMG_FR #define HV_LOAD_PE_IMG_MASK "xxxx?x????xxxxxxx????xxx" static_assert(sizeof(HV_LOAD_PE_IMG_SIG) == sizeof(HV_LOAD_PE_IMG_MASK), "signature and mask do not match size..."); -// 1703-1511 -// -// winload.HvlpTransferToHypervisor is used to transfer control to hyper-v... -// on 2004-1709, this function is going to be inside of hvloader.dll... -#define TRANS_TO_HV_SIG "\x48\x8B\x51\x10\x48\x8B\x49\x18\xE8" -#define TRANS_TO_HV_MASK "xxxxxxxxx" -static_assert(sizeof(TRANS_TO_HV_SIG) == sizeof(TRANS_TO_HV_MASK), "signature and mask do not match size..."); - typedef EFI_STATUS(EFIAPI* ALLOCATE_IMAGE_BUFFER)(VOID** imageBuffer, UINTN imageSize, UINT32 memoryType, UINT32 attributes, VOID* unused, UINT32 Value); @@ -131,18 +123,4 @@ EFI_STATUS EFIAPI HvBlImgLoadPEImageFromSourceBuffer VOID* a13, VOID* a14, VOID* a15 -); - -/// -/// called when the hypervisor is started... -/// -/// the physical address of hyper-v's pml4... -/// -/// assembly stub to set CR3... -VOID TransferToHyperV -( - UINT64 Pml4PhysicalAddress, - VOID* Unknown, - VOID* AssemblyStub, - VOID* Unknown2 ); \ No newline at end of file diff --git a/Voyager/Voyager/ShitHook.c b/Voyager/Voyager/InlineHook.c similarity index 70% rename from Voyager/Voyager/ShitHook.c rename to Voyager/Voyager/InlineHook.c index 6d1ff4c..a36a1d2 100644 --- a/Voyager/Voyager/ShitHook.c +++ b/Voyager/Voyager/InlineHook.c @@ -1,6 +1,6 @@ -#include "ShitHook.h" +#include "InlineHook.h" -VOID MakeShitHook(PSHITHOOK Hook, VOID* HookFrom, VOID* HookTo, BOOLEAN Install) +VOID MakeInlineHook(PINLINE_HOOK_T Hook, VOID* HookFrom, VOID* HookTo, BOOLEAN Install) { unsigned char JmpCode[14] = { @@ -19,15 +19,15 @@ VOID MakeShitHook(PSHITHOOK Hook, VOID* HookFrom, VOID* HookTo, BOOLEAN Install) // setup hook... MemCopy(JmpCode + 6, &HookTo, sizeof HookTo); MemCopy(Hook->JmpCode, JmpCode, sizeof JmpCode); - if (Install) EnableShitHook(Hook); + if (Install) EnableInlineHook(Hook); } -VOID EnableShitHook(PSHITHOOK Hook) +VOID EnableInlineHook(PINLINE_HOOK_T Hook) { MemCopy(Hook->Address, Hook->JmpCode, sizeof Hook->JmpCode); } -VOID DisableShitHook(PSHITHOOK Hook) +VOID DisableInlineHook(PINLINE_HOOK_T Hook) { MemCopy(Hook->Address, Hook->Code, sizeof Hook->Code); } \ No newline at end of file diff --git a/Voyager/Voyager/InlineHook.h b/Voyager/Voyager/InlineHook.h new file mode 100644 index 0000000..598580f --- /dev/null +++ b/Voyager/Voyager/InlineHook.h @@ -0,0 +1,15 @@ +#pragma once +#include "Utils.h" + +typedef struct _INLINE_HOOK +{ + unsigned char Code[14]; + unsigned char JmpCode[14]; + + void* Address; + void* HookAddress; +} INLINE_HOOK, *PINLINE_HOOK_T; + +VOID MakeInlineHook(PINLINE_HOOK_T Hook, VOID* HookFrom, VOID* HookTo, BOOLEAN Install); +VOID EnableInlineHook(PINLINE_HOOK_T Hook); +VOID DisableInlineHook(PINLINE_HOOK_T Hook); \ No newline at end of file diff --git a/Voyager/Voyager/PagingTables.h b/Voyager/Voyager/PagingTables.h index c6d2e8a..0859713 100644 --- a/Voyager/Voyager/PagingTables.h +++ b/Voyager/Voyager/PagingTables.h @@ -52,15 +52,15 @@ typedef union _PML4E_T UINT64 Present : 1; // Must be 1, region invalid if 0. UINT64 ReadWrite : 1; // If 0, writes not allowed. UINT64 UserSuperVisor : 1; // If 0, user-mode accesses not allowed. - UINT64 PageWriteThrough : 1; // Determines the memory type used to access PDPT. + UINT64 page_write_through : 1; // Determines the memory type used to access PDPT. UINT64 page_cache : 1; // Determines the memory type used to access PDPT. UINT64 accessed : 1; // If 0, this entry has not been used for translation. - UINT64 Ignored1 : 1; + UINT64 ignore_1 : 1; UINT64 LargePage : 1; // Must be 0 for PML4E. - UINT64 Ignored2 : 4; + UINT64 ignore_2 : 4; UINT64 Pfn : 36; // The page frame number of the PDPT of this PML4E. - UINT64 Reserved : 4; - UINT64 Ignored3 : 11; + UINT64 reserved : 4; + UINT64 ignore_3 : 11; UINT64 nx : 1; // If 1, instruction fetches not allowed. }; } PML4E_T, * PPML4E_T; @@ -73,15 +73,15 @@ typedef union _PDPTE UINT64 Present : 1; // Must be 1, region invalid if 0. UINT64 ReadWrite : 1; // If 0, writes not allowed. UINT64 UserSuperVisor : 1; // If 0, user-mode accesses not allowed. - UINT64 PageWriteThrough : 1; // Determines the memory type used to access PD. + UINT64 page_write_through : 1; // Determines the memory type used to access PD. UINT64 page_cache : 1; // Determines the memory type used to access PD. UINT64 accessed : 1; // If 0, this entry has not been used for translation. - UINT64 Ignored1 : 1; + UINT64 ignore_1 : 1; UINT64 LargePage : 1; // If 1, this entry maps a 1GB page. - UINT64 Ignored2 : 4; + UINT64 ignore_2 : 4; UINT64 Pfn : 36; // The page frame number of the PD of this PDPTE. - UINT64 Reserved : 4; - UINT64 Ignored3 : 11; + UINT64 reserved : 4; + UINT64 ignore_3 : 11; UINT64 nx : 1; // If 1, instruction fetches not allowed. }; } PDPTE_T, * PPDPTE_T; @@ -94,15 +94,15 @@ typedef union _PDE UINT64 Present : 1; // Must be 1, region invalid if 0. UINT64 ReadWrite : 1; // If 0, writes not allowed. UINT64 UserSuperVisor : 1; // If 0, user-mode accesses not allowed. - UINT64 PageWriteThrough : 1; // Determines the memory type used to access PT. + UINT64 page_write_through : 1; // Determines the memory type used to access PT. UINT64 page_cache : 1; // Determines the memory type used to access PT. UINT64 accessed : 1; // If 0, this entry has not been used for translation. - UINT64 Ignored1 : 1; + UINT64 ignore_1 : 1; UINT64 LargePage : 1; // If 1, this entry maps a 2MB page. - UINT64 Ignored2 : 4; + UINT64 ignore_2 : 4; UINT64 Pfn : 36; // The page frame number of the PT of this PDE. - UINT64 Reserved : 4; - UINT64 Ignored3 : 11; + UINT64 reserved : 4; + UINT64 ignore_3 : 11; UINT64 nx : 1; // If 1, instruction fetches not allowed. }; } PDE_T, * PPDE_T; @@ -115,17 +115,17 @@ typedef union _PTE UINT64 Present : 1; // Must be 1, region invalid if 0. UINT64 ReadWrite : 1; // If 0, writes not allowed. UINT64 UserSuperVisor : 1; // If 0, user-mode accesses not allowed. - UINT64 PageWriteThrough : 1; // Determines the memory type used to access the memory. + UINT64 page_write_through : 1; // Determines the memory type used to access the memory. UINT64 page_cache : 1; // Determines the memory type used to access the memory. UINT64 accessed : 1; // If 0, this entry has not been used for translation. - UINT64 Dirty : 1; // If 0, the memory backing this page has not been written to. - UINT64 PageAccessType : 1; // Determines the memory type used to access the memory. - UINT64 Global : 1; // If 1 and the PGE bit of CR4 is set, translations are global. - UINT64 Ignored2 : 3; + UINT64 dirty : 1; // If 0, the memory backing this page has not been written to. + UINT64 access_type : 1; // Determines the memory type used to access the memory. + UINT64 global : 1; // If 1 and the PGE bit of CR4 is set, translations are global. + UINT64 ignore_2 : 3; UINT64 Pfn : 36; // The page frame number of the backing physical page. UINT64 reserved : 4; - UINT64 Ignored3 : 7; - UINT64 ProtectionKey : 4; // If the PKE bit of CR4 is set, determines the protection key. + UINT64 ignore_3 : 7; + UINT64 pk : 4; // If the PKE bit of CR4 is set, determines the protection key. UINT64 nx : 1; // If 1, instruction fetches not allowed. }; } PTE_T, *PPTE_T; diff --git a/Voyager/Voyager/PayLoad.c b/Voyager/Voyager/PayLoad.c index f6aef22..8a9be5c 100644 --- a/Voyager/Voyager/PayLoad.c +++ b/Voyager/Voyager/PayLoad.c @@ -4,14 +4,6 @@ // to read the payload from disk and delete it after... VOID* PayLoad = NULL; -PPTE_T PayLoadPt = NULL; -PPDE_T PayLoadPd = NULL; -PPDPTE_T PayLoadPdPt = NULL; - -UINT64 PayLoadPtPhysAddr = NULL; -UINT64 PayLoadPdPhysAddr = NULL; -UINT64 PayLoadPdPtPhysAddr = NULL; - UINT32 PayLoadSize(VOID) { EFI_IMAGE_DOS_HEADER* RecordDosImageHeader = PayLoad; @@ -38,6 +30,48 @@ VOID* PayLoadEntry(VOID* ModuleBase) return (UINT64)ModuleBase + RecordNtHeaders->OptionalHeader.AddressOfEntryPoint; } +// programmed by: hMihaiDavid +// taken from: https://github.com/hMihaiDavid/addscn/blob/master/addscn/addscn.cpp#L89 +VOID* AddSection(VOID* ImageBase, CHAR8* SectionName, UINT32 VirtualSize, UINT32 Characteristics) +{ + EFI_IMAGE_DOS_HEADER* dosHeader = (EFI_IMAGE_DOS_HEADER*)ImageBase; + EFI_IMAGE_NT_HEADERS64* ntHeaders = (EFI_IMAGE_NT_HEADERS64*)((UINT64)ImageBase + dosHeader->e_lfanew); + + UINT16 sizeOfOptionalHeader = ntHeaders->FileHeader.SizeOfOptionalHeader; + EFI_IMAGE_FILE_HEADER* fileHeader = &(ntHeaders->FileHeader); + + EFI_IMAGE_SECTION_HEADER* firstSectionHeader = + (EFI_IMAGE_SECTION_HEADER*)(((UINT64)fileHeader) + + sizeof(EFI_IMAGE_FILE_HEADER) + sizeOfOptionalHeader); + + UINT32 numberOfSections = ntHeaders->FileHeader.NumberOfSections; + UINT32 sectionAlignment = ntHeaders->OptionalHeader.SectionAlignment; + UINT32 fileAlignment = ntHeaders->OptionalHeader.FileAlignment; + + EFI_IMAGE_SECTION_HEADER* newSectionHeader = &firstSectionHeader[numberOfSections]; + EFI_IMAGE_SECTION_HEADER* lastSectionHeader = &firstSectionHeader[numberOfSections - 1]; + + MemCopy(&newSectionHeader->Name, SectionName, AsciiStrLen(SectionName)); + newSectionHeader->Misc.VirtualSize = VirtualSize; + newSectionHeader->VirtualAddress = + P2ALIGNUP(lastSectionHeader->VirtualAddress + + lastSectionHeader->Misc.VirtualSize, sectionAlignment); + + newSectionHeader->SizeOfRawData = P2ALIGNUP(VirtualSize, fileAlignment); + newSectionHeader->Characteristics = Characteristics; + + newSectionHeader->PointerToRawData = + (UINT32)(lastSectionHeader->PointerToRawData + + lastSectionHeader->SizeOfRawData); + + ++ntHeaders->FileHeader.NumberOfSections; + ntHeaders->OptionalHeader.SizeOfImage = + P2ALIGNUP(newSectionHeader->VirtualAddress + + newSectionHeader->Misc.VirtualSize, sectionAlignment); + + return ((UINT64)ImageBase) + newSectionHeader->VirtualAddress; +} + EFI_STATUS LoadPayLoadFromDisk(VOID** PayLoadBufferPtr) { EFI_STATUS Result = EFI_SUCCESS; diff --git a/Voyager/Voyager/PayLoad.h b/Voyager/Voyager/PayLoad.h index 2e791a0..bf73b5a 100644 --- a/Voyager/Voyager/PayLoad.h +++ b/Voyager/Voyager/PayLoad.h @@ -3,14 +3,22 @@ #include "PagingTables.h" #include -extern VOID* PayLoad; -extern PPTE_T PayLoadPt; -extern PPDE_T PayLoadPd; -extern PPDPTE_T PayLoadPdPt; -extern UINT64 PayLoadPtPhysAddr; -extern UINT64 PayLoadPdPhysAddr; -extern UINT64 PayLoadPdPtPhysAddr; +#define NT_HEADER(x) ((EFI_IMAGE_NT_HEADERS64*)(((UINT64)(x)) + ((EFI_IMAGE_DOS_HEADER*)(x))->e_lfanew)) + +#define SECTION_RWX ((EFI_IMAGE_SCN_MEM_WRITE | \ + EFI_IMAGE_SCN_CNT_CODE | \ + EFI_IMAGE_SCN_CNT_UNINITIALIZED_DATA | \ + EFI_IMAGE_SCN_MEM_EXECUTE | \ + EFI_IMAGE_SCN_CNT_INITIALIZED_DATA | \ + EFI_IMAGE_SCN_MEM_READ)) +// Source: https://blogs.oracle.com/jwadams/macros-and-powers-of-two +// align x down to the nearest multiple of align. align must be a power of 2. +#define P2ALIGNDOWN(x, align) ((x) & -(align)) +// align x up to the nearest multiple of align. align must be a power of 2. +#define P2ALIGNUP(x, align) (-(-(x) & -(align))) + +extern VOID* PayLoad; #pragma pack(push, 1) typedef struct _VOYAGER_T { @@ -26,5 +34,6 @@ typedef struct _VOYAGER_T #define PAYLOAD_PATH L"\\efi\\microsoft\\boot\\payload.dll" UINT32 PayLoadSize(VOID); +VOID* PayLoadEntry(VOID* ModuleBase); EFI_STATUS LoadPayLoadFromDisk(VOID** PayLoadBufferPtr); -VOID* PayLoadEntry(VOID* ModuleBase); \ No newline at end of file +VOID* AddSection(VOID* ImageBase, CHAR8* SectionName, UINT32 VirtualSize, UINT32 Characteristics); \ No newline at end of file diff --git a/Voyager/Voyager/ShitHook.h b/Voyager/Voyager/ShitHook.h deleted file mode 100644 index 2ae77e2..0000000 --- a/Voyager/Voyager/ShitHook.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once -#include "Utils.h" - -typedef struct _SHITHOOK -{ - unsigned char Code[14]; - unsigned char JmpCode[14]; - - void* Address; - void* HookAddress; -} SHITHOOK, *PSHITHOOK; - -VOID MakeShitHook(PSHITHOOK Hook, VOID* HookFrom, VOID* HookTo, BOOLEAN Install); -VOID EnableShitHook(PSHITHOOK Hook); -VOID DisableShitHook(PSHITHOOK Hook); \ No newline at end of file diff --git a/Voyager/Voyager/Utils.h b/Voyager/Voyager/Utils.h index 969cee6..c965081 100644 --- a/Voyager/Voyager/Utils.h +++ b/Voyager/Voyager/Utils.h @@ -17,6 +17,7 @@ #define SEC_TO_MS(seconds) seconds * 1000000 #define SECTION_RWX (EFI_IMAGE_SCN_MEM_READ | EFI_IMAGE_SCN_MEM_WRITE | EFI_IMAGE_SCN_MEM_EXECUTE) +void __outdword(unsigned short, unsigned long); VOID __outbytestring(UINT16 Port, UINT8* Buffer, UINT32 Count); void __outbyte(unsigned short Port, unsigned char Data); #pragma intrinsic(__outbytestring) diff --git a/Voyager/Voyager/Voyager.vcxproj b/Voyager/Voyager/Voyager.vcxproj index 0b8e642..93f2ba6 100644 --- a/Voyager/Voyager/Voyager.vcxproj +++ b/Voyager/Voyager/Voyager.vcxproj @@ -271,6 +271,9 @@ UefiHiiLib.lib;UefiHiiServicesLib.lib;UefiSortLib.lib;UefiShellLib.lib;GlueLib.lib;BaseLib.lib;BaseDebugPrintErrorLevelLib.lib;BasePrintLib.lib;UefiLib.lib;UefiBootServicesTableLib.lib;UefiRuntimeServicesTableLib.lib;UefiDevicePathLibDevicePathProtocol.lib;UefiDebugLibConOut.lib;UefiMemoryLib.lib;UefiMemoryAllocationLib.lib;BaseSynchronizationLib.lib;UefiFileHandleLib.lib;UefiApplicationEntryPoint.lib true EfiMain + true + Voyager.map + true true @@ -300,6 +303,9 @@ UefiHiiLib.lib;UefiHiiServicesLib.lib;UefiSortLib.lib;UefiShellLib.lib;GlueLib.lib;BaseLib.lib;BaseDebugPrintErrorLevelLib.lib;BasePrintLib.lib;UefiLib.lib;UefiBootServicesTableLib.lib;UefiRuntimeServicesTableLib.lib;UefiDevicePathLibDevicePathProtocol.lib;UefiDebugLibConOut.lib;UefiMemoryLib.lib;UefiMemoryAllocationLib.lib;BaseSynchronizationLib.lib;UefiFileHandleLib.lib;UefiApplicationEntryPoint.lib true EfiMain + true + Voyager.map + true true @@ -329,6 +335,9 @@ UefiHiiLib.lib;UefiHiiServicesLib.lib;UefiSortLib.lib;UefiShellLib.lib;GlueLib.lib;BaseLib.lib;BaseDebugPrintErrorLevelLib.lib;BasePrintLib.lib;UefiLib.lib;UefiBootServicesTableLib.lib;UefiRuntimeServicesTableLib.lib;UefiDevicePathLibDevicePathProtocol.lib;UefiDebugLibConOut.lib;UefiMemoryLib.lib;UefiMemoryAllocationLib.lib;BaseSynchronizationLib.lib;UefiFileHandleLib.lib;UefiApplicationEntryPoint.lib true EfiMain + true + Voyager.map + true true @@ -358,6 +367,9 @@ UefiHiiLib.lib;UefiHiiServicesLib.lib;UefiSortLib.lib;UefiShellLib.lib;GlueLib.lib;BaseLib.lib;BaseDebugPrintErrorLevelLib.lib;BasePrintLib.lib;UefiLib.lib;UefiBootServicesTableLib.lib;UefiRuntimeServicesTableLib.lib;UefiDevicePathLibDevicePathProtocol.lib;UefiDebugLibConOut.lib;UefiMemoryLib.lib;UefiMemoryAllocationLib.lib;BaseSynchronizationLib.lib;UefiFileHandleLib.lib;UefiApplicationEntryPoint.lib true EfiMain + true + Voyager.map + true true @@ -387,6 +399,9 @@ UefiHiiLib.lib;UefiHiiServicesLib.lib;UefiSortLib.lib;UefiShellLib.lib;GlueLib.lib;BaseLib.lib;BaseDebugPrintErrorLevelLib.lib;BasePrintLib.lib;UefiLib.lib;UefiBootServicesTableLib.lib;UefiRuntimeServicesTableLib.lib;UefiDevicePathLibDevicePathProtocol.lib;UefiDebugLibConOut.lib;UefiMemoryLib.lib;UefiMemoryAllocationLib.lib;BaseSynchronizationLib.lib;UefiFileHandleLib.lib;UefiApplicationEntryPoint.lib true EfiMain + true + Voyager.map + true true @@ -416,6 +431,9 @@ UefiHiiLib.lib;UefiHiiServicesLib.lib;UefiSortLib.lib;UefiShellLib.lib;GlueLib.lib;BaseLib.lib;BaseDebugPrintErrorLevelLib.lib;BasePrintLib.lib;UefiLib.lib;UefiBootServicesTableLib.lib;UefiRuntimeServicesTableLib.lib;UefiDevicePathLibDevicePathProtocol.lib;UefiDebugLibConOut.lib;UefiMemoryLib.lib;UefiMemoryAllocationLib.lib;BaseSynchronizationLib.lib;UefiFileHandleLib.lib;UefiApplicationEntryPoint.lib true EfiMain + true + Voyager.map + true true @@ -445,6 +463,9 @@ UefiHiiLib.lib;UefiHiiServicesLib.lib;UefiSortLib.lib;UefiShellLib.lib;GlueLib.lib;BaseLib.lib;BaseDebugPrintErrorLevelLib.lib;BasePrintLib.lib;UefiLib.lib;UefiBootServicesTableLib.lib;UefiRuntimeServicesTableLib.lib;UefiDevicePathLibDevicePathProtocol.lib;UefiDebugLibConOut.lib;UefiMemoryLib.lib;UefiMemoryAllocationLib.lib;BaseSynchronizationLib.lib;UefiFileHandleLib.lib;UefiApplicationEntryPoint.lib true EfiMain + true + Voyager.map + true true @@ -474,6 +495,9 @@ UefiHiiLib.lib;UefiHiiServicesLib.lib;UefiSortLib.lib;UefiShellLib.lib;GlueLib.lib;BaseLib.lib;BaseDebugPrintErrorLevelLib.lib;BasePrintLib.lib;UefiLib.lib;UefiBootServicesTableLib.lib;UefiRuntimeServicesTableLib.lib;UefiDevicePathLibDevicePathProtocol.lib;UefiDebugLibConOut.lib;UefiMemoryLib.lib;UefiMemoryAllocationLib.lib;BaseSynchronizationLib.lib;UefiFileHandleLib.lib;UefiApplicationEntryPoint.lib true EfiMain + true + Voyager.map + true true @@ -503,6 +527,9 @@ UefiHiiLib.lib;UefiHiiServicesLib.lib;UefiSortLib.lib;UefiShellLib.lib;GlueLib.lib;BaseLib.lib;BaseDebugPrintErrorLevelLib.lib;BasePrintLib.lib;UefiLib.lib;UefiBootServicesTableLib.lib;UefiRuntimeServicesTableLib.lib;UefiDevicePathLibDevicePathProtocol.lib;UefiDebugLibConOut.lib;UefiMemoryLib.lib;UefiMemoryAllocationLib.lib;BaseSynchronizationLib.lib;UefiFileHandleLib.lib;UefiApplicationEntryPoint.lib true EfiMain + true + Voyager.map + true true @@ -532,6 +559,10 @@ UefiHiiLib.lib;UefiHiiServicesLib.lib;UefiSortLib.lib;UefiShellLib.lib;GlueLib.lib;BaseLib.lib;BaseDebugPrintErrorLevelLib.lib;BasePrintLib.lib;UefiLib.lib;UefiBootServicesTableLib.lib;UefiRuntimeServicesTableLib.lib;UefiDevicePathLibDevicePathProtocol.lib;UefiDebugLibConOut.lib;UefiMemoryLib.lib;UefiMemoryAllocationLib.lib;BaseSynchronizationLib.lib;UefiFileHandleLib.lib;UefiApplicationEntryPoint.lib true EfiMain + true + + + true true @@ -541,7 +572,7 @@ - + @@ -553,7 +584,7 @@ - + diff --git a/Voyager/Voyager/Voyager.vcxproj.filters b/Voyager/Voyager/Voyager.vcxproj.filters index dcaf7bc..929c672 100644 --- a/Voyager/Voyager/Voyager.vcxproj.filters +++ b/Voyager/Voyager/Voyager.vcxproj.filters @@ -20,9 +20,6 @@ Source Files - - Source Files - Source Files @@ -38,6 +35,9 @@ Source Files + + Source Files + @@ -46,9 +46,6 @@ Header Files - - Header Files - Header Files @@ -67,5 +64,8 @@ Header Files + + Header Files + \ No newline at end of file diff --git a/Voyager/Voyager/WinLoad.c b/Voyager/Voyager/WinLoad.c index 4125d5c..1c32256 100644 --- a/Voyager/Voyager/WinLoad.c +++ b/Voyager/Voyager/WinLoad.c @@ -1,7 +1,7 @@ #include "WinLoad.h" -SHITHOOK WinLoadImageShitHook; -SHITHOOK WinLoadAllocateImageHook; +INLINE_HOOK WinLoadImageShitHook; +INLINE_HOOK WinLoadAllocateImageHook; BOOLEAN HyperVloading = FALSE; BOOLEAN InstalledHvLoaderHook = FALSE; @@ -34,7 +34,7 @@ EFI_STATUS EFIAPI BlLdrLoadImage HyperVloading = TRUE; // disable shithook and call the original function... - DisableShitHook(&WinLoadImageShitHook); + DisableInlineHook(&WinLoadImageShitHook); EFI_STATUS Result = ((LDR_LOAD_IMAGE)WinLoadImageShitHook.Address) ( Arg1, @@ -57,80 +57,41 @@ EFI_STATUS EFIAPI BlLdrLoadImage // continue hooking until we inject/hook into hyper-v... if (!HookedHyperV) - EnableShitHook(&WinLoadImageShitHook); - - if (StrStr(ModulePath, L"hvloader.dll")) - { - PLDR_DATA_TABLE_ENTRY TableEntry = *lplpTableEntry; - VOID* HvlpTransferToHypervisor = - FindPattern( - TableEntry->ModuleBase, - TableEntry->SizeOfImage, - TRANS_TO_HV_SIG, - TRANS_TO_HV_MASK - ); - - MakeShitHook - ( - &TransferControlShitHook, - RESOLVE_RVA(HvlpTransferToHypervisor, 13, 9), - &TransferToHyperV, - TRUE - ); - } + EnableInlineHook(&WinLoadImageShitHook); if (!StrCmp(ModuleName, L"hv.exe")) { HookedHyperV = TRUE; + VOYAGER_T VoyagerData; PLDR_DATA_TABLE_ENTRY TableEntry = *lplpTableEntry; - EFI_IMAGE_DOS_HEADER* HypervDosHeader = TableEntry->ModuleBase; - if (HypervDosHeader->e_magic != EFI_IMAGE_DOS_SIGNATURE) - return Result; - - EFI_IMAGE_NT_HEADERS64* HypervNtHeader = (UINT64)HypervDosHeader + HypervDosHeader->e_lfanew; - if (HypervNtHeader->Signature != EFI_IMAGE_NT_SIGNATURE) - return Result; - - EFI_IMAGE_SECTION_HEADER* pSection = ((UINT64)&HypervNtHeader->OptionalHeader) + - HypervNtHeader->FileHeader.SizeOfOptionalHeader; - - for (UINT16 idx = 0; idx < HypervNtHeader->FileHeader.NumberOfSections; ++idx, ++pSection) - { - if (!AsciiStrCmp(&pSection->Name, ".reloc")) - { - VOYAGER_T VoyagerData; - // - // the payload's base address needs to be page aligned in - // order for the paging table sections to be page aligned... - // - UINT32 PageRemainder = (0x1000 - (((TableEntry->ModuleBase + pSection->VirtualAddress + pSection->Misc.VirtualSize) << 52) >> 52)); - MakeVoyagerData - ( - &VoyagerData, - TableEntry->ModuleBase, - TableEntry->SizeOfImage, - TableEntry->ModuleBase + pSection->VirtualAddress + pSection->Misc.VirtualSize + PageRemainder, - PayLoadSize() - ); - - HookVmExit - ( - VoyagerData.HypervModuleBase, - VoyagerData.HypervModuleSize, - MapModule(&VoyagerData, PayLoad) - ); + // add a new section to hyper-v called "payload", then fill in voyager data + // and hook the vmexit handler... + MakeVoyagerData + ( + &VoyagerData, + TableEntry->ModuleBase, + TableEntry->SizeOfImage, + AddSection + ( + TableEntry->ModuleBase, + "payload", + PayLoadSize(), + SECTION_RWX + ), + PayLoadSize() + ); - // make the .reloc section RWX and increase the sections size... - pSection->Characteristics = SECTION_RWX; - pSection->Misc.VirtualSize += PayLoadSize(); - } - } + HookVmExit + ( + VoyagerData.HypervModuleBase, + VoyagerData.HypervModuleSize, + MapModule(&VoyagerData, PayLoad) + ); // extend the size of the image in hyper-v's nt headers and LDR data entry... // this is required, if this is not done, then hyper-v will simply not be loaded... - HypervNtHeader->OptionalHeader.SizeOfImage += PayLoadSize(); - TableEntry->SizeOfImage += PayLoadSize(); + TableEntry->SizeOfImage = NT_HEADER(TableEntry->ModuleBase)->OptionalHeader.SizeOfImage; } return Result; } @@ -154,7 +115,7 @@ EFI_STATUS EFIAPI BlImgLoadPEImageEx ) { // disable shithook and call the original function... - DisableShitHook(&WinLoadImageShitHook); + DisableInlineHook(&WinLoadImageShitHook); EFI_STATUS Result = ((LDR_LOAD_IMAGE)WinLoadImageShitHook.Address) ( a1, @@ -175,7 +136,7 @@ EFI_STATUS EFIAPI BlImgLoadPEImageEx // continue hooking BlImgLoadPEImageEx until we have shithooked hvloader... if (!InstalledHvLoaderHook) - EnableShitHook(&WinLoadImageShitHook); + EnableInlineHook(&WinLoadImageShitHook); if (StrStr(ImagePath, L"hvloader.efi")) { @@ -207,11 +168,12 @@ EFI_STATUS EFIAPI BlImgLoadPEImageEx ); #if WINVER == 1703 - MakeShitHook(&HvLoadImageBufferHook, RESOLVE_RVA(LoadImage, 5, 1), &HvBlImgLoadPEImageFromSourceBuffer, TRUE); + MakeInlineHook(&HvLoadImageBufferHook, RESOLVE_RVA(LoadImage, 5, 1), &HvBlImgLoadPEImageFromSourceBuffer, TRUE); #elif WINVER <= 1607 - MakeShitHook(&HvLoadImageHook, RESOLVE_RVA(LoadImage, 10, 6), &HvBlImgLoadPEImageEx, TRUE); + MakeInlineHook(&HvLoadImageHook, RESOLVE_RVA(LoadImage, 10, 6), &HvBlImgLoadPEImageEx, TRUE); #endif - MakeShitHook(&HvLoadAllocImageHook, RESOLVE_RVA(AllocImage, 5, 1), &HvBlImgAllocateImageBuffer, TRUE); + + MakeInlineHook(&HvLoadAllocImageHook, RESOLVE_RVA(AllocImage, 5, 1), &HvBlImgAllocateImageBuffer, TRUE); InstalledHvLoaderHook = TRUE; } return Result; @@ -248,7 +210,7 @@ UINT64 EFIAPI BlImgAllocateImageBuffer } // disable shithook and call the original function... - DisableShitHook(&WinLoadAllocateImageHook); + DisableInlineHook(&WinLoadAllocateImageHook); UINT64 Result = ((ALLOCATE_IMAGE_BUFFER)WinLoadAllocateImageHook.Address) ( imageBuffer, @@ -261,7 +223,7 @@ UINT64 EFIAPI BlImgAllocateImageBuffer // keep hooking until we extend an allocation... if(!ExtendedAllocation) - EnableShitHook(&WinLoadAllocateImageHook); + EnableInlineHook(&WinLoadAllocateImageHook); return Result; } \ No newline at end of file diff --git a/Voyager/Voyager/WinLoad.h b/Voyager/Voyager/WinLoad.h index 1c1377f..b5a2456 100644 --- a/Voyager/Voyager/WinLoad.h +++ b/Voyager/Voyager/WinLoad.h @@ -1,8 +1,9 @@ #pragma once #include "HvLoader.h" +#include "PayLoad.h" -extern SHITHOOK WinLoadImageShitHook; -extern SHITHOOK WinLoadAllocateImageHook; +extern INLINE_HOOK WinLoadImageShitHook; +extern INLINE_HOOK WinLoadAllocateImageHook; // 2004-1511 winload.BlImgAllocateImageBuffer #define ALLOCATE_IMAGE_BUFFER_SIG "\xE8\x00\x00\x00\x00\x8B\xD8\x85\xC0\x78\x7C\x21\x7C\x24\x00\x45\x33\xC0" @@ -16,12 +17,6 @@ extern SHITHOOK WinLoadAllocateImageHook; #define LOAD_PE_IMG_SIG "\x48\x89\x44\x24\x00\xE8\x00\x00\x00\x00\x44\x8B\xF0\x85\xC0\x79\x11" #define LOAD_PE_IMG_MASK "xxxx?x????xxxxxxx" -// 1703-1511 -// -// winload.HvlpTransferToHypervisor is used to transfer control to hyper-v... -// on 2004-1709, this function is going to be inside of hvloader.dll... -#define TRANS_TO_HV_SIG "\x48\x8B\x51\x10\x48\x8B\x49\x18\xE8" -#define TRANS_TO_HV_MASK "xxxxxxxxx" static_assert(sizeof(ALLOCATE_IMAGE_BUFFER_SIG) == sizeof(ALLOCATE_IMAGE_BUFFER_MASK), "signature and mask do not match size!"); typedef UINT64 (EFIAPI* ALLOCATE_IMAGE_BUFFER)(VOID** imageBuffer, UINTN imageSize, UINT32 memoryType, diff --git a/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi10.h b/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi10.h index e292227..b9b9904 100644 --- a/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi10.h +++ b/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi10.h @@ -397,7 +397,7 @@ typedef struct { UINT64 Signature; UINT8 Checksum; UINT8 OemId[6]; - UINT8 Reserved; + UINT8 reserved; UINT32 RsdtAddress; } EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER; @@ -491,7 +491,7 @@ typedef struct { UINT32 FirmwareWakingVector; UINT32 GlobalLock; UINT32 Flags; - UINT8 Reserved[40]; + UINT8 reserved[40]; } EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE; /// @@ -559,7 +559,7 @@ typedef struct { UINT8 Type; UINT8 Length; UINT8 IoApicId; - UINT8 Reserved; + UINT8 reserved; UINT32 IoApicAddress; UINT32 SystemVectorBase; } EFI_ACPI_1_0_IO_APIC_STRUCTURE; diff --git a/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi20.h b/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi20.h index 8ee1f7f..5f28094 100644 --- a/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi20.h +++ b/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi20.h @@ -54,7 +54,7 @@ typedef struct { UINT8 AddressSpaceId; UINT8 RegisterBitWidth; UINT8 RegisterBitOffset; - UINT8 Reserved; + UINT8 reserved; UINT64 Address; } EFI_ACPI_2_0_GENERIC_ADDRESS_STRUCTURE; @@ -84,7 +84,7 @@ typedef struct { UINT32 Length; UINT64 XsdtAddress; UINT8 ExtendedChecksum; - UINT8 Reserved[3]; + UINT8 reserved[3]; } EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER; /// @@ -235,7 +235,7 @@ typedef struct { UINT32 Flags; UINT64 XFirmwareWakingVector; UINT8 Version; - UINT8 Reserved[31]; + UINT8 reserved[31]; } EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE; /// @@ -312,7 +312,7 @@ typedef struct { UINT8 Type; UINT8 Length; UINT8 IoApicId; - UINT8 Reserved; + UINT8 reserved; UINT32 IoApicAddress; UINT32 GlobalSystemInterruptBase; } EFI_ACPI_2_0_IO_APIC_STRUCTURE; @@ -356,7 +356,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT16 Reserved; + UINT16 reserved; UINT64 LocalApicAddress; } EFI_ACPI_2_0_LOCAL_APIC_ADDRESS_OVERRIDE_STRUCTURE; @@ -367,7 +367,7 @@ typedef struct { UINT8 Type; UINT8 Length; UINT8 IoApicId; - UINT8 Reserved; + UINT8 reserved; UINT32 GlobalSystemInterruptBase; UINT64 IoSapicAddress; } EFI_ACPI_2_0_IO_SAPIC_STRUCTURE; @@ -381,7 +381,7 @@ typedef struct { UINT8 AcpiProcessorId; UINT8 LocalSapicId; UINT8 LocalSapicEid; - UINT8 Reserved[3]; + UINT8 reserved[3]; UINT32 Flags; } EFI_ACPI_2_0_PROCESSOR_LOCAL_SAPIC_STRUCTURE; @@ -397,7 +397,7 @@ typedef struct { UINT8 ProcessorEid; UINT8 IoSapicVector; UINT32 GlobalSystemInterrupt; - UINT32 Reserved; + UINT32 reserved; } EFI_ACPI_2_0_PLATFORM_INTERRUPT_SOURCES_STRUCTURE; /// diff --git a/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi30.h b/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi30.h index 608968d..2504345 100644 --- a/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi30.h +++ b/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi30.h @@ -37,7 +37,7 @@ typedef PACKED struct { UINT8 GenFlag; UINT8 SpecificFlag; UINT8 RevisionId; - UINT8 Reserved; + UINT8 reserved; UINT64 AddrSpaceGranularity; UINT64 AddrRangeMin; UINT64 AddrRangeMax; @@ -109,7 +109,7 @@ typedef struct { UINT32 Length; UINT64 XsdtAddress; UINT8 ExtendedChecksum; - UINT8 Reserved[3]; + UINT8 reserved[3]; } EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER; /// @@ -270,7 +270,7 @@ typedef struct { UINT32 Flags; UINT64 XFirmwareWakingVector; UINT8 Version; - UINT8 Reserved[31]; + UINT8 reserved[31]; } EFI_ACPI_3_0_FIRMWARE_ACPI_CONTROL_STRUCTURE; /// @@ -357,7 +357,7 @@ typedef struct { UINT8 Type; UINT8 Length; UINT8 IoApicId; - UINT8 Reserved; + UINT8 reserved; UINT32 IoApicAddress; UINT32 GlobalSystemInterruptBase; } EFI_ACPI_3_0_IO_APIC_STRUCTURE; @@ -388,7 +388,7 @@ typedef struct { UINT32 GlobalSystemInterrupt; UINT32 PlatformInterruptSourceFlags; UINT8 CpeiProcessorOverride; - UINT8 Reserved[31]; + UINT8 reserved[31]; } EFI_ACPI_3_0_PLATFORM_INTERRUPT_APIC_STRUCTURE; // @@ -425,7 +425,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT16 Reserved; + UINT16 reserved; UINT64 LocalApicAddress; } EFI_ACPI_3_0_LOCAL_APIC_ADDRESS_OVERRIDE_STRUCTURE; @@ -436,7 +436,7 @@ typedef struct { UINT8 Type; UINT8 Length; UINT8 IoApicId; - UINT8 Reserved; + UINT8 reserved; UINT32 GlobalSystemInterruptBase; UINT64 IoSapicAddress; } EFI_ACPI_3_0_IO_SAPIC_STRUCTURE; @@ -451,7 +451,7 @@ typedef struct { UINT8 AcpiProcessorId; UINT8 LocalSapicId; UINT8 LocalSapicEid; - UINT8 Reserved[3]; + UINT8 reserved[3]; UINT32 Flags; UINT32 ACPIProcessorUIDValue; } EFI_ACPI_3_0_PROCESSOR_LOCAL_SAPIC_STRUCTURE; @@ -544,7 +544,7 @@ typedef struct { UINT32 Flags; UINT8 LocalSapicEid; UINT8 ProximityDomain31To8[3]; - UINT8 Reserved[4]; + UINT8 reserved[4]; } EFI_ACPI_3_0_PROCESSOR_LOCAL_APIC_SAPIC_AFFINITY_STRUCTURE; /// diff --git a/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi40.h b/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi40.h index fafafa4..53217d1 100644 --- a/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi40.h +++ b/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi40.h @@ -67,7 +67,7 @@ typedef struct { UINT32 Length; UINT64 XsdtAddress; UINT8 ExtendedChecksum; - UINT8 Reserved[3]; + UINT8 reserved[3]; } EFI_ACPI_4_0_ROOT_SYSTEM_DESCRIPTION_POINTER; /// @@ -326,7 +326,7 @@ typedef struct { UINT8 Type; UINT8 Length; UINT8 IoApicId; - UINT8 Reserved; + UINT8 reserved; UINT32 IoApicAddress; UINT32 GlobalSystemInterruptBase; } EFI_ACPI_4_0_IO_APIC_STRUCTURE; @@ -357,7 +357,7 @@ typedef struct { UINT32 GlobalSystemInterrupt; UINT32 PlatformInterruptSourceFlags; UINT8 CpeiProcessorOverride; - UINT8 Reserved[31]; + UINT8 reserved[31]; } EFI_ACPI_4_0_PLATFORM_INTERRUPT_APIC_STRUCTURE; // @@ -394,7 +394,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT16 Reserved; + UINT16 reserved; UINT64 LocalApicAddress; } EFI_ACPI_4_0_LOCAL_APIC_ADDRESS_OVERRIDE_STRUCTURE; @@ -405,7 +405,7 @@ typedef struct { UINT8 Type; UINT8 Length; UINT8 IoApicId; - UINT8 Reserved; + UINT8 reserved; UINT32 GlobalSystemInterruptBase; UINT64 IoSapicAddress; } EFI_ACPI_4_0_IO_SAPIC_STRUCTURE; @@ -420,7 +420,7 @@ typedef struct { UINT8 AcpiProcessorId; UINT8 LocalSapicId; UINT8 LocalSapicEid; - UINT8 Reserved[3]; + UINT8 reserved[3]; UINT32 Flags; UINT32 ACPIProcessorUIDValue; } EFI_ACPI_4_0_PROCESSOR_LOCAL_SAPIC_STRUCTURE; @@ -452,7 +452,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT8 Reserved[2]; + UINT8 reserved[2]; UINT32 X2ApicId; UINT32 Flags; UINT32 AcpiProcessorUid; @@ -467,7 +467,7 @@ typedef struct { UINT16 Flags; UINT32 AcpiProcessorUid; UINT8 LocalX2ApicLint; - UINT8 Reserved[3]; + UINT8 reserved[3]; } EFI_ACPI_4_0_LOCAL_X2APIC_NMI_STRUCTURE; /// @@ -603,7 +603,7 @@ typedef struct { /// typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; - UINT8 Reserved[8]; + UINT8 reserved[8]; } EFI_ACPI_4_0_CORRECTED_PLATFORM_ERROR_POLLING_TABLE_HEADER; /// @@ -678,7 +678,7 @@ typedef struct { UINT32 MultipleUncorrectableErrors:1; UINT32 MultipleCorrectableErrors:1; UINT32 ErrorDataEntryCount:10; - UINT32 Reserved:18; + UINT32 reserved:18; } EFI_ACPI_4_0_ERROR_BLOCK_STATUS; /// @@ -807,7 +807,7 @@ typedef struct { UINT16 SwitchToPollingThresholdWindow:1; UINT16 ErrorThresholdValue:1; UINT16 ErrorThresholdWindow:1; - UINT16 Reserved:10; + UINT16 reserved:10; } EFI_ACPI_4_0_HARDWARE_ERROR_NOTIFICATION_CONFIGURATION_WRITE_ENABLE_STRUCTURE; /// diff --git a/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi50.h b/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi50.h index 23f5f3f..9b31c8e 100644 --- a/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi50.h +++ b/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi50.h @@ -189,7 +189,7 @@ typedef struct { UINT32 Length; UINT64 XsdtAddress; UINT8 ExtendedChecksum; - UINT8 Reserved[3]; + UINT8 reserved[3]; } EFI_ACPI_5_0_ROOT_SYSTEM_DESCRIPTION_POINTER; /// @@ -456,7 +456,7 @@ typedef struct { UINT8 Type; UINT8 Length; UINT8 IoApicId; - UINT8 Reserved; + UINT8 reserved; UINT32 IoApicAddress; UINT32 GlobalSystemInterruptBase; } EFI_ACPI_5_0_IO_APIC_STRUCTURE; @@ -487,7 +487,7 @@ typedef struct { UINT32 GlobalSystemInterrupt; UINT32 PlatformInterruptSourceFlags; UINT8 CpeiProcessorOverride; - UINT8 Reserved[31]; + UINT8 reserved[31]; } EFI_ACPI_5_0_PLATFORM_INTERRUPT_APIC_STRUCTURE; // @@ -524,7 +524,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT16 Reserved; + UINT16 reserved; UINT64 LocalApicAddress; } EFI_ACPI_5_0_LOCAL_APIC_ADDRESS_OVERRIDE_STRUCTURE; @@ -535,7 +535,7 @@ typedef struct { UINT8 Type; UINT8 Length; UINT8 IoApicId; - UINT8 Reserved; + UINT8 reserved; UINT32 GlobalSystemInterruptBase; UINT64 IoSapicAddress; } EFI_ACPI_5_0_IO_SAPIC_STRUCTURE; @@ -550,7 +550,7 @@ typedef struct { UINT8 AcpiProcessorId; UINT8 LocalSapicId; UINT8 LocalSapicEid; - UINT8 Reserved[3]; + UINT8 reserved[3]; UINT32 Flags; UINT32 ACPIProcessorUIDValue; } EFI_ACPI_5_0_PROCESSOR_LOCAL_SAPIC_STRUCTURE; @@ -582,7 +582,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT8 Reserved[2]; + UINT8 reserved[2]; UINT32 X2ApicId; UINT32 Flags; UINT32 AcpiProcessorUid; @@ -597,7 +597,7 @@ typedef struct { UINT16 Flags; UINT32 AcpiProcessorUid; UINT8 LocalX2ApicLint; - UINT8 Reserved[3]; + UINT8 reserved[3]; } EFI_ACPI_5_0_LOCAL_X2APIC_NMI_STRUCTURE; /// @@ -606,7 +606,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT16 Reserved; + UINT16 reserved; UINT32 GicId; UINT32 AcpiProcessorUid; UINT32 Flags; @@ -768,7 +768,7 @@ typedef struct { /// typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; - UINT8 Reserved[8]; + UINT8 reserved[8]; } EFI_ACPI_5_0_CORRECTED_PLATFORM_ERROR_POLLING_TABLE_HEADER; /// @@ -885,7 +885,7 @@ typedef struct { typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; UINT8 PlatformCommunicationChannelIdentifier; - UINT8 Reserved[3]; + UINT8 reserved[3]; // Memory Power Node Structure // Memory Power State Characteristics } EFI_ACPI_5_0_MEMORY_POWER_STATUS_TABLE; @@ -933,7 +933,7 @@ typedef struct { typedef struct { UINT8 Flag; - UINT8 Reserved; + UINT8 reserved; UINT16 MemoryPowerNodeId; UINT32 Length; UINT64 AddressBase; @@ -950,7 +950,7 @@ typedef struct { typedef struct { UINT16 MemoryPowerNodeCount; - UINT8 Reserved[2]; + UINT8 reserved[2]; } EFI_ACPI_5_0_MPST_MEMORY_POWER_NODE_TABLE; /// @@ -959,7 +959,7 @@ typedef struct { typedef struct { UINT8 PowerStateStructureID; UINT8 Flag; - UINT16 Reserved; + UINT16 reserved; UINT32 AveragePowerConsumedInMPS0; UINT32 RelativePowerSavingToMPS0; UINT64 ExitLatencyToMPS0; @@ -971,7 +971,7 @@ typedef struct { typedef struct { UINT16 MemoryPowerStateCharacteristicsCount; - UINT8 Reserved[2]; + UINT8 reserved[2]; } EFI_ACPI_5_0_MPST_MEMORY_POWER_STATE_CHARACTERISTICS_TABLE; /// @@ -979,7 +979,7 @@ typedef struct { /// typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; - UINT32 Reserved; + UINT32 reserved; } EFI_ACPI_5_0_MEMORY_TOPOLOGY_TABLE; /// @@ -992,7 +992,7 @@ typedef struct { /// typedef struct { UINT8 Type; - UINT8 Reserved; + UINT8 reserved; UINT16 Length; UINT16 Flags; UINT16 Reserved1; @@ -1011,7 +1011,7 @@ typedef struct { typedef struct { EFI_ACPI_5_0_PMMT_COMMON_MEMORY_AGGREGATOR_DEVICE_STRUCTURE Header; UINT16 SocketIdentifier; - UINT16 Reserved; + UINT16 reserved; //EFI_ACPI_5_0_PMMT_MEMORY_CONTROLLER_MEMORY_AGGREGATOR_DEVICE_STRUCTURE MemoryController[]; } EFI_ACPI_5_0_PMMT_SOCKET_MEMORY_AGGREGATOR_DEVICE_STRUCTURE; @@ -1026,7 +1026,7 @@ typedef struct { UINT32 WriteBandwidth; UINT16 OptimalAccessUnit; UINT16 OptimalAccessAlignment; - UINT16 Reserved; + UINT16 reserved; UINT16 NumberOfProximityDomains; //UINT32 ProximityDomain[NumberOfProximityDomains]; //EFI_ACPI_5_0_PMMT_DIMM_MEMORY_AGGREGATOR_DEVICE_STRUCTURE PhysicalComponent[]; @@ -1038,7 +1038,7 @@ typedef struct { typedef struct { EFI_ACPI_5_0_PMMT_COMMON_MEMORY_AGGREGATOR_DEVICE_STRUCTURE Header; UINT16 PhysicalComponentIdentifier; - UINT16 Reserved; + UINT16 reserved; UINT32 SizeOfDimm; UINT32 SmbiosHandle; } EFI_ACPI_5_0_PMMT_DIMM_MEMORY_AGGREGATOR_DEVICE_STRUCTURE; @@ -1159,7 +1159,7 @@ typedef struct { /// typedef struct { EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_HEADER Header; - UINT32 Reserved; + UINT32 reserved; /// /// 64-bit processor-relative physical address of the Basic Boot Performance Table. /// @@ -1171,7 +1171,7 @@ typedef struct { /// typedef struct { EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_HEADER Header; - UINT32 Reserved; + UINT32 reserved; /// /// 64-bit processor-relative physical address of the S3 Performance Table. /// @@ -1183,7 +1183,7 @@ typedef struct { /// typedef struct { EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_HEADER Header; - UINT32 Reserved; + UINT32 reserved; /// /// Timer value logged at the beginning of firmware image execution. /// This may not always be zero or near zero. @@ -1348,7 +1348,7 @@ typedef struct { UINT32 MultipleUncorrectableErrors:1; UINT32 MultipleCorrectableErrors:1; UINT32 ErrorDataEntryCount:10; - UINT32 Reserved:18; + UINT32 reserved:18; } EFI_ACPI_5_0_ERROR_BLOCK_STATUS; /// @@ -1477,7 +1477,7 @@ typedef struct { UINT16 SwitchToPollingThresholdWindow:1; UINT16 ErrorThresholdValue:1; UINT16 ErrorThresholdWindow:1; - UINT16 Reserved:10; + UINT16 reserved:10; } EFI_ACPI_5_0_HARDWARE_ERROR_NOTIFICATION_CONFIGURATION_WRITE_ENABLE_STRUCTURE; /// @@ -1801,7 +1801,7 @@ typedef struct { typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; UINT32 Flags; - UINT64 Reserved; + UINT64 reserved; } EFI_ACPI_5_0_PLATFORM_COMMUNICATION_CHANNEL_TABLE_HEADER; /// @@ -1833,7 +1833,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT8 Reserved[6]; + UINT8 reserved[6]; UINT64 BaseAddress; UINT64 AddressLength; EFI_ACPI_5_0_GENERIC_ADDRESS_STRUCTURE DoorbellRegister; @@ -1850,7 +1850,7 @@ typedef struct { typedef struct { UINT8 Command; - UINT8 Reserved:7; + UINT8 reserved:7; UINT8 GenerateSci:1; } EFI_ACPI_5_0_PCCT_GENERIC_SHARED_MEMORY_REGION_COMMAND; @@ -1859,7 +1859,7 @@ typedef struct { UINT8 SciDoorbell:1; UINT8 Error:1; UINT8 PlatformNotification:1; - UINT8 Reserved:4; + UINT8 reserved:4; UINT8 Reserved1; } EFI_ACPI_5_0_PCCT_GENERIC_SHARED_MEMORY_REGION_STATUS; diff --git a/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi51.h b/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi51.h index 90f0d98..84a8878 100644 --- a/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi51.h +++ b/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi51.h @@ -70,7 +70,7 @@ typedef struct { UINT32 Length; UINT64 XsdtAddress; UINT8 ExtendedChecksum; - UINT8 Reserved[3]; + UINT8 reserved[3]; } EFI_ACPI_5_1_ROOT_SYSTEM_DESCRIPTION_POINTER; /// @@ -348,7 +348,7 @@ typedef struct { UINT8 Type; UINT8 Length; UINT8 IoApicId; - UINT8 Reserved; + UINT8 reserved; UINT32 IoApicAddress; UINT32 GlobalSystemInterruptBase; } EFI_ACPI_5_1_IO_APIC_STRUCTURE; @@ -379,7 +379,7 @@ typedef struct { UINT32 GlobalSystemInterrupt; UINT32 PlatformInterruptSourceFlags; UINT8 CpeiProcessorOverride; - UINT8 Reserved[31]; + UINT8 reserved[31]; } EFI_ACPI_5_1_PLATFORM_INTERRUPT_APIC_STRUCTURE; // @@ -416,7 +416,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT16 Reserved; + UINT16 reserved; UINT64 LocalApicAddress; } EFI_ACPI_5_1_LOCAL_APIC_ADDRESS_OVERRIDE_STRUCTURE; @@ -427,7 +427,7 @@ typedef struct { UINT8 Type; UINT8 Length; UINT8 IoApicId; - UINT8 Reserved; + UINT8 reserved; UINT32 GlobalSystemInterruptBase; UINT64 IoSapicAddress; } EFI_ACPI_5_1_IO_SAPIC_STRUCTURE; @@ -442,7 +442,7 @@ typedef struct { UINT8 AcpiProcessorId; UINT8 LocalSapicId; UINT8 LocalSapicEid; - UINT8 Reserved[3]; + UINT8 reserved[3]; UINT32 Flags; UINT32 ACPIProcessorUIDValue; } EFI_ACPI_5_1_PROCESSOR_LOCAL_SAPIC_STRUCTURE; @@ -474,7 +474,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT8 Reserved[2]; + UINT8 reserved[2]; UINT32 X2ApicId; UINT32 Flags; UINT32 AcpiProcessorUid; @@ -489,7 +489,7 @@ typedef struct { UINT16 Flags; UINT32 AcpiProcessorUid; UINT8 LocalX2ApicLint; - UINT8 Reserved[3]; + UINT8 reserved[3]; } EFI_ACPI_5_1_LOCAL_X2APIC_NMI_STRUCTURE; /// @@ -498,7 +498,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT16 Reserved; + UINT16 reserved; UINT32 CPUInterfaceNumber; UINT32 AcpiProcessorUid; UINT32 Flags; @@ -567,7 +567,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT16 Reserved; + UINT16 reserved; UINT64 DiscoveryRangeBaseAddress; UINT32 DiscoveryRangeLength; } EFI_ACPI_5_1_GICR_STRUCTURE; @@ -723,7 +723,7 @@ typedef struct { /// typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; - UINT8 Reserved[8]; + UINT8 reserved[8]; } EFI_ACPI_5_1_CORRECTED_PLATFORM_ERROR_POLLING_TABLE_HEADER; /// @@ -840,7 +840,7 @@ typedef struct { typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; UINT8 PlatformCommunicationChannelIdentifier; - UINT8 Reserved[3]; + UINT8 reserved[3]; // Memory Power Node Structure // Memory Power State Characteristics } EFI_ACPI_5_1_MEMORY_POWER_STATUS_TABLE; @@ -888,7 +888,7 @@ typedef struct { typedef struct { UINT8 Flag; - UINT8 Reserved; + UINT8 reserved; UINT16 MemoryPowerNodeId; UINT32 Length; UINT64 AddressBase; @@ -905,7 +905,7 @@ typedef struct { typedef struct { UINT16 MemoryPowerNodeCount; - UINT8 Reserved[2]; + UINT8 reserved[2]; } EFI_ACPI_5_1_MPST_MEMORY_POWER_NODE_TABLE; /// @@ -914,7 +914,7 @@ typedef struct { typedef struct { UINT8 PowerStateStructureID; UINT8 Flag; - UINT16 Reserved; + UINT16 reserved; UINT32 AveragePowerConsumedInMPS0; UINT32 RelativePowerSavingToMPS0; UINT64 ExitLatencyToMPS0; @@ -926,7 +926,7 @@ typedef struct { typedef struct { UINT16 MemoryPowerStateCharacteristicsCount; - UINT8 Reserved[2]; + UINT8 reserved[2]; } EFI_ACPI_5_1_MPST_MEMORY_POWER_STATE_CHARACTERISTICS_TABLE; /// @@ -934,7 +934,7 @@ typedef struct { /// typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; - UINT32 Reserved; + UINT32 reserved; } EFI_ACPI_5_1_MEMORY_TOPOLOGY_TABLE; /// @@ -947,7 +947,7 @@ typedef struct { /// typedef struct { UINT8 Type; - UINT8 Reserved; + UINT8 reserved; UINT16 Length; UINT16 Flags; UINT16 Reserved1; @@ -966,7 +966,7 @@ typedef struct { typedef struct { EFI_ACPI_5_1_PMMT_COMMON_MEMORY_AGGREGATOR_DEVICE_STRUCTURE Header; UINT16 SocketIdentifier; - UINT16 Reserved; + UINT16 reserved; //EFI_ACPI_5_1_PMMT_MEMORY_CONTROLLER_MEMORY_AGGREGATOR_DEVICE_STRUCTURE MemoryController[]; } EFI_ACPI_5_1_PMMT_SOCKET_MEMORY_AGGREGATOR_DEVICE_STRUCTURE; @@ -981,7 +981,7 @@ typedef struct { UINT32 WriteBandwidth; UINT16 OptimalAccessUnit; UINT16 OptimalAccessAlignment; - UINT16 Reserved; + UINT16 reserved; UINT16 NumberOfProximityDomains; //UINT32 ProximityDomain[NumberOfProximityDomains]; //EFI_ACPI_5_1_PMMT_DIMM_MEMORY_AGGREGATOR_DEVICE_STRUCTURE PhysicalComponent[]; @@ -993,7 +993,7 @@ typedef struct { typedef struct { EFI_ACPI_5_1_PMMT_COMMON_MEMORY_AGGREGATOR_DEVICE_STRUCTURE Header; UINT16 PhysicalComponentIdentifier; - UINT16 Reserved; + UINT16 reserved; UINT32 SizeOfDimm; UINT32 SmbiosHandle; } EFI_ACPI_5_1_PMMT_DIMM_MEMORY_AGGREGATOR_DEVICE_STRUCTURE; @@ -1112,7 +1112,7 @@ typedef struct { /// typedef struct { EFI_ACPI_5_1_FPDT_PERFORMANCE_RECORD_HEADER Header; - UINT32 Reserved; + UINT32 reserved; /// /// 64-bit processor-relative physical address of the Basic Boot Performance Table. /// @@ -1124,7 +1124,7 @@ typedef struct { /// typedef struct { EFI_ACPI_5_1_FPDT_PERFORMANCE_RECORD_HEADER Header; - UINT32 Reserved; + UINT32 reserved; /// /// 64-bit processor-relative physical address of the S3 Performance Table. /// @@ -1136,7 +1136,7 @@ typedef struct { /// typedef struct { EFI_ACPI_5_1_FPDT_PERFORMANCE_RECORD_HEADER Header; - UINT32 Reserved; + UINT32 reserved; /// /// Timer value logged at the beginning of firmware image execution. /// This may not always be zero or near zero. @@ -1250,7 +1250,7 @@ typedef struct { typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; UINT64 CntControlBasePhysicalAddress; - UINT32 Reserved; + UINT32 reserved; UINT32 SecurePL1TimerGSIV; UINT32 SecurePL1TimerFlags; UINT32 NonSecurePL1TimerGSIV; @@ -1288,7 +1288,7 @@ typedef struct { typedef struct { UINT8 Type; UINT16 Length; - UINT8 Reserved; + UINT8 reserved; UINT64 CntCtlBase; UINT32 GTBlockTimerCount; UINT32 GTBlockTimerOffset; @@ -1299,7 +1299,7 @@ typedef struct { /// typedef struct { UINT8 GTFrameNumber; - UINT8 Reserved[3]; + UINT8 reserved[3]; UINT64 CntBaseX; UINT64 CntEL0BaseX; UINT32 GTxPhysicalTimerGSIV; @@ -1327,7 +1327,7 @@ typedef struct { typedef struct { UINT8 Type; UINT16 Length; - UINT8 Reserved; + UINT8 reserved; UINT64 RefreshFramePhysicalAddress; UINT64 WatchdogControlFramePhysicalAddress; UINT32 WatchdogTimerGSIV; @@ -1364,7 +1364,7 @@ typedef struct { UINT32 MultipleUncorrectableErrors:1; UINT32 MultipleCorrectableErrors:1; UINT32 ErrorDataEntryCount:10; - UINT32 Reserved:18; + UINT32 reserved:18; } EFI_ACPI_5_1_ERROR_BLOCK_STATUS; /// @@ -1493,7 +1493,7 @@ typedef struct { UINT16 SwitchToPollingThresholdWindow:1; UINT16 ErrorThresholdValue:1; UINT16 ErrorThresholdWindow:1; - UINT16 Reserved:10; + UINT16 reserved:10; } EFI_ACPI_5_1_HARDWARE_ERROR_NOTIFICATION_CONFIGURATION_WRITE_ENABLE_STRUCTURE; /// @@ -1817,7 +1817,7 @@ typedef struct { typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; UINT32 Flags; - UINT64 Reserved; + UINT64 reserved; } EFI_ACPI_5_1_PLATFORM_COMMUNICATION_CHANNEL_TABLE_HEADER; /// @@ -1849,7 +1849,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT8 Reserved[6]; + UINT8 reserved[6]; UINT64 BaseAddress; UINT64 AddressLength; EFI_ACPI_5_1_GENERIC_ADDRESS_STRUCTURE DoorbellRegister; @@ -1866,7 +1866,7 @@ typedef struct { typedef struct { UINT8 Command; - UINT8 Reserved:7; + UINT8 reserved:7; UINT8 GenerateSci:1; } EFI_ACPI_5_1_PCCT_GENERIC_SHARED_MEMORY_REGION_COMMAND; @@ -1875,7 +1875,7 @@ typedef struct { UINT8 SciDoorbell:1; UINT8 Error:1; UINT8 PlatformNotification:1; - UINT8 Reserved:4; + UINT8 reserved:4; UINT8 Reserved1; } EFI_ACPI_5_1_PCCT_GENERIC_SHARED_MEMORY_REGION_STATUS; diff --git a/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi60.h b/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi60.h index 30f1c01..9c9541c 100644 --- a/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi60.h +++ b/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi60.h @@ -69,7 +69,7 @@ typedef struct { UINT32 Length; UINT64 XsdtAddress; UINT8 ExtendedChecksum; - UINT8 Reserved[3]; + UINT8 reserved[3]; } EFI_ACPI_6_0_ROOT_SYSTEM_DESCRIPTION_POINTER; /// @@ -349,7 +349,7 @@ typedef struct { UINT8 Type; UINT8 Length; UINT8 IoApicId; - UINT8 Reserved; + UINT8 reserved; UINT32 IoApicAddress; UINT32 GlobalSystemInterruptBase; } EFI_ACPI_6_0_IO_APIC_STRUCTURE; @@ -380,7 +380,7 @@ typedef struct { UINT32 GlobalSystemInterrupt; UINT32 PlatformInterruptSourceFlags; UINT8 CpeiProcessorOverride; - UINT8 Reserved[31]; + UINT8 reserved[31]; } EFI_ACPI_6_0_PLATFORM_INTERRUPT_APIC_STRUCTURE; // @@ -417,7 +417,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT16 Reserved; + UINT16 reserved; UINT64 LocalApicAddress; } EFI_ACPI_6_0_LOCAL_APIC_ADDRESS_OVERRIDE_STRUCTURE; @@ -428,7 +428,7 @@ typedef struct { UINT8 Type; UINT8 Length; UINT8 IoApicId; - UINT8 Reserved; + UINT8 reserved; UINT32 GlobalSystemInterruptBase; UINT64 IoSapicAddress; } EFI_ACPI_6_0_IO_SAPIC_STRUCTURE; @@ -443,7 +443,7 @@ typedef struct { UINT8 AcpiProcessorId; UINT8 LocalSapicId; UINT8 LocalSapicEid; - UINT8 Reserved[3]; + UINT8 reserved[3]; UINT32 Flags; UINT32 ACPIProcessorUIDValue; } EFI_ACPI_6_0_PROCESSOR_LOCAL_SAPIC_STRUCTURE; @@ -475,7 +475,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT8 Reserved[2]; + UINT8 reserved[2]; UINT32 X2ApicId; UINT32 Flags; UINT32 AcpiProcessorUid; @@ -490,7 +490,7 @@ typedef struct { UINT16 Flags; UINT32 AcpiProcessorUid; UINT8 LocalX2ApicLint; - UINT8 Reserved[3]; + UINT8 reserved[3]; } EFI_ACPI_6_0_LOCAL_X2APIC_NMI_STRUCTURE; /// @@ -499,7 +499,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT16 Reserved; + UINT16 reserved; UINT32 CPUInterfaceNumber; UINT32 AcpiProcessorUid; UINT32 Flags; @@ -570,7 +570,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT16 Reserved; + UINT16 reserved; UINT64 DiscoveryRangeBaseAddress; UINT32 DiscoveryRangeLength; } EFI_ACPI_6_0_GICR_STRUCTURE; @@ -581,7 +581,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT16 Reserved; + UINT16 reserved; UINT32 GicItsId; UINT64 PhysicalBaseAddress; UINT32 Reserved2; @@ -738,7 +738,7 @@ typedef struct { /// typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; - UINT8 Reserved[8]; + UINT8 reserved[8]; } EFI_ACPI_6_0_CORRECTED_PLATFORM_ERROR_POLLING_TABLE_HEADER; /// @@ -855,7 +855,7 @@ typedef struct { typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; UINT8 PlatformCommunicationChannelIdentifier; - UINT8 Reserved[3]; + UINT8 reserved[3]; // Memory Power Node Structure // Memory Power State Characteristics } EFI_ACPI_6_0_MEMORY_POWER_STATUS_TABLE; @@ -903,7 +903,7 @@ typedef struct { typedef struct { UINT8 Flag; - UINT8 Reserved; + UINT8 reserved; UINT16 MemoryPowerNodeId; UINT32 Length; UINT64 AddressBase; @@ -920,7 +920,7 @@ typedef struct { typedef struct { UINT16 MemoryPowerNodeCount; - UINT8 Reserved[2]; + UINT8 reserved[2]; } EFI_ACPI_6_0_MPST_MEMORY_POWER_NODE_TABLE; /// @@ -929,7 +929,7 @@ typedef struct { typedef struct { UINT8 PowerStateStructureID; UINT8 Flag; - UINT16 Reserved; + UINT16 reserved; UINT32 AveragePowerConsumedInMPS0; UINT32 RelativePowerSavingToMPS0; UINT64 ExitLatencyToMPS0; @@ -941,7 +941,7 @@ typedef struct { typedef struct { UINT16 MemoryPowerStateCharacteristicsCount; - UINT8 Reserved[2]; + UINT8 reserved[2]; } EFI_ACPI_6_0_MPST_MEMORY_POWER_STATE_CHARACTERISTICS_TABLE; /// @@ -949,7 +949,7 @@ typedef struct { /// typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; - UINT32 Reserved; + UINT32 reserved; } EFI_ACPI_6_0_MEMORY_TOPOLOGY_TABLE; /// @@ -962,7 +962,7 @@ typedef struct { /// typedef struct { UINT8 Type; - UINT8 Reserved; + UINT8 reserved; UINT16 Length; UINT16 Flags; UINT16 Reserved1; @@ -981,7 +981,7 @@ typedef struct { typedef struct { EFI_ACPI_6_0_PMMT_COMMON_MEMORY_AGGREGATOR_DEVICE_STRUCTURE Header; UINT16 SocketIdentifier; - UINT16 Reserved; + UINT16 reserved; //EFI_ACPI_6_0_PMMT_MEMORY_CONTROLLER_MEMORY_AGGREGATOR_DEVICE_STRUCTURE MemoryController[]; } EFI_ACPI_6_0_PMMT_SOCKET_MEMORY_AGGREGATOR_DEVICE_STRUCTURE; @@ -996,7 +996,7 @@ typedef struct { UINT32 WriteBandwidth; UINT16 OptimalAccessUnit; UINT16 OptimalAccessAlignment; - UINT16 Reserved; + UINT16 reserved; UINT16 NumberOfProximityDomains; //UINT32 ProximityDomain[NumberOfProximityDomains]; //EFI_ACPI_6_0_PMMT_DIMM_MEMORY_AGGREGATOR_DEVICE_STRUCTURE PhysicalComponent[]; @@ -1008,7 +1008,7 @@ typedef struct { typedef struct { EFI_ACPI_6_0_PMMT_COMMON_MEMORY_AGGREGATOR_DEVICE_STRUCTURE Header; UINT16 PhysicalComponentIdentifier; - UINT16 Reserved; + UINT16 reserved; UINT32 SizeOfDimm; UINT32 SmbiosHandle; } EFI_ACPI_6_0_PMMT_DIMM_MEMORY_AGGREGATOR_DEVICE_STRUCTURE; @@ -1127,7 +1127,7 @@ typedef struct { /// typedef struct { EFI_ACPI_6_0_FPDT_PERFORMANCE_RECORD_HEADER Header; - UINT32 Reserved; + UINT32 reserved; /// /// 64-bit processor-relative physical address of the Basic Boot Performance Table. /// @@ -1139,7 +1139,7 @@ typedef struct { /// typedef struct { EFI_ACPI_6_0_FPDT_PERFORMANCE_RECORD_HEADER Header; - UINT32 Reserved; + UINT32 reserved; /// /// 64-bit processor-relative physical address of the S3 Performance Table. /// @@ -1151,7 +1151,7 @@ typedef struct { /// typedef struct { EFI_ACPI_6_0_FPDT_PERFORMANCE_RECORD_HEADER Header; - UINT32 Reserved; + UINT32 reserved; /// /// Timer value logged at the beginning of firmware image execution. /// This may not always be zero or near zero. @@ -1265,7 +1265,7 @@ typedef struct { typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; UINT64 CntControlBasePhysicalAddress; - UINT32 Reserved; + UINT32 reserved; UINT32 SecurePL1TimerGSIV; UINT32 SecurePL1TimerFlags; UINT32 NonSecurePL1TimerGSIV; @@ -1303,7 +1303,7 @@ typedef struct { typedef struct { UINT8 Type; UINT16 Length; - UINT8 Reserved; + UINT8 reserved; UINT64 CntCtlBase; UINT32 GTBlockTimerCount; UINT32 GTBlockTimerOffset; @@ -1314,7 +1314,7 @@ typedef struct { /// typedef struct { UINT8 GTFrameNumber; - UINT8 Reserved[3]; + UINT8 reserved[3]; UINT64 CntBaseX; UINT64 CntEL0BaseX; UINT32 GTxPhysicalTimerGSIV; @@ -1342,7 +1342,7 @@ typedef struct { typedef struct { UINT8 Type; UINT16 Length; - UINT8 Reserved; + UINT8 reserved; UINT64 RefreshFramePhysicalAddress; UINT64 WatchdogControlFramePhysicalAddress; UINT32 WatchdogTimerGSIV; @@ -1361,7 +1361,7 @@ typedef struct { // typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; - UINT32 Reserved; + UINT32 reserved; } EFI_ACPI_6_0_NVDIMM_FIRMWARE_INTERFACE_TABLE; // @@ -1548,7 +1548,7 @@ typedef struct { UINT32 MultipleUncorrectableErrors:1; UINT32 MultipleCorrectableErrors:1; UINT32 ErrorDataEntryCount:10; - UINT32 Reserved:18; + UINT32 reserved:18; } EFI_ACPI_6_0_ERROR_BLOCK_STATUS; /// @@ -1680,7 +1680,7 @@ typedef struct { UINT16 SwitchToPollingThresholdWindow:1; UINT16 ErrorThresholdValue:1; UINT16 ErrorThresholdWindow:1; - UINT16 Reserved:10; + UINT16 reserved:10; } EFI_ACPI_6_0_HARDWARE_ERROR_NOTIFICATION_CONFIGURATION_WRITE_ENABLE_STRUCTURE; /// @@ -2004,7 +2004,7 @@ typedef struct { typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; UINT32 Flags; - UINT64 Reserved; + UINT64 reserved; } EFI_ACPI_6_0_PLATFORM_COMMUNICATION_CHANNEL_TABLE_HEADER; /// @@ -2038,7 +2038,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT8 Reserved[6]; + UINT8 reserved[6]; UINT64 BaseAddress; UINT64 AddressLength; EFI_ACPI_6_0_GENERIC_ADDRESS_STRUCTURE DoorbellRegister; @@ -2055,7 +2055,7 @@ typedef struct { typedef struct { UINT8 Command; - UINT8 Reserved:7; + UINT8 reserved:7; UINT8 GenerateSci:1; } EFI_ACPI_6_0_PCCT_GENERIC_SHARED_MEMORY_REGION_COMMAND; @@ -2064,7 +2064,7 @@ typedef struct { UINT8 SciDoorbell:1; UINT8 Error:1; UINT8 PlatformNotification:1; - UINT8 Reserved:4; + UINT8 reserved:4; UINT8 Reserved1; } EFI_ACPI_6_0_PCCT_GENERIC_SHARED_MEMORY_REGION_STATUS; @@ -2085,7 +2085,7 @@ typedef struct { UINT8 Length; UINT32 DoorbellInterrupt; UINT8 DoorbellInterruptFlags; - UINT8 Reserved; + UINT8 reserved; UINT64 BaseAddress; UINT64 AddressLength; EFI_ACPI_6_0_GENERIC_ADDRESS_STRUCTURE DoorbellRegister; @@ -2104,7 +2104,7 @@ typedef struct { UINT8 Length; UINT32 DoorbellInterrupt; UINT8 DoorbellInterruptFlags; - UINT8 Reserved; + UINT8 reserved; UINT64 BaseAddress; UINT64 AddressLength; EFI_ACPI_6_0_GENERIC_ADDRESS_STRUCTURE DoorbellRegister; diff --git a/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi61.h b/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi61.h index 3cebc68..d9ba04e 100644 --- a/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi61.h +++ b/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi61.h @@ -69,7 +69,7 @@ typedef struct { UINT32 Length; UINT64 XsdtAddress; UINT8 ExtendedChecksum; - UINT8 Reserved[3]; + UINT8 reserved[3]; } EFI_ACPI_6_1_ROOT_SYSTEM_DESCRIPTION_POINTER; /// @@ -349,7 +349,7 @@ typedef struct { UINT8 Type; UINT8 Length; UINT8 IoApicId; - UINT8 Reserved; + UINT8 reserved; UINT32 IoApicAddress; UINT32 GlobalSystemInterruptBase; } EFI_ACPI_6_1_IO_APIC_STRUCTURE; @@ -380,7 +380,7 @@ typedef struct { UINT32 GlobalSystemInterrupt; UINT32 PlatformInterruptSourceFlags; UINT8 CpeiProcessorOverride; - UINT8 Reserved[31]; + UINT8 reserved[31]; } EFI_ACPI_6_1_PLATFORM_INTERRUPT_APIC_STRUCTURE; // @@ -417,7 +417,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT16 Reserved; + UINT16 reserved; UINT64 LocalApicAddress; } EFI_ACPI_6_1_LOCAL_APIC_ADDRESS_OVERRIDE_STRUCTURE; @@ -428,7 +428,7 @@ typedef struct { UINT8 Type; UINT8 Length; UINT8 IoApicId; - UINT8 Reserved; + UINT8 reserved; UINT32 GlobalSystemInterruptBase; UINT64 IoSapicAddress; } EFI_ACPI_6_1_IO_SAPIC_STRUCTURE; @@ -443,7 +443,7 @@ typedef struct { UINT8 AcpiProcessorId; UINT8 LocalSapicId; UINT8 LocalSapicEid; - UINT8 Reserved[3]; + UINT8 reserved[3]; UINT32 Flags; UINT32 ACPIProcessorUIDValue; } EFI_ACPI_6_1_PROCESSOR_LOCAL_SAPIC_STRUCTURE; @@ -475,7 +475,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT8 Reserved[2]; + UINT8 reserved[2]; UINT32 X2ApicId; UINT32 Flags; UINT32 AcpiProcessorUid; @@ -490,7 +490,7 @@ typedef struct { UINT16 Flags; UINT32 AcpiProcessorUid; UINT8 LocalX2ApicLint; - UINT8 Reserved[3]; + UINT8 reserved[3]; } EFI_ACPI_6_1_LOCAL_X2APIC_NMI_STRUCTURE; /// @@ -499,7 +499,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT16 Reserved; + UINT16 reserved; UINT32 CPUInterfaceNumber; UINT32 AcpiProcessorUid; UINT32 Flags; @@ -570,7 +570,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT16 Reserved; + UINT16 reserved; UINT64 DiscoveryRangeBaseAddress; UINT32 DiscoveryRangeLength; } EFI_ACPI_6_1_GICR_STRUCTURE; @@ -581,7 +581,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT16 Reserved; + UINT16 reserved; UINT32 GicItsId; UINT64 PhysicalBaseAddress; UINT32 Reserved2; @@ -738,7 +738,7 @@ typedef struct { /// typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; - UINT8 Reserved[8]; + UINT8 reserved[8]; } EFI_ACPI_6_1_CORRECTED_PLATFORM_ERROR_POLLING_TABLE_HEADER; /// @@ -855,7 +855,7 @@ typedef struct { typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; UINT8 PlatformCommunicationChannelIdentifier; - UINT8 Reserved[3]; + UINT8 reserved[3]; // Memory Power Node Structure // Memory Power State Characteristics } EFI_ACPI_6_1_MEMORY_POWER_STATUS_TABLE; @@ -903,7 +903,7 @@ typedef struct { typedef struct { UINT8 Flag; - UINT8 Reserved; + UINT8 reserved; UINT16 MemoryPowerNodeId; UINT32 Length; UINT64 AddressBase; @@ -920,7 +920,7 @@ typedef struct { typedef struct { UINT16 MemoryPowerNodeCount; - UINT8 Reserved[2]; + UINT8 reserved[2]; } EFI_ACPI_6_1_MPST_MEMORY_POWER_NODE_TABLE; /// @@ -929,7 +929,7 @@ typedef struct { typedef struct { UINT8 PowerStateStructureID; UINT8 Flag; - UINT16 Reserved; + UINT16 reserved; UINT32 AveragePowerConsumedInMPS0; UINT32 RelativePowerSavingToMPS0; UINT64 ExitLatencyToMPS0; @@ -941,7 +941,7 @@ typedef struct { typedef struct { UINT16 MemoryPowerStateCharacteristicsCount; - UINT8 Reserved[2]; + UINT8 reserved[2]; } EFI_ACPI_6_1_MPST_MEMORY_POWER_STATE_CHARACTERISTICS_TABLE; /// @@ -949,7 +949,7 @@ typedef struct { /// typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; - UINT32 Reserved; + UINT32 reserved; } EFI_ACPI_6_1_MEMORY_TOPOLOGY_TABLE; /// @@ -962,7 +962,7 @@ typedef struct { /// typedef struct { UINT8 Type; - UINT8 Reserved; + UINT8 reserved; UINT16 Length; UINT16 Flags; UINT16 Reserved1; @@ -981,7 +981,7 @@ typedef struct { typedef struct { EFI_ACPI_6_1_PMMT_COMMON_MEMORY_AGGREGATOR_DEVICE_STRUCTURE Header; UINT16 SocketIdentifier; - UINT16 Reserved; + UINT16 reserved; //EFI_ACPI_6_1_PMMT_MEMORY_CONTROLLER_MEMORY_AGGREGATOR_DEVICE_STRUCTURE MemoryController[]; } EFI_ACPI_6_1_PMMT_SOCKET_MEMORY_AGGREGATOR_DEVICE_STRUCTURE; @@ -996,7 +996,7 @@ typedef struct { UINT32 WriteBandwidth; UINT16 OptimalAccessUnit; UINT16 OptimalAccessAlignment; - UINT16 Reserved; + UINT16 reserved; UINT16 NumberOfProximityDomains; //UINT32 ProximityDomain[NumberOfProximityDomains]; //EFI_ACPI_6_1_PMMT_DIMM_MEMORY_AGGREGATOR_DEVICE_STRUCTURE PhysicalComponent[]; @@ -1008,7 +1008,7 @@ typedef struct { typedef struct { EFI_ACPI_6_1_PMMT_COMMON_MEMORY_AGGREGATOR_DEVICE_STRUCTURE Header; UINT16 PhysicalComponentIdentifier; - UINT16 Reserved; + UINT16 reserved; UINT32 SizeOfDimm; UINT32 SmbiosHandle; } EFI_ACPI_6_1_PMMT_DIMM_MEMORY_AGGREGATOR_DEVICE_STRUCTURE; @@ -1127,7 +1127,7 @@ typedef struct { /// typedef struct { EFI_ACPI_6_1_FPDT_PERFORMANCE_RECORD_HEADER Header; - UINT32 Reserved; + UINT32 reserved; /// /// 64-bit processor-relative physical address of the Basic Boot Performance Table. /// @@ -1139,7 +1139,7 @@ typedef struct { /// typedef struct { EFI_ACPI_6_1_FPDT_PERFORMANCE_RECORD_HEADER Header; - UINT32 Reserved; + UINT32 reserved; /// /// 64-bit processor-relative physical address of the S3 Performance Table. /// @@ -1151,7 +1151,7 @@ typedef struct { /// typedef struct { EFI_ACPI_6_1_FPDT_PERFORMANCE_RECORD_HEADER Header; - UINT32 Reserved; + UINT32 reserved; /// /// Timer value logged at the beginning of firmware image execution. /// This may not always be zero or near zero. @@ -1265,7 +1265,7 @@ typedef struct { typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; UINT64 CntControlBasePhysicalAddress; - UINT32 Reserved; + UINT32 reserved; UINT32 SecurePL1TimerGSIV; UINT32 SecurePL1TimerFlags; UINT32 NonSecurePL1TimerGSIV; @@ -1303,7 +1303,7 @@ typedef struct { typedef struct { UINT8 Type; UINT16 Length; - UINT8 Reserved; + UINT8 reserved; UINT64 CntCtlBase; UINT32 GTBlockTimerCount; UINT32 GTBlockTimerOffset; @@ -1314,7 +1314,7 @@ typedef struct { /// typedef struct { UINT8 GTFrameNumber; - UINT8 Reserved[3]; + UINT8 reserved[3]; UINT64 CntBaseX; UINT64 CntEL0BaseX; UINT32 GTxPhysicalTimerGSIV; @@ -1342,7 +1342,7 @@ typedef struct { typedef struct { UINT8 Type; UINT16 Length; - UINT8 Reserved; + UINT8 reserved; UINT64 RefreshFramePhysicalAddress; UINT64 WatchdogControlFramePhysicalAddress; UINT32 WatchdogTimerGSIV; @@ -1361,7 +1361,7 @@ typedef struct { // typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; - UINT32 Reserved; + UINT32 reserved; } EFI_ACPI_6_1_NVDIMM_FIRMWARE_INTERFACE_TABLE; // @@ -1554,7 +1554,7 @@ typedef struct { UINT32 MultipleUncorrectableErrors:1; UINT32 MultipleCorrectableErrors:1; UINT32 ErrorDataEntryCount:10; - UINT32 Reserved:18; + UINT32 reserved:18; } EFI_ACPI_6_1_ERROR_BLOCK_STATUS; /// @@ -1691,7 +1691,7 @@ typedef struct { UINT16 SwitchToPollingThresholdWindow:1; UINT16 ErrorThresholdValue:1; UINT16 ErrorThresholdWindow:1; - UINT16 Reserved:10; + UINT16 reserved:10; } EFI_ACPI_6_1_HARDWARE_ERROR_NOTIFICATION_CONFIGURATION_WRITE_ENABLE_STRUCTURE; /// @@ -2036,7 +2036,7 @@ typedef struct { typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; UINT32 Flags; - UINT64 Reserved; + UINT64 reserved; } EFI_ACPI_6_1_PLATFORM_COMMUNICATION_CHANNEL_TABLE_HEADER; /// @@ -2070,7 +2070,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT8 Reserved[6]; + UINT8 reserved[6]; UINT64 BaseAddress; UINT64 AddressLength; EFI_ACPI_6_1_GENERIC_ADDRESS_STRUCTURE DoorbellRegister; @@ -2087,7 +2087,7 @@ typedef struct { typedef struct { UINT8 Command; - UINT8 Reserved:7; + UINT8 reserved:7; UINT8 GenerateSci:1; } EFI_ACPI_6_1_PCCT_GENERIC_SHARED_MEMORY_REGION_COMMAND; @@ -2096,7 +2096,7 @@ typedef struct { UINT8 SciDoorbell:1; UINT8 Error:1; UINT8 PlatformNotification:1; - UINT8 Reserved:4; + UINT8 reserved:4; UINT8 Reserved1; } EFI_ACPI_6_1_PCCT_GENERIC_SHARED_MEMORY_REGION_STATUS; @@ -2117,7 +2117,7 @@ typedef struct { UINT8 Length; UINT32 DoorbellInterrupt; UINT8 DoorbellInterruptFlags; - UINT8 Reserved; + UINT8 reserved; UINT64 BaseAddress; UINT64 AddressLength; EFI_ACPI_6_1_GENERIC_ADDRESS_STRUCTURE DoorbellRegister; @@ -2136,7 +2136,7 @@ typedef struct { UINT8 Length; UINT32 DoorbellInterrupt; UINT8 DoorbellInterruptFlags; - UINT8 Reserved; + UINT8 reserved; UINT64 BaseAddress; UINT64 AddressLength; EFI_ACPI_6_1_GENERIC_ADDRESS_STRUCTURE DoorbellRegister; diff --git a/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi62.h b/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi62.h index 7dcd9ff..4a25d0a 100644 --- a/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi62.h +++ b/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/Acpi62.h @@ -166,7 +166,7 @@ typedef struct { UINT32 Length; UINT64 XsdtAddress; UINT8 ExtendedChecksum; - UINT8 Reserved[3]; + UINT8 reserved[3]; } EFI_ACPI_6_2_ROOT_SYSTEM_DESCRIPTION_POINTER; /// @@ -446,7 +446,7 @@ typedef struct { UINT8 Type; UINT8 Length; UINT8 IoApicId; - UINT8 Reserved; + UINT8 reserved; UINT32 IoApicAddress; UINT32 GlobalSystemInterruptBase; } EFI_ACPI_6_2_IO_APIC_STRUCTURE; @@ -477,7 +477,7 @@ typedef struct { UINT32 GlobalSystemInterrupt; UINT32 PlatformInterruptSourceFlags; UINT8 CpeiProcessorOverride; - UINT8 Reserved[31]; + UINT8 reserved[31]; } EFI_ACPI_6_2_PLATFORM_INTERRUPT_APIC_STRUCTURE; // @@ -514,7 +514,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT16 Reserved; + UINT16 reserved; UINT64 LocalApicAddress; } EFI_ACPI_6_2_LOCAL_APIC_ADDRESS_OVERRIDE_STRUCTURE; @@ -525,7 +525,7 @@ typedef struct { UINT8 Type; UINT8 Length; UINT8 IoApicId; - UINT8 Reserved; + UINT8 reserved; UINT32 GlobalSystemInterruptBase; UINT64 IoSapicAddress; } EFI_ACPI_6_2_IO_SAPIC_STRUCTURE; @@ -540,7 +540,7 @@ typedef struct { UINT8 AcpiProcessorId; UINT8 LocalSapicId; UINT8 LocalSapicEid; - UINT8 Reserved[3]; + UINT8 reserved[3]; UINT32 Flags; UINT32 ACPIProcessorUIDValue; } EFI_ACPI_6_2_PROCESSOR_LOCAL_SAPIC_STRUCTURE; @@ -572,7 +572,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT8 Reserved[2]; + UINT8 reserved[2]; UINT32 X2ApicId; UINT32 Flags; UINT32 AcpiProcessorUid; @@ -587,7 +587,7 @@ typedef struct { UINT16 Flags; UINT32 AcpiProcessorUid; UINT8 LocalX2ApicLint; - UINT8 Reserved[3]; + UINT8 reserved[3]; } EFI_ACPI_6_2_LOCAL_X2APIC_NMI_STRUCTURE; /// @@ -596,7 +596,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT16 Reserved; + UINT16 reserved; UINT32 CPUInterfaceNumber; UINT32 AcpiProcessorUid; UINT32 Flags; @@ -667,7 +667,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT16 Reserved; + UINT16 reserved; UINT64 DiscoveryRangeBaseAddress; UINT32 DiscoveryRangeLength; } EFI_ACPI_6_2_GICR_STRUCTURE; @@ -678,7 +678,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT16 Reserved; + UINT16 reserved; UINT32 GicItsId; UINT64 PhysicalBaseAddress; UINT32 Reserved2; @@ -824,7 +824,7 @@ typedef struct { UINT8 Type; UINT8 Length; UINT32 ProximityDomain; - UINT8 Reserved[2]; + UINT8 reserved[2]; UINT32 ItsId; } EFI_ACPI_6_2_GIC_ITS_AFFINITY_STRUCTURE; @@ -847,7 +847,7 @@ typedef struct { /// typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; - UINT8 Reserved[8]; + UINT8 reserved[8]; } EFI_ACPI_6_2_CORRECTED_PLATFORM_ERROR_POLLING_TABLE_HEADER; /// @@ -967,7 +967,7 @@ typedef struct { typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; UINT8 PlatformCommunicationChannelIdentifier; - UINT8 Reserved[3]; + UINT8 reserved[3]; // Memory Power Node Structure // Memory Power State Characteristics } EFI_ACPI_6_2_MEMORY_POWER_STATUS_TABLE; @@ -1015,7 +1015,7 @@ typedef struct { typedef struct { UINT8 Flag; - UINT8 Reserved; + UINT8 reserved; UINT16 MemoryPowerNodeId; UINT32 Length; UINT64 AddressBase; @@ -1032,7 +1032,7 @@ typedef struct { typedef struct { UINT16 MemoryPowerNodeCount; - UINT8 Reserved[2]; + UINT8 reserved[2]; } EFI_ACPI_6_2_MPST_MEMORY_POWER_NODE_TABLE; /// @@ -1041,7 +1041,7 @@ typedef struct { typedef struct { UINT8 PowerStateStructureID; UINT8 Flag; - UINT16 Reserved; + UINT16 reserved; UINT32 AveragePowerConsumedInMPS0; UINT32 RelativePowerSavingToMPS0; UINT64 ExitLatencyToMPS0; @@ -1053,7 +1053,7 @@ typedef struct { typedef struct { UINT16 MemoryPowerStateCharacteristicsCount; - UINT8 Reserved[2]; + UINT8 reserved[2]; } EFI_ACPI_6_2_MPST_MEMORY_POWER_STATE_CHARACTERISTICS_TABLE; /// @@ -1061,7 +1061,7 @@ typedef struct { /// typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; - UINT32 Reserved; + UINT32 reserved; } EFI_ACPI_6_2_MEMORY_TOPOLOGY_TABLE; /// @@ -1074,7 +1074,7 @@ typedef struct { /// typedef struct { UINT8 Type; - UINT8 Reserved; + UINT8 reserved; UINT16 Length; UINT16 Flags; UINT16 Reserved1; @@ -1093,7 +1093,7 @@ typedef struct { typedef struct { EFI_ACPI_6_2_PMMT_COMMON_MEMORY_AGGREGATOR_DEVICE_STRUCTURE Header; UINT16 SocketIdentifier; - UINT16 Reserved; + UINT16 reserved; //EFI_ACPI_6_2_PMMT_MEMORY_CONTROLLER_MEMORY_AGGREGATOR_DEVICE_STRUCTURE MemoryController[]; } EFI_ACPI_6_2_PMMT_SOCKET_MEMORY_AGGREGATOR_DEVICE_STRUCTURE; @@ -1108,7 +1108,7 @@ typedef struct { UINT32 WriteBandwidth; UINT16 OptimalAccessUnit; UINT16 OptimalAccessAlignment; - UINT16 Reserved; + UINT16 reserved; UINT16 NumberOfProximityDomains; //UINT32 ProximityDomain[NumberOfProximityDomains]; //EFI_ACPI_6_2_PMMT_DIMM_MEMORY_AGGREGATOR_DEVICE_STRUCTURE PhysicalComponent[]; @@ -1120,7 +1120,7 @@ typedef struct { typedef struct { EFI_ACPI_6_2_PMMT_COMMON_MEMORY_AGGREGATOR_DEVICE_STRUCTURE Header; UINT16 PhysicalComponentIdentifier; - UINT16 Reserved; + UINT16 reserved; UINT32 SizeOfDimm; UINT32 SmbiosHandle; } EFI_ACPI_6_2_PMMT_DIMM_MEMORY_AGGREGATOR_DEVICE_STRUCTURE; @@ -1239,7 +1239,7 @@ typedef struct { /// typedef struct { EFI_ACPI_6_2_FPDT_PERFORMANCE_RECORD_HEADER Header; - UINT32 Reserved; + UINT32 reserved; /// /// 64-bit processor-relative physical address of the Basic Boot Performance Table. /// @@ -1251,7 +1251,7 @@ typedef struct { /// typedef struct { EFI_ACPI_6_2_FPDT_PERFORMANCE_RECORD_HEADER Header; - UINT32 Reserved; + UINT32 reserved; /// /// 64-bit processor-relative physical address of the S3 Performance Table. /// @@ -1263,7 +1263,7 @@ typedef struct { /// typedef struct { EFI_ACPI_6_2_FPDT_PERFORMANCE_RECORD_HEADER Header; - UINT32 Reserved; + UINT32 reserved; /// /// Timer value logged at the beginning of firmware image execution. /// This may not always be zero or near zero. @@ -1377,7 +1377,7 @@ typedef struct { typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; UINT64 CntControlBasePhysicalAddress; - UINT32 Reserved; + UINT32 reserved; UINT32 SecurePL1TimerGSIV; UINT32 SecurePL1TimerFlags; UINT32 NonSecurePL1TimerGSIV; @@ -1415,7 +1415,7 @@ typedef struct { typedef struct { UINT8 Type; UINT16 Length; - UINT8 Reserved; + UINT8 reserved; UINT64 CntCtlBase; UINT32 GTBlockTimerCount; UINT32 GTBlockTimerOffset; @@ -1426,7 +1426,7 @@ typedef struct { /// typedef struct { UINT8 GTFrameNumber; - UINT8 Reserved[3]; + UINT8 reserved[3]; UINT64 CntBaseX; UINT64 CntEL0BaseX; UINT32 GTxPhysicalTimerGSIV; @@ -1454,7 +1454,7 @@ typedef struct { typedef struct { UINT8 Type; UINT16 Length; - UINT8 Reserved; + UINT8 reserved; UINT64 RefreshFramePhysicalAddress; UINT64 WatchdogControlFramePhysicalAddress; UINT32 WatchdogTimerGSIV; @@ -1473,7 +1473,7 @@ typedef struct { // typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; - UINT32 Reserved; + UINT32 reserved; } EFI_ACPI_6_2_NVDIMM_FIRMWARE_INTERFACE_TABLE; // @@ -1726,7 +1726,7 @@ typedef struct { UINT32 MultipleUncorrectableErrors:1; UINT32 MultipleCorrectableErrors:1; UINT32 ErrorDataEntryCount:10; - UINT32 Reserved:18; + UINT32 reserved:18; } EFI_ACPI_6_2_ERROR_BLOCK_STATUS; /// @@ -1866,7 +1866,7 @@ typedef struct { UINT16 SwitchToPollingThresholdWindow:1; UINT16 ErrorThresholdValue:1; UINT16 ErrorThresholdWindow:1; - UINT16 Reserved:10; + UINT16 reserved:10; } EFI_ACPI_6_2_HARDWARE_ERROR_NOTIFICATION_CONFIGURATION_WRITE_ENABLE_STRUCTURE; /// @@ -2051,7 +2051,7 @@ typedef struct { /// typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; - UINT8 Reserved[4]; + UINT8 reserved[4]; } EFI_ACPI_6_2_HETEROGENEOUS_MEMORY_ATTRIBUTE_TABLE_HEADER; /// @@ -2071,7 +2071,7 @@ typedef struct { /// typedef struct { UINT16 Type; - UINT8 Reserved[2]; + UINT8 reserved[2]; UINT32 Length; } EFI_ACPI_6_2_HMAT_STRUCTURE_HEADER; @@ -2082,7 +2082,7 @@ typedef struct { UINT16 ProcessorProximityDomainValid:1; UINT16 MemoryProximityDomainValid:1; UINT16 ReservationHint:1; - UINT16 Reserved:13; + UINT16 reserved:13; } EFI_ACPI_6_2_HMAT_STRUCTURE_MEMORY_SUBSYSTEM_ADDRESS_RANGE_FLAGS; /// @@ -2090,7 +2090,7 @@ typedef struct { /// typedef struct { UINT16 Type; - UINT8 Reserved[2]; + UINT8 reserved[2]; UINT32 Length; EFI_ACPI_6_2_HMAT_STRUCTURE_MEMORY_SUBSYSTEM_ADDRESS_RANGE_FLAGS Flags; UINT8 Reserved1[2]; @@ -2106,7 +2106,7 @@ typedef struct { /// typedef struct { UINT8 MemoryHierarchy:5; - UINT8 Reserved:3; + UINT8 reserved:3; } EFI_ACPI_6_2_HMAT_STRUCTURE_SYSTEM_LOCALITY_LATENCY_AND_BANDWIDTH_INFO_FLAGS; /// @@ -2114,7 +2114,7 @@ typedef struct { /// typedef struct { UINT16 Type; - UINT8 Reserved[2]; + UINT8 reserved[2]; UINT32 Length; EFI_ACPI_6_2_HMAT_STRUCTURE_SYSTEM_LOCALITY_LATENCY_AND_BANDWIDTH_INFO_FLAGS Flags; UINT8 DataType; @@ -2141,7 +2141,7 @@ typedef struct { /// typedef struct { UINT16 Type; - UINT8 Reserved[2]; + UINT8 reserved[2]; UINT32 Length; UINT32 MemoryProximityDomain; UINT8 Reserved1[4]; @@ -2332,7 +2332,7 @@ typedef struct { typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; UINT32 Flags; - UINT64 Reserved; + UINT64 reserved; } EFI_ACPI_6_2_PLATFORM_COMMUNICATION_CHANNEL_TABLE_HEADER; /// @@ -2368,7 +2368,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT8 Reserved[6]; + UINT8 reserved[6]; UINT64 BaseAddress; UINT64 AddressLength; EFI_ACPI_6_2_GENERIC_ADDRESS_STRUCTURE DoorbellRegister; @@ -2385,7 +2385,7 @@ typedef struct { typedef struct { UINT8 Command; - UINT8 Reserved:7; + UINT8 reserved:7; UINT8 NotifyOnCompletion:1; } EFI_ACPI_6_2_PCCT_GENERIC_SHARED_MEMORY_REGION_COMMAND; @@ -2394,7 +2394,7 @@ typedef struct { UINT8 PlatformInterrupt:1; UINT8 Error:1; UINT8 PlatformNotification:1; - UINT8 Reserved:4; + UINT8 reserved:4; UINT8 Reserved1; } EFI_ACPI_6_2_PCCT_GENERIC_SHARED_MEMORY_REGION_STATUS; @@ -2415,7 +2415,7 @@ typedef struct { UINT8 Length; UINT32 PlatformInterrupt; UINT8 PlatformInterruptFlags; - UINT8 Reserved; + UINT8 reserved; UINT64 BaseAddress; UINT64 AddressLength; EFI_ACPI_6_2_GENERIC_ADDRESS_STRUCTURE DoorbellRegister; @@ -2434,7 +2434,7 @@ typedef struct { UINT8 Length; UINT32 PlatformInterrupt; UINT8 PlatformInterruptFlags; - UINT8 Reserved; + UINT8 reserved; UINT64 BaseAddress; UINT64 AddressLength; EFI_ACPI_6_2_GENERIC_ADDRESS_STRUCTURE DoorbellRegister; @@ -2456,7 +2456,7 @@ typedef struct { UINT8 Length; UINT32 PlatformInterrupt; UINT8 PlatformInterruptFlags; - UINT8 Reserved; + UINT8 reserved; UINT64 BaseAddress; UINT32 AddressLength; EFI_ACPI_6_2_GENERIC_ADDRESS_STRUCTURE DoorbellRegister; @@ -2498,7 +2498,7 @@ typedef struct { typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; UINT8 TriggerCount; - UINT8 Reserved[3]; + UINT8 reserved[3]; UINT32 TriggerIdentifierArrayOffset; } EFI_ACPI_6_2_PLATFORM_DEBUG_TRIGGER_TABLE_HEADER; @@ -2514,7 +2514,7 @@ typedef struct { UINT16 SubChannelIdentifer:8; UINT16 Runtime:1; UINT16 WaitForCompletion:1; - UINT16 Reserved:6; + UINT16 reserved:6; } EFI_ACPI_6_2_PDTT_PCC_IDENTIFIER; /// @@ -2553,7 +2553,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT8 Reserved[2]; + UINT8 reserved[2]; } EFI_ACPI_6_2_PPTT_STRUCTURE_HEADER; /// @@ -2568,7 +2568,7 @@ typedef struct { typedef struct { UINT32 PhysicalPackage:1; UINT32 AcpiProcessorIdValid:1; - UINT32 Reserved:30; + UINT32 reserved:30; } EFI_ACPI_6_2_PPTT_STRUCTURE_PROCESSOR_FLAGS; /// @@ -2577,7 +2577,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT8 Reserved[2]; + UINT8 reserved[2]; EFI_ACPI_6_2_PPTT_STRUCTURE_PROCESSOR_FLAGS Flags; UINT32 Parent; UINT32 AcpiProcessorId; @@ -2595,7 +2595,7 @@ typedef struct { UINT32 CacheTypeValid:1; UINT32 WritePolicyValid:1; UINT32 LineSizeValid:1; - UINT32 Reserved:25; + UINT32 reserved:25; } EFI_ACPI_6_2_PPTT_STRUCTURE_CACHE_FLAGS; /// @@ -2617,7 +2617,7 @@ typedef struct { UINT8 AllocationType:2; UINT8 CacheType:2; UINT8 WritePolicy:1; - UINT8 Reserved:3; + UINT8 reserved:3; } EFI_ACPI_6_2_PPTT_STRUCTURE_CACHE_ATTRIBUTES; /// @@ -2626,7 +2626,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT8 Reserved[2]; + UINT8 reserved[2]; EFI_ACPI_6_2_PPTT_STRUCTURE_CACHE_FLAGS Flags; UINT32 NextLevelOfCache; UINT32 Size; @@ -2642,7 +2642,7 @@ typedef struct { typedef struct { UINT8 Type; UINT8 Length; - UINT8 Reserved[2]; + UINT8 reserved[2]; UINT32 VendorId; UINT64 Level1Id; UINT64 Level2Id; diff --git a/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/PeImage.h b/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/PeImage.h index 7c55317..810da86 100644 --- a/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/PeImage.h +++ b/Voyager/Voyager/edk2/MdePkg/Include/IndustryStandard/PeImage.h @@ -709,7 +709,7 @@ typedef struct { UINT32 OffsetToData; UINT32 Size; UINT32 CodePage; - UINT32 Reserved; + UINT32 reserved; } EFI_IMAGE_RESOURCE_DATA_ENTRY; /// diff --git a/Voyager/Voyager/edk2/MdePkg/Include/Protocol/DevicePath.h b/Voyager/Voyager/edk2/MdePkg/Include/Protocol/DevicePath.h index b68bfa2..6c3e69f 100644 --- a/Voyager/Voyager/edk2/MdePkg/Include/Protocol/DevicePath.h +++ b/Voyager/Voyager/edk2/MdePkg/Include/Protocol/DevicePath.h @@ -357,7 +357,7 @@ typedef struct { /// /// Reserved for the future. /// - UINT32 Reserved; + UINT32 reserved; /// /// Fibre Channel World Wide Number. /// @@ -377,7 +377,7 @@ typedef struct { /// /// Reserved for the future. /// - UINT32 Reserved; + UINT32 reserved; /// /// 8 byte array containing Fibre Channel End Device Port Name. /// @@ -397,7 +397,7 @@ typedef struct { /// /// Reserved for the future. /// - UINT32 Reserved; + UINT32 reserved; /// /// 1394 Global Unique ID (GUID). /// @@ -687,7 +687,7 @@ typedef struct { /// /// Reserved. /// - UINT32 Reserved; + UINT32 reserved; /// /// The baud rate setting for the UART style device. A value of 0 /// means that the device's default baud rate will be used. @@ -764,7 +764,7 @@ typedef struct { /// /// Reserved for future use. /// - UINT32 Reserved; + UINT32 reserved; /// /// SAS Address for Serial Attached SCSI Target. /// @@ -1126,7 +1126,7 @@ typedef struct { /// typedef struct { EFI_DEVICE_PATH_PROTOCOL Header; - UINT32 Reserved; + UINT32 reserved; UINT64 StartingOffset; UINT64 EndingOffset; } MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH; diff --git a/Voyager/Voyager/edk2/MdePkg/Include/Protocol/GraphicsOutput.h b/Voyager/Voyager/edk2/MdePkg/Include/Protocol/GraphicsOutput.h index d32f9bc..4c93b20 100644 --- a/Voyager/Voyager/edk2/MdePkg/Include/Protocol/GraphicsOutput.h +++ b/Voyager/Voyager/edk2/MdePkg/Include/Protocol/GraphicsOutput.h @@ -138,7 +138,7 @@ typedef struct { UINT8 Blue; UINT8 Green; UINT8 Red; - UINT8 Reserved; + UINT8 reserved; } EFI_GRAPHICS_OUTPUT_BLT_PIXEL; typedef union { diff --git a/Voyager/Voyager/edk2/MdePkg/Include/Protocol/LoadedImage.h b/Voyager/Voyager/edk2/MdePkg/Include/Protocol/LoadedImage.h index 1d9d143..3ed394d 100644 --- a/Voyager/Voyager/edk2/MdePkg/Include/Protocol/LoadedImage.h +++ b/Voyager/Voyager/edk2/MdePkg/Include/Protocol/LoadedImage.h @@ -59,7 +59,7 @@ typedef struct { EFI_HANDLE DeviceHandle; ///< The device handle that the EFI Image was loaded from. EFI_DEVICE_PATH_PROTOCOL *FilePath; ///< A pointer to the file path portion specific to DeviceHandle ///< that the EFI Image was loaded from. - VOID *Reserved; ///< Reserved. DO NOT USE. + VOID *reserved; ///< Reserved. DO NOT USE. // // Images load options diff --git a/Voyager/Voyager/edk2/MdePkg/Include/Uefi/UefiMultiPhase.h b/Voyager/Voyager/edk2/MdePkg/Include/Uefi/UefiMultiPhase.h index 9ca307f..77615d0 100644 --- a/Voyager/Voyager/edk2/MdePkg/Include/Uefi/UefiMultiPhase.h +++ b/Voyager/Voyager/edk2/MdePkg/Include/Uefi/UefiMultiPhase.h @@ -174,7 +174,7 @@ typedef struct { /// /// Reserved field that must be set to 0. /// - UINT32 Reserved; + UINT32 reserved; } EFI_TABLE_HEADER; /// diff --git a/Voyager/Voyager/edk2/MdePkg/Include/Uefi/UefiSpec.h b/Voyager/Voyager/edk2/MdePkg/Include/Uefi/UefiSpec.h index 3adb6ec..94a42df 100644 --- a/Voyager/Voyager/edk2/MdePkg/Include/Uefi/UefiSpec.h +++ b/Voyager/Voyager/edk2/MdePkg/Include/Uefi/UefiSpec.h @@ -1885,7 +1885,7 @@ typedef struct { EFI_REINSTALL_PROTOCOL_INTERFACE ReinstallProtocolInterface; EFI_UNINSTALL_PROTOCOL_INTERFACE UninstallProtocolInterface; EFI_HANDLE_PROTOCOL HandleProtocol; - VOID *Reserved; + VOID *reserved; EFI_REGISTER_PROTOCOL_NOTIFY RegisterProtocolNotify; EFI_LOCATE_HANDLE LocateHandle; EFI_LOCATE_DEVICE_PATH LocateDevicePath; @@ -2139,7 +2139,7 @@ typedef union { /// The SysReq key must be pressed (1) or must not be pressed (0). /// UINT32 SysReqPressed : 1; - UINT32 Reserved : 16; + UINT32 reserved : 16; /// /// Specifies the actual number of entries in EFI_KEY_OPTION.Keys, from 0-3. If /// zero, then only the shift state is considered. If more than one, then the boot option will diff --git a/Voyager/example/example.vcxproj b/Voyager/example/example.vcxproj new file mode 100644 index 0000000..72d0e1c --- /dev/null +++ b/Voyager/example/example.vcxproj @@ -0,0 +1,67 @@ + + + + + Release + x64 + + + + 16.0 + Win32Proj + {1770c4fb-345f-40dd-b4a2-2a5dc8a50866} + example + 10.0 + + + + Application + false + v142 + true + MultiByte + + + + + + + + + + + + false + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS + true + stdcpp17 + + + Console + true + true + true + libvoyager.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Voyager/example/example.vcxproj.filters b/Voyager/example/example.vcxproj.filters new file mode 100644 index 0000000..5eb1299 --- /dev/null +++ b/Voyager/example/example.vcxproj.filters @@ -0,0 +1,38 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {a575c9e1-1d0c-410a-8456-2743e2f93f86} + + + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files\util + + + Header Files\util + + + Header Files + + + \ No newline at end of file diff --git a/Usermode Example/Example.vcxproj.user b/Voyager/example/example.vcxproj.user similarity index 100% rename from Usermode Example/Example.vcxproj.user rename to Voyager/example/example.vcxproj.user diff --git a/Voyager/example/libvoyager.hpp b/Voyager/example/libvoyager.hpp new file mode 100644 index 0000000..259de96 --- /dev/null +++ b/Voyager/example/libvoyager.hpp @@ -0,0 +1,151 @@ +#pragma once +#include +#include + +#define VMEXIT_KEY 0xDEADBEEFDEADBEEF +#define PAGE_4KB 0x1000 +#define PAGE_2MB PAGE_4KB * 512 +#define PAGE_1GB PAGE_2MB * 512 + +using u8 = unsigned char; +using u16 = unsigned short; +using u32 = unsigned int; +using u64 = unsigned long long; + +namespace voyager +{ + // code comments itself... + using guest_virt_t = u64; + using guest_phys_t = u64; + using host_virt_t = u64; + using host_phys_t = u64; + + enum class vmexit_command_t + { + init_page_tables, + read_guest_phys, + write_guest_phys, + copy_guest_virt, + get_dirbase, + translate + }; + + enum class vmxroot_error_t + { + error_success, + pml4e_not_present, + pdpte_not_present, + pde_not_present, + pte_not_present, + vmxroot_translate_failure, + invalid_self_ref_pml4e, + invalid_mapping_pml4e, + invalid_host_virtual, + invalid_guest_physical, + invalid_guest_virtual, + page_table_init_failed + }; + + typedef union _command_t + { + struct _copy_phys + { + host_phys_t phys_addr; + guest_virt_t buffer; + u64 size; + } copy_phys; + + struct _copy_virt + { + guest_phys_t dirbase_src; + guest_virt_t virt_src; + guest_phys_t dirbase_dest; + guest_virt_t virt_dest; + u64 size; + } copy_virt; + + struct _translate_virt + { + guest_virt_t virt_src; + guest_phys_t phys_addr; + } translate_virt; + + guest_phys_t dirbase; + + } command_t, * pcommand_t; + + /// + /// this function is used to cause a vmexit as though its calling a function... + /// + extern "C" auto hypercall(u64 key, vmexit_command_t, pcommand_t command)->vmxroot_error_t; + + /// + /// gets the current cores CR3 value (current address space pml4)... + /// + /// returns the guest cr3 value... + auto current_dirbase()->guest_phys_t; + + /// + /// initalizies page tables for all cores... + /// + /// status of the initalization... + auto init()->vmxroot_error_t; + + /// + /// translate a linear virtual address of the current address space + /// to a linear physical address... + /// + /// virtual address in the vmexiting core's address space... + /// guest physical address... + auto translate(guest_virt_t virt_addr)->guest_phys_t; + + /// + /// reads guest physical memory... + /// + /// physical address to read... + /// buffer (guest virtual address) to read into... + /// number of bytes to read (can only be 0x1000 or less)... + /// STATUS_SUCCESS if the read was successful... + auto read_phys(guest_phys_t phys_addr, guest_virt_t buffer, u64 size)->vmxroot_error_t; + + /// + /// write guest physical memory... + /// + /// physical address to read + /// guest virtual address to write from... + /// number of bytes to write + /// + auto write_phys(guest_phys_t phys_addr, guest_virt_t buffer, u64 size)->vmxroot_error_t; + + /// + /// copy guest virtual memory between virtual address spaces... + /// + /// dirbase of the source address space + /// virtual address in the source address space + /// dirbase of the destination address space + /// virtual address of the destination address + /// size to copy between address spaces + /// returns error_success on successful copy and invalid_guest_virt when an address is invalid... + auto copy_virt(guest_phys_t dirbase_src, guest_virt_t virt_src, guest_phys_t dirbase_dest, + guest_virt_t virt_dest, u64 size)->vmxroot_error_t; + + template + auto rpm(guest_phys_t dirbase, guest_virt_t virt_addr) -> T + { + T buffer; + auto result = copy_virt(dirbase, virt_addr, + current_dirbase(), (guest_virt_t)&buffer, sizeof T); + + if (result != vmxroot_error_t::error_success) + return {}; + + return buffer; + } + + template + auto wpm(guest_phys_t dirbase, guest_virt_t virt_addr, const T& data) -> void + { + copy_virt(dirbase, (guest_virt_t)&data, + dirbase, virt_addr, sizeof T); + } +} \ No newline at end of file diff --git a/Voyager/example/libvoyager.lib b/Voyager/example/libvoyager.lib new file mode 100644 index 0000000000000000000000000000000000000000..a1d7c857b4cb26c1f04acba49914e3435d02e09c GIT binary patch literal 1066914 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≈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�f%L_ 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 +#include "libvoyager.hpp" +#include "util/util.hpp" +#include "vdm_ctx/vdm_ctx.hpp" + +int __cdecl main(int argc, char** argv) +{ + vdm::read_phys_t _read_phys = + [&](void* addr, void* buffer, std::size_t size) -> bool + { + const auto read_result = + voyager::read_phys((u64)addr, (u64)buffer, size); + + return read_result == + voyager::vmxroot_error_t::error_success; + }; + + vdm::write_phys_t _write_phys = + [&](void* addr, void* buffer, std::size_t size) -> bool + { + const auto write_result = + voyager::write_phys((u64)addr, (u64)buffer, size); + + return write_result == + voyager::vmxroot_error_t::error_success; + }; + + std::printf("[+] voyager init result -> 0x%x (0x0 == success)\n", voyager::init()); + std::printf("[+] current dirbase -> 0x%p\n", voyager::current_dirbase()); + std::printf("[+] please wait... this may take up to 30 seconds...\n"); + + const auto nt_shutdown_system = + util::get_kmodule_export( + "ntoskrnl.exe", vdm::syscall_hook.first); + + const auto nt_shutdown_phys = + voyager::translate(reinterpret_cast< + voyager::guest_virt_t>(nt_shutdown_system)); + + std::printf("NtShutdownSystem -> 0x%p\n", nt_shutdown_system); + std::printf("NtShutdownSystem (phys) -> 0x%p\n", nt_shutdown_phys); + vdm::syscall_address.store(reinterpret_cast(nt_shutdown_phys)); + + vdm::vdm_ctx vdm(_read_phys, _write_phys); + const auto ntoskrnl_base = + reinterpret_cast( + util::get_kmodule_base("ntoskrnl.exe")); + + const auto ntoskrnl_memcpy = + util::get_kmodule_export("ntoskrnl.exe", "memcpy"); + + std::printf("[+] %s physical address -> 0x%p\n", vdm::syscall_hook.first, vdm::syscall_address.load()); + std::printf("[+] %s page offset -> 0x%x\n", vdm::syscall_hook.first, vdm::nt_page_offset); + std::printf("[+] ntoskrnl base address -> 0x%p\n", ntoskrnl_base); + std::printf("[+] ntoskrnl memcpy address -> 0x%p\n", ntoskrnl_memcpy); + + short mz_bytes = 0; + vdm.syscall( + ntoskrnl_memcpy, + &mz_bytes, + ntoskrnl_base, + sizeof mz_bytes + ); + + std::printf("[+] ntoskrnl MZ -> 0x%x\n", mz_bytes); + const auto explorer_dirbase = + vdm.get_dirbase(util::get_pid("explorer.exe")); + + const auto ntdll_base = + reinterpret_cast( + GetModuleHandleA("ntdll.dll")); + + std::printf("explorer.exe dirbase -> 0x%p\n", explorer_dirbase); + std::printf("current process dirbase -> %p\n", voyager::current_dirbase()); + std::printf("ntdll.dll base -> 0x%p\n", ntdll_base); + std::printf("ntdll.dll MZ in explorer.exe -> 0x%x\n", + voyager::rpm(explorer_dirbase, ntdll_base)); + + std::printf("[+] press any key to close...\n"); + std::getchar(); +} diff --git a/Voyager/example/util/nt.hpp b/Voyager/example/util/nt.hpp new file mode 100644 index 0000000..1c236ee --- /dev/null +++ b/Voyager/example/util/nt.hpp @@ -0,0 +1,89 @@ +#pragma once +#include +#include + +#pragma comment(lib, "ntdll.lib") +#define PAGE_4KB 0x1000 + +constexpr auto SystemModuleInformation = 11; +typedef struct _RTL_PROCESS_MODULE_INFORMATION +{ + HANDLE Section; + PVOID MappedBase; + PVOID ImageBase; + ULONG ImageSize; + ULONG Flags; + USHORT LoadOrderIndex; + USHORT InitOrderIndex; + USHORT LoadCount; + USHORT OffsetToFileName; + UCHAR FullPathName[256]; +} RTL_PROCESS_MODULE_INFORMATION, * PRTL_PROCESS_MODULE_INFORMATION; + +typedef struct _RTL_PROCESS_MODULES +{ + ULONG NumberOfModules; + RTL_PROCESS_MODULE_INFORMATION Modules[1]; +} RTL_PROCESS_MODULES, * PRTL_PROCESS_MODULES; + +typedef LARGE_INTEGER PHYSICAL_ADDRESS, * PPHYSICAL_ADDRESS; + +using PEPROCESS = PVOID; +using PsLookupProcessByProcessId = NTSTATUS(__fastcall*)( + HANDLE ProcessId, + PEPROCESS* Process +); + +typedef union +{ + std::uint64_t flags; + struct + { + std::uint64_t reserved1 : 3; + + /** + * @brief Page-level Write-Through + * + * [Bit 3] Controls the memory type used to access the first paging structure of the current paging-structure hierarchy. + * This bit is not used if paging is disabled, with PAE paging, or with 4-level paging if CR4.PCIDE=1. + * + * @see Vol3A[4.9(PAGING AND MEMORY TYPING)] + */ + std::uint64_t page_level_write_through : 1; +#define CR3_PAGE_LEVEL_WRITE_THROUGH_BIT 3 +#define CR3_PAGE_LEVEL_WRITE_THROUGH_FLAG 0x08 +#define CR3_PAGE_LEVEL_WRITE_THROUGH_MASK 0x01 +#define CR3_PAGE_LEVEL_WRITE_THROUGH(_) (((_) >> 3) & 0x01) + + /** + * @brief Page-level Cache Disable + * + * [Bit 4] Controls the memory type used to access the first paging structure of the current paging-structure hierarchy. + * This bit is not used if paging is disabled, with PAE paging, or with 4-level paging2 if CR4.PCIDE=1. + * + * @see Vol3A[4.9(PAGING AND MEMORY TYPING)] + */ + std::uint64_t page_level_cache_disable : 1; +#define CR3_PAGE_LEVEL_CACHE_DISABLE_BIT 4 +#define CR3_PAGE_LEVEL_CACHE_DISABLE_FLAG 0x10 +#define CR3_PAGE_LEVEL_CACHE_DISABLE_MASK 0x01 +#define CR3_PAGE_LEVEL_CACHE_DISABLE(_) (((_) >> 4) & 0x01) + std::uint64_t reserved2 : 7; + + /** + * @brief Address of page directory + * + * [Bits 47:12] Physical address of the 4-KByte aligned page directory (32-bit paging) or PML4 table (64-bit paging) used + * for linear-address translation. + * + * @see Vol3A[4.3(32-BIT PAGING)] + * @see Vol3A[4.5(4-LEVEL PAGING)] + */ + std::uint64_t pml4_pfn : 36; +#define CR3_ADDRESS_OF_PAGE_DIRECTORY_BIT 12 +#define CR3_ADDRESS_OF_PAGE_DIRECTORY_FLAG 0xFFFFFFFFF000 +#define CR3_ADDRESS_OF_PAGE_DIRECTORY_MASK 0xFFFFFFFFF +#define CR3_ADDRESS_OF_PAGE_DIRECTORY(_) (((_) >> 12) & 0xFFFFFFFFF) + std::uint64_t reserved3 : 16; + }; +} cr3; \ No newline at end of file diff --git a/Voyager/example/util/util.hpp b/Voyager/example/util/util.hpp new file mode 100644 index 0000000..efbbf63 --- /dev/null +++ b/Voyager/example/util/util.hpp @@ -0,0 +1,264 @@ +#pragma once +#include +#include + +#include +#include +#include +#include +#include +#include +#include "nt.hpp" + +namespace util +{ + inline std::map pmem_ranges{}; + __forceinline auto is_valid(std::uintptr_t addr) -> bool + { + for (auto range : pmem_ranges) + if (addr >= range.first && addr <= range.first + range.second) + return true; + + return false; + } + +#pragma pack (push, 1) + struct PhysicalMemoryPage//CM_PARTIAL_RESOURCE_DESCRIPTOR + { + uint8_t type; + uint8_t shareDisposition; + uint16_t flags; + uint64_t pBegin; + uint32_t sizeButNotExactly; + uint32_t pad; + + static constexpr uint16_t cm_resource_memory_large_40{ 0x200 }; + static constexpr uint16_t cm_resource_memory_large_48{ 0x400 }; + static constexpr uint16_t cm_resource_memory_large_64{ 0x800 }; + + uint64_t size()const noexcept + { + if (flags & cm_resource_memory_large_40) + return uint64_t{ sizeButNotExactly } << 8; + else if (flags & cm_resource_memory_large_48) + return uint64_t{ sizeButNotExactly } << 16; + else if (flags & cm_resource_memory_large_64) + return uint64_t{ sizeButNotExactly } << 32; + else + return uint64_t{ sizeButNotExactly }; + } + }; + static_assert(sizeof(PhysicalMemoryPage) == 20); +#pragma pack (pop) + + inline const auto init_ranges = ([&]() -> bool + { + HKEY h_key; + DWORD type, size; + LPBYTE data; + RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\RESOURCEMAP\\System Resources\\Physical Memory", 0, KEY_READ, &h_key); + RegQueryValueEx(h_key, ".Translated", NULL, &type, NULL, &size); //get size + data = new BYTE[size]; + RegQueryValueEx(h_key, ".Translated", NULL, &type, data, &size); + DWORD count = *(DWORD*)(data + 16); + auto pmi = data + 24; + for (int dwIndex = 0; dwIndex < count; dwIndex++) + { +#if 0 + pmem_ranges.emplace(*(uint64_t*)(pmi + 0), *(uint64_t*)(pmi + 8)); +#else + const PhysicalMemoryPage& page{ *(PhysicalMemoryPage*)(pmi - 4) }; + pmem_ranges.emplace(page.pBegin, page.size()); +#endif + pmi += 20; + } + delete[] data; + RegCloseKey(h_key); + return true; + })(); + + __forceinline auto get_file_header(void* base_addr) -> PIMAGE_FILE_HEADER + { + PIMAGE_DOS_HEADER dos_headers = + reinterpret_cast(base_addr); + + PIMAGE_NT_HEADERS nt_headers = + reinterpret_cast( + reinterpret_cast(base_addr) + dos_headers->e_lfanew); + + return &nt_headers->FileHeader; + } + + __forceinline auto get_kmodule_base(const char* module_name) -> std::uintptr_t + { + void* buffer = nullptr; + DWORD buffer_size = NULL; + + auto status = NtQuerySystemInformation( + static_cast(SystemModuleInformation), + buffer, buffer_size, &buffer_size); + + while (status == STATUS_INFO_LENGTH_MISMATCH) + { + VirtualFree(buffer, NULL, MEM_RELEASE); + buffer = VirtualAlloc(nullptr, buffer_size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); + status = NtQuerySystemInformation( + static_cast(SystemModuleInformation), + buffer, buffer_size, &buffer_size); + } + + if (!NT_SUCCESS(status)) + { + VirtualFree(buffer, NULL, MEM_RELEASE); + return NULL; + } + + const auto modules = static_cast(buffer); + for (auto idx = 0u; idx < modules->NumberOfModules; ++idx) + { + const std::string current_module_name = std::string(reinterpret_cast(modules->Modules[idx].FullPathName) + modules->Modules[idx].OffsetToFileName); + if (!_stricmp(current_module_name.c_str(), module_name)) + { + const uint64_t result = reinterpret_cast(modules->Modules[idx].ImageBase); + VirtualFree(buffer, NULL, MEM_RELEASE); + return result; + } + } + + VirtualFree(buffer, NULL, MEM_RELEASE); + return NULL; + } + + __forceinline auto get_kmodule_export(const char* module_name, const char* export_name, bool rva = false) -> void* + { + void* buffer = nullptr; + DWORD buffer_size = NULL; + + NTSTATUS status = NtQuerySystemInformation( + static_cast(SystemModuleInformation), + buffer, + buffer_size, + &buffer_size + ); + + while (status == STATUS_INFO_LENGTH_MISMATCH) + { + VirtualFree(buffer, 0, MEM_RELEASE); + buffer = VirtualAlloc(nullptr, buffer_size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); + status = NtQuerySystemInformation( + static_cast(SystemModuleInformation), + buffer, + buffer_size, + &buffer_size + ); + } + + if (!NT_SUCCESS(status)) + { + VirtualFree(buffer, 0, MEM_RELEASE); + return nullptr; + } + + const auto modules = static_cast(buffer); + for (auto idx = 0u; idx < modules->NumberOfModules; ++idx) + { + // find module and then load library it + const std::string current_module_name = + std::string(reinterpret_cast( + modules->Modules[idx].FullPathName) + + modules->Modules[idx].OffsetToFileName + ); + + if (!_stricmp(current_module_name.c_str(), module_name)) + { + std::string full_path = reinterpret_cast(modules->Modules[idx].FullPathName); + full_path.replace(full_path.find("\\SystemRoot\\"), + sizeof("\\SystemRoot\\") - 1, std::string(getenv("SYSTEMROOT")).append("\\")); + + const auto module_base = + LoadLibraryEx( + full_path.c_str(), + NULL, + DONT_RESOLVE_DLL_REFERENCES + ); + + PIMAGE_DOS_HEADER p_idh; + PIMAGE_NT_HEADERS p_inh; + PIMAGE_EXPORT_DIRECTORY p_ied; + + PDWORD addr, name; + PWORD ordinal; + + p_idh = (PIMAGE_DOS_HEADER)module_base; + if (p_idh->e_magic != IMAGE_DOS_SIGNATURE) + return NULL; + + p_inh = (PIMAGE_NT_HEADERS)((LPBYTE)module_base + p_idh->e_lfanew); + if (p_inh->Signature != IMAGE_NT_SIGNATURE) + return NULL; + + if (p_inh->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress == 0) + return NULL; + + p_ied = (PIMAGE_EXPORT_DIRECTORY)((LPBYTE)module_base + + p_inh->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); + + addr = (PDWORD)((LPBYTE)module_base + p_ied->AddressOfFunctions); + name = (PDWORD)((LPBYTE)module_base + p_ied->AddressOfNames); + ordinal = (PWORD)((LPBYTE)module_base + p_ied->AddressOfNameOrdinals); + + // find exported function + for (auto i = 0; i < p_ied->AddressOfFunctions; i++) + { + if (!strcmp(export_name, (char*)module_base + name[i])) + { + if (!rva) + { + auto result = (void*)((std::uintptr_t)modules->Modules[idx].ImageBase + addr[ordinal[i]]); + VirtualFree(buffer, NULL, MEM_RELEASE); + return result; + } + else + { + auto result = (void*)addr[ordinal[i]]; + VirtualFree(buffer, NULL, MEM_RELEASE); + return result; + } + } + } + } + } + + VirtualFree(buffer, NULL, MEM_RELEASE); + return nullptr; + } + + __forceinline auto get_pid(const char* proc_name) -> std::uint32_t + { + PROCESSENTRY32 proc_info; + proc_info.dwSize = sizeof(proc_info); + + HANDLE proc_snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); + if (proc_snapshot == INVALID_HANDLE_VALUE) + return NULL; + + Process32First(proc_snapshot, &proc_info); + if (!strcmp(proc_info.szExeFile, proc_name)) + { + CloseHandle(proc_snapshot); + return proc_info.th32ProcessID; + } + + while (Process32Next(proc_snapshot, &proc_info)) + { + if (!strcmp(proc_info.szExeFile, proc_name)) + { + CloseHandle(proc_snapshot); + return proc_info.th32ProcessID; + } + } + + CloseHandle(proc_snapshot); + return NULL; + } +} \ No newline at end of file diff --git a/Voyager/example/vdm_ctx/vdm_ctx.cpp b/Voyager/example/vdm_ctx/vdm_ctx.cpp new file mode 100644 index 0000000..4088f82 --- /dev/null +++ b/Voyager/example/vdm_ctx/vdm_ctx.cpp @@ -0,0 +1,124 @@ +#include "vdm_ctx.hpp" + +namespace vdm +{ + vdm_ctx::vdm_ctx(read_phys_t& read_func, write_phys_t& write_func) + : + read_phys(read_func), + write_phys(write_func) + { + // already found the syscall's physical page... + if (vdm::syscall_address.load()) + return; + + vdm::ntoskrnl = reinterpret_cast( + LoadLibraryExA("ntoskrnl.exe", NULL, + DONT_RESOLVE_DLL_REFERENCES)); + + nt_rva = reinterpret_cast( + util::get_kmodule_export( + "ntoskrnl.exe", + syscall_hook.first, + true + )); + + vdm::nt_page_offset = nt_rva % PAGE_4KB; + std::vector search_threads; + + for (auto ranges : util::pmem_ranges) + search_threads.emplace_back(std::thread( + &vdm_ctx::locate_syscall, + this, + ranges.first, + ranges.second + )); + + for (std::thread& search_thread : search_threads) + search_thread.join(); + } + + void vdm_ctx::set_read(read_phys_t& read_func) + { + this->read_phys = read_func; + } + + void vdm_ctx::set_write(write_phys_t& write_func) + { + this->write_phys = write_func; + } + + void vdm_ctx::rkm(void* dst, void* src, std::size_t size) + { + static const auto ntoskrnl_memcpy = + util::get_kmodule_export("ntoskrnl.exe", "memcpy"); + + this->syscall( + ntoskrnl_memcpy, dst, src, size); + } + + void vdm_ctx::wkm(void* dst, void* src, std::size_t size) + { + static const auto ntoskrnl_memcpy = + util::get_kmodule_export("ntoskrnl.exe", "memcpy"); + + this->syscall( + ntoskrnl_memcpy, dst, src, size); + } + + void vdm_ctx::locate_syscall(std::uintptr_t address, std::uintptr_t length) const + { + const auto page_data = + reinterpret_cast( + VirtualAlloc( + nullptr, + PAGE_4KB, MEM_COMMIT | MEM_RESERVE, + PAGE_READWRITE + )); + + // accesses the page in order to make PTE... + memset(page_data, NULL, PAGE_4KB); + for (auto page = 0u; page < length; page += PAGE_4KB) + { + if (vdm::syscall_address.load()) + break; + + if (!read_phys(reinterpret_cast(address + page), page_data, PAGE_4KB)) + continue; + + // check the first 32 bytes of the syscall, if its the same, test that its the correct + // occurrence of these bytes (since dxgkrnl is loaded into physical memory at least 2 times now)... + if (!memcmp(page_data + nt_page_offset, ntoskrnl + nt_rva, 32)) + if (valid_syscall(reinterpret_cast(address + page + nt_page_offset))) + syscall_address.store( + reinterpret_cast( + address + page + nt_page_offset)); + } + VirtualFree(page_data, PAGE_4KB, MEM_DECOMMIT); + } + + bool vdm_ctx::valid_syscall(void* syscall_addr) const + { + static std::mutex syscall_mutex; + syscall_mutex.lock(); + + static const auto proc = + GetProcAddress( + LoadLibraryA(syscall_hook.second), + syscall_hook.first + ); + + // 0: 48 31 c0 xor rax, rax + // 3 : c3 ret + std::uint8_t shellcode[] = { 0x48, 0x31, 0xC0, 0xC3 }; + std::uint8_t orig_bytes[sizeof shellcode]; + + // save original bytes and install shellcode... + read_phys(syscall_addr, orig_bytes, sizeof orig_bytes); + write_phys(syscall_addr, shellcode, sizeof shellcode); + + auto result = reinterpret_cast(proc)(); + write_phys(syscall_addr, orig_bytes, sizeof orig_bytes); + syscall_mutex.unlock(); + return result == STATUS_SUCCESS; + } +} \ No newline at end of file diff --git a/Voyager/example/vdm_ctx/vdm_ctx.hpp b/Voyager/example/vdm_ctx/vdm_ctx.hpp new file mode 100644 index 0000000..f5144f7 --- /dev/null +++ b/Voyager/example/vdm_ctx/vdm_ctx.hpp @@ -0,0 +1,125 @@ +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include "../util/util.hpp" + +namespace vdm +{ + // change this to whatever you want :^) + constexpr std::pair syscall_hook = { "NtShutdownSystem", "ntdll.dll" }; + inline std::atomic is_page_found = false; + inline std::atomic syscall_address = nullptr; + inline std::uint16_t nt_page_offset; + inline std::uint32_t nt_rva; + inline std::uint8_t* ntoskrnl; + + using read_phys_t = std::function; + using write_phys_t = std::function; + + class vdm_ctx + { + public: + explicit vdm_ctx(read_phys_t& read_func, write_phys_t& write_func); + void set_read(read_phys_t& read_func); + void set_write(write_phys_t& write_func); + void rkm(void* dst, void* src, std::size_t size); + void wkm(void* dst, void* src, std::size_t size); + + template + __forceinline std::invoke_result_t syscall(void* addr, Ts ... args) const + { + static const auto proc = + GetProcAddress( + LoadLibraryA(syscall_hook.second), + syscall_hook.first + ); + + static std::mutex syscall_mutex; + syscall_mutex.lock(); + + // jmp [rip+0x0] + std::uint8_t jmp_code[] = + { + 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00 + }; + + std::uint8_t orig_bytes[sizeof jmp_code]; + *reinterpret_cast(jmp_code + 6) = addr; + read_phys(vdm::syscall_address.load(), orig_bytes, sizeof orig_bytes); + + // execute hook... + write_phys(vdm::syscall_address.load(), jmp_code, sizeof jmp_code); + auto result = reinterpret_cast(proc)(args ...); + write_phys(vdm::syscall_address.load(), orig_bytes, sizeof orig_bytes); + + syscall_mutex.unlock(); + return result; + } + + template + __forceinline auto rkm(std::uintptr_t addr) -> T + { + T buffer; + rkm((void*)&buffer, (void*)addr, sizeof T); + return buffer; + } + + template + __forceinline void wkm(std::uintptr_t addr, const T& value) + { + wkm((void*)addr, (void*)&value, sizeof T); + } + + __forceinline auto get_peprocess(std::uint32_t pid) -> PEPROCESS + { + static const auto ps_lookup_peproc = + util::get_kmodule_export( + "ntoskrnl.exe", + "PsLookupProcessByProcessId"); + + PEPROCESS peproc = nullptr; + this->syscall( + ps_lookup_peproc, + (HANDLE)pid, + &peproc + ); + return peproc; + } + + __forceinline auto get_dirbase(std::uint32_t pid) -> std::uintptr_t + { + const auto peproc = get_peprocess(pid); + + if (!peproc) + return {}; + + return rkm( + reinterpret_cast(peproc) + 0x28).pml4_pfn << 12; + } + + __forceinline auto get_peb(std::uint32_t pid) -> PPEB + { + static const auto get_peb = + util::get_kmodule_export( + "ntoskrnl.exe", "PsGetProcessPeb"); + + return this->syscall( + get_peb, get_peprocess(pid)); + } + + private: + void locate_syscall(std::uintptr_t begin, std::uintptr_t end) const; + bool valid_syscall(void* syscall_addr) const; + + read_phys_t read_phys; + write_phys_t write_phys; + }; +} \ No newline at end of file diff --git a/Usermode Example/com.asm b/Voyager/libvoyager/com.asm similarity index 100% rename from Usermode Example/com.asm rename to Voyager/libvoyager/com.asm diff --git a/Voyager/libvoyager/libvoyager.cpp b/Voyager/libvoyager/libvoyager.cpp new file mode 100644 index 0000000..31bb227 --- /dev/null +++ b/Voyager/libvoyager/libvoyager.cpp @@ -0,0 +1,81 @@ +#include "libvoyager.hpp" +#include +#include + +// taken from hvpp (wbenny). this code runs specific code on each logical processor... +// this is required since hyper-v has its own PML4 for each core... +// https://github.com/wbenny/hvpp/blob/master/src/hvppctrl/lib/mp.cpp#L4 +auto voyager::init() -> vmxroot_error_t +{ + GROUP_AFFINITY orig_group_affinity; + GetThreadGroupAffinity(GetCurrentThread(), &orig_group_affinity); + const auto group_count = GetActiveProcessorGroupCount(); + + // each core we are going to vmexit on and ask the payload + // to setup the mapping pml4e. for some reason each core on + // hyper-v has its own pml4... Not sure why? just is... + for (auto group_number = 0u; group_number < group_count; ++group_number) + { + const auto processor_count = GetActiveProcessorCount(group_number); + for (auto processor_number = 0u; processor_number < processor_count; ++processor_number) + { + GROUP_AFFINITY group_affinity = { 0 }; + group_affinity.Mask = (KAFFINITY)(1) << processor_number; + group_affinity.Group = group_number; + SetThreadGroupAffinity(GetCurrentThread(), &group_affinity, NULL); + + auto result = hypercall(VMEXIT_KEY, vmexit_command_t::init_page_tables, nullptr); + if (result != vmxroot_error_t::error_success) + return result; + } + } + + SetThreadGroupAffinity(GetCurrentThread(), &orig_group_affinity, NULL); + return vmxroot_error_t::error_success; +} + +auto voyager::current_dirbase()->guest_phys_t +{ + command_t command; + auto result = hypercall(VMEXIT_KEY, vmexit_command_t::get_dirbase, &command); + + if (result != vmxroot_error_t::error_success) + return {}; + + return command.dirbase; +} + +auto voyager::translate(guest_virt_t virt_addr) -> guest_phys_t +{ + command_t command; + command.translate_virt.virt_src = virt_addr; + + const auto result = hypercall(VMEXIT_KEY, vmexit_command_t::translate, &command); + + if (result != vmxroot_error_t::error_success) + return {}; + + return command.translate_virt.phys_addr; +} + +auto voyager::read_phys(guest_phys_t phys_addr, guest_virt_t buffer, u64 size) -> vmxroot_error_t +{ + command_t command; + command.copy_phys = { phys_addr, buffer, size }; + return hypercall(VMEXIT_KEY, vmexit_command_t::read_guest_phys, &command); +} + +auto voyager::write_phys(guest_phys_t phys_addr, guest_virt_t buffer, u64 size) -> vmxroot_error_t +{ + command_t command; + command.copy_phys = { phys_addr, buffer, size }; + return hypercall(VMEXIT_KEY, vmexit_command_t::write_guest_phys, &command); +} + +auto voyager::copy_virt(guest_phys_t dirbase_src, guest_virt_t virt_src, guest_phys_t dirbase_dest, + guest_virt_t virt_dest, u64 size) -> vmxroot_error_t +{ + command_t command; + command.copy_virt = { dirbase_src, virt_src, dirbase_dest, virt_dest, size }; + return hypercall(VMEXIT_KEY, vmexit_command_t::copy_guest_virt, &command); +} \ No newline at end of file diff --git a/Voyager/libvoyager/libvoyager.hpp b/Voyager/libvoyager/libvoyager.hpp new file mode 100644 index 0000000..259de96 --- /dev/null +++ b/Voyager/libvoyager/libvoyager.hpp @@ -0,0 +1,151 @@ +#pragma once +#include +#include + +#define VMEXIT_KEY 0xDEADBEEFDEADBEEF +#define PAGE_4KB 0x1000 +#define PAGE_2MB PAGE_4KB * 512 +#define PAGE_1GB PAGE_2MB * 512 + +using u8 = unsigned char; +using u16 = unsigned short; +using u32 = unsigned int; +using u64 = unsigned long long; + +namespace voyager +{ + // code comments itself... + using guest_virt_t = u64; + using guest_phys_t = u64; + using host_virt_t = u64; + using host_phys_t = u64; + + enum class vmexit_command_t + { + init_page_tables, + read_guest_phys, + write_guest_phys, + copy_guest_virt, + get_dirbase, + translate + }; + + enum class vmxroot_error_t + { + error_success, + pml4e_not_present, + pdpte_not_present, + pde_not_present, + pte_not_present, + vmxroot_translate_failure, + invalid_self_ref_pml4e, + invalid_mapping_pml4e, + invalid_host_virtual, + invalid_guest_physical, + invalid_guest_virtual, + page_table_init_failed + }; + + typedef union _command_t + { + struct _copy_phys + { + host_phys_t phys_addr; + guest_virt_t buffer; + u64 size; + } copy_phys; + + struct _copy_virt + { + guest_phys_t dirbase_src; + guest_virt_t virt_src; + guest_phys_t dirbase_dest; + guest_virt_t virt_dest; + u64 size; + } copy_virt; + + struct _translate_virt + { + guest_virt_t virt_src; + guest_phys_t phys_addr; + } translate_virt; + + guest_phys_t dirbase; + + } command_t, * pcommand_t; + + /// + /// this function is used to cause a vmexit as though its calling a function... + /// + extern "C" auto hypercall(u64 key, vmexit_command_t, pcommand_t command)->vmxroot_error_t; + + /// + /// gets the current cores CR3 value (current address space pml4)... + /// + /// returns the guest cr3 value... + auto current_dirbase()->guest_phys_t; + + /// + /// initalizies page tables for all cores... + /// + /// status of the initalization... + auto init()->vmxroot_error_t; + + /// + /// translate a linear virtual address of the current address space + /// to a linear physical address... + /// + /// virtual address in the vmexiting core's address space... + /// guest physical address... + auto translate(guest_virt_t virt_addr)->guest_phys_t; + + /// + /// reads guest physical memory... + /// + /// physical address to read... + /// buffer (guest virtual address) to read into... + /// number of bytes to read (can only be 0x1000 or less)... + /// STATUS_SUCCESS if the read was successful... + auto read_phys(guest_phys_t phys_addr, guest_virt_t buffer, u64 size)->vmxroot_error_t; + + /// + /// write guest physical memory... + /// + /// physical address to read + /// guest virtual address to write from... + /// number of bytes to write + /// + auto write_phys(guest_phys_t phys_addr, guest_virt_t buffer, u64 size)->vmxroot_error_t; + + /// + /// copy guest virtual memory between virtual address spaces... + /// + /// dirbase of the source address space + /// virtual address in the source address space + /// dirbase of the destination address space + /// virtual address of the destination address + /// size to copy between address spaces + /// returns error_success on successful copy and invalid_guest_virt when an address is invalid... + auto copy_virt(guest_phys_t dirbase_src, guest_virt_t virt_src, guest_phys_t dirbase_dest, + guest_virt_t virt_dest, u64 size)->vmxroot_error_t; + + template + auto rpm(guest_phys_t dirbase, guest_virt_t virt_addr) -> T + { + T buffer; + auto result = copy_virt(dirbase, virt_addr, + current_dirbase(), (guest_virt_t)&buffer, sizeof T); + + if (result != vmxroot_error_t::error_success) + return {}; + + return buffer; + } + + template + auto wpm(guest_phys_t dirbase, guest_virt_t virt_addr, const T& data) -> void + { + copy_virt(dirbase, (guest_virt_t)&data, + dirbase, virt_addr, sizeof T); + } +} \ No newline at end of file diff --git a/Voyager/libvoyager/libvoyager.sln b/Voyager/libvoyager/libvoyager.sln new file mode 100644 index 0000000..2f3be11 --- /dev/null +++ b/Voyager/libvoyager/libvoyager.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30621.155 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libvoyager", "libvoyager\libvoyager.vcxproj", "{F468E79E-CC93-4A7F-844E-984117B5B08B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example", "example\example.vcxproj", "{1770C4FB-345F-40DD-B4A2-2A5DC8A50866}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F468E79E-CC93-4A7F-844E-984117B5B08B}.Debug|x64.ActiveCfg = Debug|x64 + {F468E79E-CC93-4A7F-844E-984117B5B08B}.Debug|x64.Build.0 = Debug|x64 + {F468E79E-CC93-4A7F-844E-984117B5B08B}.Release|x64.ActiveCfg = Release|x64 + {F468E79E-CC93-4A7F-844E-984117B5B08B}.Release|x64.Build.0 = Release|x64 + {1770C4FB-345F-40DD-B4A2-2A5DC8A50866}.Debug|x64.ActiveCfg = Debug|x64 + {1770C4FB-345F-40DD-B4A2-2A5DC8A50866}.Debug|x64.Build.0 = Debug|x64 + {1770C4FB-345F-40DD-B4A2-2A5DC8A50866}.Release|x64.ActiveCfg = Release|x64 + {1770C4FB-345F-40DD-B4A2-2A5DC8A50866}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {BA7C21A6-0410-4D98-92D4-1F66944EAC47} + EndGlobalSection +EndGlobal diff --git a/Voyager/libvoyager/libvoyager.vcxproj b/Voyager/libvoyager/libvoyager.vcxproj new file mode 100644 index 0000000..ac1f80d --- /dev/null +++ b/Voyager/libvoyager/libvoyager.vcxproj @@ -0,0 +1,68 @@ + + + + + Release + x64 + + + + + + + + + + + Document + + + + 16.0 + Win32Proj + {f468e79e-cc93-4a7f-844e-984117b5b08b} + libvoyager + 10.0 + + + + StaticLibrary + false + v142 + true + Unicode + + + + + + + + + + + + + false + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + \ No newline at end of file diff --git a/Usermode Example/Example.vcxproj.filters b/Voyager/libvoyager/libvoyager.vcxproj.filters similarity index 90% rename from Usermode Example/Example.vcxproj.filters rename to Voyager/libvoyager/libvoyager.vcxproj.filters index 374175b..5bc8c38 100644 --- a/Usermode Example/Example.vcxproj.filters +++ b/Voyager/libvoyager/libvoyager.vcxproj.filters @@ -11,12 +11,12 @@ - + Source Files - + Header Files diff --git a/Voyager/libvoyager/libvoyager.vcxproj.user b/Voyager/libvoyager/libvoyager.vcxproj.user new file mode 100644 index 0000000..88a5509 --- /dev/null +++ b/Voyager/libvoyager/libvoyager.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/img/sections.PNG b/img/sections.PNG new file mode 100644 index 0000000000000000000000000000000000000000..59698b15c488a728cbd411b45b0e4ff2469a5096 GIT binary patch literal 45545 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 kwO#&Qet%J2zxDm%syR literal 0 HcmV?d00001