Skip to content

Commit 57fe37e

Browse files
committed
Change the location of the MEMORYMODULE structure
1 parent 014d459 commit 57fe37e

1 file changed

Lines changed: 31 additions & 24 deletions

File tree

MemoryModule/MemoryModule.cpp

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,30 @@
88

99
#define GET_HEADER_DICTIONARY(headers, idx) &headers->OptionalHeader.DataDirectory[idx]
1010

11+
int MmpSizeOfImageHeadersUnsafe(PVOID BaseAddress) {
12+
PIMAGE_DOS_HEADER dh = (PIMAGE_DOS_HEADER)BaseAddress;
13+
PIMAGE_NT_HEADERS nh = (PIMAGE_NT_HEADERS)((LPBYTE)BaseAddress + dh->e_lfanew);
14+
15+
//https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-image_optional_header32
16+
int sizeOfHeaders = dh->e_lfanew + // e_lfanew member of IMAGE_DOS_HEADER
17+
4 + // 4 byte signature
18+
sizeof(IMAGE_FILE_HEADER) + // size of IMAGE_FILE_HEADER
19+
sizeof(IMAGE_OPTIONAL_HEADER) + // size of optional header
20+
sizeof(IMAGE_SECTION_HEADER) * nh->FileHeader.NumberOfSections; // size of all section headers
21+
return sizeOfHeaders;
22+
}
23+
1124
PMEMORYMODULE WINAPI MapMemoryModuleHandle(HMEMORYMODULE hModule) {
12-
__try {
13-
PIMAGE_DOS_HEADER dos = (PIMAGE_DOS_HEADER)hModule;
14-
if (!dos)return nullptr;
15-
PIMAGE_NT_HEADERS nt = (PIMAGE_NT_HEADERS)((LPBYTE)hModule + dos->e_lfanew);
16-
if (!nt)return nullptr;
17-
PMEMORYMODULE pModule = (PMEMORYMODULE)((LPBYTE)hModule + nt->OptionalHeader.SizeOfHeaders - sizeof(MEMORYMODULE));
18-
if (!_ProbeForRead(pModule, sizeof(MEMORYMODULE)))return nullptr;
19-
if (pModule->Signature != MEMORY_MODULE_SIGNATURE || (size_t)pModule->codeBase != nt->OptionalHeader.ImageBase)return nullptr;
20-
return pModule;
21-
}
22-
__except (EXCEPTION_EXECUTE_HANDLER) {
23-
return nullptr;
24-
}
25+
26+
if (!hModule)return nullptr;
27+
28+
PIMAGE_NT_HEADERS nh = RtlImageNtHeader(hModule);
29+
if (!nh)return nullptr;
30+
31+
int sizeOfHeaders = MmpSizeOfImageHeadersUnsafe(hModule);
32+
PMEMORYMODULE pModule = (PMEMORYMODULE)((LPBYTE)hModule + sizeOfHeaders);
33+
if (pModule->Signature != MEMORY_MODULE_SIGNATURE || pModule->codeBase != (LPBYTE)hModule)return nullptr;
34+
return pModule;
2535
}
2636

2737
bool WINAPI IsValidMemoryModuleHandle(HMEMORYMODULE hModule) {
@@ -280,25 +290,22 @@ NTSTATUS MemoryLoadLibrary(
280290
);
281291
new_header->OptionalHeader.ImageBase = (size_t)base;
282292

283-
//https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-image_optional_header32
284-
int sizeOfHeaders = dos_header->e_lfanew + // e_lfanew member of IMAGE_DOS_HEADER
285-
4 + // 4 byte signature
286-
sizeof(IMAGE_FILE_HEADER) + // size of IMAGE_FILE_HEADER
287-
sizeof(IMAGE_OPTIONAL_HEADER) + // size of optional header
288-
sizeof(IMAGE_SECTION_HEADER) * old_header->FileHeader.NumberOfSections; // size of all section headers
289-
290293
//
291294
// Make sure there have enough free space to embed our structure.
292295
//
293-
if (sizeOfHeaders + sizeof(MEMORYMODULE) > old_header->OptionalHeader.SizeOfHeaders) {
294-
status = STATUS_NOT_SUPPORTED;
295-
return status;
296+
int sizeOfHeaders = MmpSizeOfImageHeadersUnsafe(base);
297+
PIMAGE_SECTION_HEADER pSections = IMAGE_FIRST_SECTION(new_header);
298+
for (int i = 0; i < new_header->FileHeader.NumberOfSections; ++i) {
299+
if (pSections[i].VirtualAddress < sizeOfHeaders + sizeof(MEMORYMODULE)) {
300+
status = STATUS_NOT_SUPPORTED;
301+
return status;
302+
}
296303
}
297304

298305
//
299306
// Setup MemoryModule structure.
300307
//
301-
PMEMORYMODULE hMemoryModule = (PMEMORYMODULE)(base + old_header->OptionalHeader.SizeOfHeaders - sizeof(MEMORYMODULE));
308+
PMEMORYMODULE hMemoryModule = (PMEMORYMODULE)(base + sizeOfHeaders);
302309
RtlZeroMemory(hMemoryModule, sizeof(MEMORYMODULE));
303310
hMemoryModule->codeBase = base;
304311
hMemoryModule->dwImageFileSize = size;

0 commit comments

Comments
 (0)