From 0f72107231bd09ef0382b71aca9461258c98c944 Mon Sep 17 00:00:00 2001 From: xerox Date: Sat, 25 Apr 2020 04:18:56 -0700 Subject: [PATCH] added gdrv example --- demo/gdrv/driver/gdrv.sys | Bin 0 -> 26792 bytes demo/{ => gdrv}/hello-world.sys | Bin demo/gdrv/physmeme.exe | Bin 0 -> 119296 bytes demo/gdrv/physmeme.hpp | 161 +++++++++++++++++++++++++++++ demo/{ => supermicro}/README.md | 0 demo/supermicro/hello-world.sys | Bin 0 -> 6272 bytes demo/{ => supermicro}/phymem64.sys | Bin demo/{ => supermicro}/physmeme.exe | Bin demo/{ => supermicro}/pmdll64.dll | Bin 9 files changed, 161 insertions(+) create mode 100644 demo/gdrv/driver/gdrv.sys rename demo/{ => gdrv}/hello-world.sys (100%) create mode 100644 demo/gdrv/physmeme.exe create mode 100644 demo/gdrv/physmeme.hpp rename demo/{ => supermicro}/README.md (100%) create mode 100644 demo/supermicro/hello-world.sys rename demo/{ => supermicro}/phymem64.sys (100%) rename demo/{ => supermicro}/physmeme.exe (100%) rename demo/{ => supermicro}/pmdll64.dll (100%) diff --git a/demo/gdrv/driver/gdrv.sys b/demo/gdrv/driver/gdrv.sys new file mode 100644 index 0000000000000000000000000000000000000000..2d288666e8fb9bd62318a16018ad15663e478868 GIT binary patch literal 26792 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 literal 0 HcmV?d00001 diff --git a/demo/hello-world.sys b/demo/gdrv/hello-world.sys similarity index 100% rename from demo/hello-world.sys rename to demo/gdrv/hello-world.sys diff --git a/demo/gdrv/physmeme.exe b/demo/gdrv/physmeme.exe new file mode 100644 index 0000000000000000000000000000000000000000..bd9809df73c7c5f6dc241fa35e604dc2dade8c8a GIT binary patch literal 119296 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 +#include +#include +#include +#include +#include + +#pragma pack ( push, 1 ) +typedef struct _GIOMAP +{ + unsigned long interface_type; + unsigned long bus; + uintptr_t physical_address; + unsigned long io_space; + unsigned long size; +} GIOMAP; +#pragma pack ( pop ) + +static const char* driver_name = "gdrv"; +static const char* driver_path = (std::filesystem::current_path().string() + "\\driver\\gdrv.sys").c_str(); + +namespace physmeme +{ + //--- ranges of physical memory + static std::map pmem_ranges; + + //--- validates the address + static bool is_valid(std::uintptr_t addr) + { + for (auto range : pmem_ranges) + if (addr >= range.first && addr <= range.first + range.second) + return true; + return false; + } + + // Author: Remy Lebeau + // taken from here: https://stackoverflow.com/questions/48485364/read-reg-resource-list-memory-values-incorrect-value + static 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++) + { + pmem_ranges.emplace(*(uint64_t*)(pmi + 0), *(uint64_t*)(pmi + 8)); + pmi += 20; + } + delete[] data; + RegCloseKey(h_key); + return true; + })(); + + /* + please code this function depending on your method of physical read/write. +*/ + static HANDLE load_drv() + { + const SC_HANDLE manager = OpenSCManager(nullptr, nullptr, SC_MANAGER_CREATE_SERVICE); + + if (!manager) + return false; + + SC_HANDLE service_handle = CreateService(manager, + driver_name, + driver_name, + SERVICE_START | SERVICE_STOP | DELETE, SERVICE_KERNEL_DRIVER, + SERVICE_DEMAND_START, + SERVICE_ERROR_IGNORE, + driver_path, nullptr, nullptr, nullptr, nullptr, nullptr); + + if (!service_handle) + service_handle = OpenService(manager, driver_name, SERVICE_START); + + if (!service_handle) + { + CloseServiceHandle(manager); + return false; + } + + bool result = StartService(service_handle, 0, nullptr); + + if (!result) + printf("[-] failed to start service, last_error=%d\n", GetLastError()); + + CloseServiceHandle(service_handle); + CloseServiceHandle(manager); + + auto handle = CreateFile("\\\\.\\GIO", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + std::cout << "[+] service started, handle: " << handle << std::endl; + return handle; + } + + inline HANDLE drv_handle = load_drv(); + + /* + please code this function depending on your method of physical read/write. + */ + static bool unload_drv() + { + const SC_HANDLE manager = OpenSCManager(nullptr, nullptr, SC_MANAGER_CREATE_SERVICE); + + if (!manager) + return false; + + const SC_HANDLE service_handle = OpenService(manager, driver_name, SERVICE_STOP | DELETE); + if (!service_handle) + { + CloseServiceHandle(manager); + return false; + } + + SERVICE_STATUS status = { 0 }; + bool result = ControlService(service_handle, SERVICE_CONTROL_STOP, &status); + + DeleteService(service_handle); + CloseServiceHandle(service_handle); + CloseServiceHandle(manager); + return result; + } + + /* + please code this function depending on your method of physical read/write. + */ + static std::uintptr_t map_phys( + std::uintptr_t addr, + std::size_t size + ) + { + GIOMAP in_buffer = { 0, 0, addr, 0, size }; + uintptr_t out_buffer[2] = { 0 }; + unsigned long returned = 0; + DeviceIoControl(drv_handle, 0xC3502004, reinterpret_cast(&in_buffer), sizeof(in_buffer), + reinterpret_cast(out_buffer), sizeof(out_buffer), &returned, NULL); + return out_buffer[0]; + } + + /* + please code this function depending on your method of physical read/write. + */ + static bool unmap_phys( + std::uintptr_t addr, + std::size_t size + ) + { + uintptr_t in_buffer = addr; + uintptr_t out_buffer[2] = { 0 }; + + unsigned long returned = 0; + DeviceIoControl(drv_handle, 0xC3502008, reinterpret_cast(&in_buffer), sizeof(in_buffer), + reinterpret_cast(out_buffer), sizeof(out_buffer), &returned, NULL); + + return out_buffer[0]; + } +} \ No newline at end of file diff --git a/demo/README.md b/demo/supermicro/README.md similarity index 100% rename from demo/README.md rename to demo/supermicro/README.md diff --git a/demo/supermicro/hello-world.sys b/demo/supermicro/hello-world.sys new file mode 100644 index 0000000000000000000000000000000000000000..7f2301f7e9e730af66ed0935ce4edb0ce04850fe GIT binary patch literal 6272 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 literal 0 HcmV?d00001 diff --git a/demo/phymem64.sys b/demo/supermicro/phymem64.sys similarity index 100% rename from demo/phymem64.sys rename to demo/supermicro/phymem64.sys diff --git a/demo/physmeme.exe b/demo/supermicro/physmeme.exe similarity index 100% rename from demo/physmeme.exe rename to demo/supermicro/physmeme.exe diff --git a/demo/pmdll64.dll b/demo/supermicro/pmdll64.dll similarity index 100% rename from demo/pmdll64.dll rename to demo/supermicro/pmdll64.dll