|
8 | 8 |
|
9 | 9 | #define GET_HEADER_DICTIONARY(headers, idx) &headers->OptionalHeader.DataDirectory[idx] |
10 | 10 |
|
| 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 | + |
11 | 24 | 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; |
25 | 35 | } |
26 | 36 |
|
27 | 37 | bool WINAPI IsValidMemoryModuleHandle(HMEMORYMODULE hModule) { |
@@ -280,25 +290,22 @@ NTSTATUS MemoryLoadLibrary( |
280 | 290 | ); |
281 | 291 | new_header->OptionalHeader.ImageBase = (size_t)base; |
282 | 292 |
|
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 | | - |
290 | 293 | // |
291 | 294 | // Make sure there have enough free space to embed our structure. |
292 | 295 | // |
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 | + } |
296 | 303 | } |
297 | 304 |
|
298 | 305 | // |
299 | 306 | // Setup MemoryModule structure. |
300 | 307 | // |
301 | | - PMEMORYMODULE hMemoryModule = (PMEMORYMODULE)(base + old_header->OptionalHeader.SizeOfHeaders - sizeof(MEMORYMODULE)); |
| 308 | + PMEMORYMODULE hMemoryModule = (PMEMORYMODULE)(base + sizeOfHeaders); |
302 | 309 | RtlZeroMemory(hMemoryModule, sizeof(MEMORYMODULE)); |
303 | 310 | hMemoryModule->codeBase = base; |
304 | 311 | hMemoryModule->dwImageFileSize = size; |
|
0 commit comments