From 01e38a237856cf187d09d9aaf2d96f21e9df8797 Mon Sep 17 00:00:00 2001 From: MakeshiftKazoo <26028834+MakeshiftKazoo@users.noreply.github.com> Date: Wed, 3 Jul 2019 10:41:03 -0400 Subject: [PATCH 1/2] Fixed section alignment --- MemoryModule.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/MemoryModule.c b/MemoryModule.c index 9f95a70..bda99c5 100644 --- a/MemoryModule.c +++ b/MemoryModule.c @@ -609,9 +609,8 @@ HMEMORYMODULE MemoryLoadLibraryEx(const void *data, size_t size, } } - GetNativeSystemInfo(&sysInfo); - alignedImageSize = AlignValueUp(old_header->OptionalHeader.SizeOfImage, sysInfo.dwPageSize); - if (alignedImageSize != AlignValueUp(lastSectionEnd, sysInfo.dwPageSize)) { + alignedImageSize = AlignValueUp(old_header->OptionalHeader.SizeOfImage, old_header->OptionalHeader.SectionAlignment); + if (alignedImageSize != AlignValueUp(lastSectionEnd, old_header->OptionalHeader.SectionAlignment)) { SetLastError(ERROR_BAD_EXE_FORMAT); return NULL; } From 7ac914ef79d92e6a946d1e8bbbe0e2e8155c9133 Mon Sep 17 00:00:00 2001 From: MakeshiftKazoo <26028834+MakeshiftKazoo@users.noreply.github.com> Date: Wed, 3 Jul 2019 10:43:38 -0400 Subject: [PATCH 2/2] Added x64 exception handling --- MemoryModule.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/MemoryModule.c b/MemoryModule.c index bda99c5..f77deb5 100644 --- a/MemoryModule.c +++ b/MemoryModule.c @@ -435,6 +435,15 @@ PerformBaseRelocation(PMEMORYMODULE module, ptrdiff_t delta) return TRUE; } +static BOOL +RegisterExceptionHandling(PMEMORYMODULE module) +{ + PIMAGE_DATA_DIRECTORY pDir = GET_HEADER_DICTIONARY(module, IMAGE_DIRECTORY_ENTRY_EXCEPTION); + PIMAGE_RUNTIME_FUNCTION_ENTRY pEntry = (PIMAGE_RUNTIME_FUNCTION_ENTRY)(module->codeBase + pDir->VirtualAddress); + UINT count = (pDir->Size / sizeof(IMAGE_RUNTIME_FUNCTION_ENTRY)) - 1; + return RtlAddFunctionTable(pEntry, count, (DWORD64)module->codeBase); +} + static BOOL BuildImportTable(PMEMORYMODULE module) { @@ -724,6 +733,11 @@ HMEMORYMODULE MemoryLoadLibraryEx(const void *data, size_t size, goto error; } + + if (!RegisterExceptionHandling(result)) { + goto error; + } + // mark memory pages depending on section headers and release // sections that are marked as "discardable" if (!FinalizeSections(result)) {