From 0226c248f4495728c99f32caa4e9bda6fe6af81a Mon Sep 17 00:00:00 2001
From: Boring <1079299053@qq.com>
Date: Tue, 30 Jun 2020 21:28:15 +0800
Subject: [PATCH] fix CheckSum
---
MemoryModule/MemoryModule.vcxproj | 2 ++
MemoryModule/NativeFunctionsInternal.cpp | 43 ++++++++++++++++++++----
test/test.cpp | 3 ++
3 files changed, 41 insertions(+), 7 deletions(-)
diff --git a/MemoryModule/MemoryModule.vcxproj b/MemoryModule/MemoryModule.vcxproj
index d9fd5ed..4dc029b 100644
--- a/MemoryModule/MemoryModule.vcxproj
+++ b/MemoryModule/MemoryModule.vcxproj
@@ -71,6 +71,7 @@
+
@@ -177,5 +178,6 @@
+
\ No newline at end of file
diff --git a/MemoryModule/NativeFunctionsInternal.cpp b/MemoryModule/NativeFunctionsInternal.cpp
index 2404361..a02e863 100644
--- a/MemoryModule/NativeFunctionsInternal.cpp
+++ b/MemoryModule/NativeFunctionsInternal.cpp
@@ -704,16 +704,45 @@ BOOLEAN __forceinline WINAPI CheckSumBufferedFile(LPVOID BaseAddress, DWORD Buff
}
#endif
BOOLEAN NTAPI RtlIsValidImageBuffer(PVOID Buffer) {
+
BOOLEAN result = FALSE;
__try {
- PIMAGE_NT_HEADERS headers = RtlImageNtHeader(Buffer);
- PIMAGE_SECTION_HEADER sections = headers ? IMAGE_FIRST_SECTION(headers) : nullptr;
- size_t SizeofImage = headers ? headers->OptionalHeader.SizeOfHeaders : 0;
- if (!sections)return result;
+ union {
+ PIMAGE_NT_HEADERS32 nt32;
+ PIMAGE_NT_HEADERS64 nt64;
+ PIMAGE_NT_HEADERS nt;
+ }headers;
+ headers.nt = RtlImageNtHeader(Buffer);
+ PIMAGE_SECTION_HEADER sections = nullptr;
+ size_t SizeofImage = 0;
- ProbeForRead(sections, headers->FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER));
- for (WORD i = 0; i < headers->FileHeader.NumberOfSections; ++i, ++sections)
- SizeofImage += sections->SizeOfRawData;
+ if (!headers.nt) {
+ return FALSE;
+ }
+
+ switch (headers.nt->OptionalHeader.Magic) {
+ case IMAGE_NT_OPTIONAL_HDR32_MAGIC:
+ sections = PIMAGE_SECTION_HEADER((char*)&headers.nt32->OptionalHeader + headers.nt32->FileHeader.SizeOfOptionalHeader);
+ SizeofImage = headers.nt32->OptionalHeader.SizeOfHeaders;
+ ProbeForRead(sections, headers.nt32->FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER));
+ for (WORD i = 0; i < headers.nt32->FileHeader.NumberOfSections; ++i, ++sections)
+ SizeofImage += sections->SizeOfRawData;
+
+ //Signature size
+ SizeofImage += headers.nt32->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY].Size;
+ break;
+ case IMAGE_NT_OPTIONAL_HDR64_MAGIC:
+ sections = PIMAGE_SECTION_HEADER((char*)&headers.nt64->OptionalHeader + headers.nt64->FileHeader.SizeOfOptionalHeader);
+ SizeofImage = headers.nt64->OptionalHeader.SizeOfHeaders;
+ ProbeForRead(sections, headers.nt64->FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER));
+ for (WORD i = 0; i < headers.nt64->FileHeader.NumberOfSections; ++i, ++sections)
+ SizeofImage += sections->SizeOfRawData;
+ SizeofImage += headers.nt64->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY].Size;
+ break;
+ default:
+ return FALSE;
+ }
+ IMAGE_FIRST_SECTION(headers.nt32);
ProbeForRead(Buffer, SizeofImage);
result = CheckSumBufferedFile(Buffer, SizeofImage);
}
diff --git a/test/test.cpp b/test/test.cpp
index 88bdb5c..1259d49 100644
--- a/test/test.cpp
+++ b/test/test.cpp
@@ -163,6 +163,9 @@ end:
int main() {
DWORD t;
NtQuerySystemMemoryModuleFeatures(&t);
+ LoadLibraryMemory(ReadDllFile("C:\\Windows\\explorer.exe"));
+ return 0;
+
test_default();
test_ws2_32();