Skip to content

Commit b686271

Browse files
committed
update calculation checksum
1 parent 3c9a88e commit b686271

2 files changed

Lines changed: 18 additions & 13 deletions

File tree

MemoryModule/Loader.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ NTSTATUS NTAPI LdrLoadDllMemoryExW(
5858
__try {
5959
*BaseAddress = nullptr;
6060
if (LdrEntry)*LdrEntry = nullptr;
61-
if (!(dwFlags & LOAD_FLAGS_PASS_IMAGE_CHECK) && !RtlIsValidImageBuffer(BufferAddress, &BufferSize))status = STATUS_INVALID_IMAGE_FORMAT;
61+
if (!RtlIsValidImageBuffer(BufferAddress, &BufferSize) && !(dwFlags & LOAD_FLAGS_PASS_IMAGE_CHECK))status = STATUS_INVALID_IMAGE_FORMAT;
6262
}
6363
__except (EXCEPTION_EXECUTE_HANDLER) {
6464
status = GetExceptionCode();

MemoryModule/Utils.cpp

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ NTSTATUS NTAPI RtlFindMemoryBlockFromModuleSection(
258258
#endif
259259

260260

261-
static __forceinline WORD CalcCheckSum(DWORD StartValue, LPVOID BaseAddress, DWORD WordCount) {
261+
static WORD CalcCheckSum(DWORD StartValue, LPVOID BaseAddress, DWORD WordCount) {
262262
LPWORD Ptr = (LPWORD)BaseAddress;
263263
DWORD Sum = StartValue;
264264
for (DWORD i = 0; i < WordCount; i++) {
@@ -269,17 +269,14 @@ static __forceinline WORD CalcCheckSum(DWORD StartValue, LPVOID BaseAddress, DWO
269269
return (WORD)(LOWORD(Sum) + HIWORD(Sum));
270270
}
271271

272-
BOOLEAN __forceinline WINAPI CheckSumBufferedFile(LPVOID BaseAddress, DWORD BufferLength) {
273-
PIMAGE_NT_HEADERS header = RtlImageNtHeader(BaseAddress);
274-
DWORD CalcSum = CalcCheckSum(0, BaseAddress, (BufferLength + 1) / sizeof(WORD));
275-
DWORD HdrSum = header->OptionalHeader.CheckSum;
276-
if (!HdrSum)return TRUE;
272+
static BOOLEAN CheckSumBufferedFile(LPVOID BaseAddress, DWORD BufferLength, DWORD CheckSum) {
273+
DWORD CalcSum = CalcCheckSum(0, BaseAddress, (BufferLength + 1) / sizeof(WORD)), HdrSum = CheckSum;
277274

278-
if (!header) return FALSE;
279275
if (LOWORD(CalcSum) >= LOWORD(HdrSum)) CalcSum -= LOWORD(HdrSum);
280276
else CalcSum = ((LOWORD(CalcSum) - LOWORD(HdrSum)) & 0xFFFF) - 1;
281277
if (LOWORD(CalcSum) >= HIWORD(HdrSum)) CalcSum -= HIWORD(HdrSum);
282278
else CalcSum = ((LOWORD(CalcSum) - HIWORD(HdrSum)) & 0xFFFF) - 1;
279+
283280
CalcSum += BufferLength;
284281
return HdrSum == CalcSum;
285282
}
@@ -301,10 +298,9 @@ BOOLEAN NTAPI RtlIsValidImageBuffer(
301298
headers.nt = RtlImageNtHeader(Buffer);
302299
PIMAGE_SECTION_HEADER sections = nullptr;
303300
size_t SizeofImage = 0;
301+
DWORD CheckSum = 0;
304302

305-
if (!headers.nt) {
306-
return FALSE;
307-
}
303+
if (!headers.nt) return FALSE;
308304

309305
switch (headers.nt->OptionalHeader.Magic) {
310306
case IMAGE_NT_OPTIONAL_HDR32_MAGIC:
@@ -316,6 +312,9 @@ BOOLEAN NTAPI RtlIsValidImageBuffer(
316312

317313
//Signature size
318314
SizeofImage += headers.nt32->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY].Size;
315+
316+
CheckSum = headers.nt32->OptionalHeader.CheckSum;
317+
319318
break;
320319
case IMAGE_NT_OPTIONAL_HDR64_MAGIC:
321320
sections = PIMAGE_SECTION_HEADER((char*)&headers.nt64->OptionalHeader + headers.nt64->FileHeader.SizeOfOptionalHeader);
@@ -324,14 +323,20 @@ BOOLEAN NTAPI RtlIsValidImageBuffer(
324323
for (WORD i = 0; i < headers.nt64->FileHeader.NumberOfSections; ++i, ++sections)
325324
SizeofImage += sections->SizeOfRawData;
326325
SizeofImage += headers.nt64->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY].Size;
326+
327+
CheckSum = headers.nt64->OptionalHeader.CheckSum;
328+
327329
break;
328330
default:
329331
return FALSE;
330332
}
331-
IMAGE_FIRST_SECTION(headers.nt32);
333+
332334
ProbeForRead(Buffer, SizeofImage);
333335
if (Size)*Size = SizeofImage;
334-
result = CheckSumBufferedFile(Buffer, (DWORD)SizeofImage);
336+
337+
if (!CheckSum)return TRUE;
338+
339+
result = CheckSumBufferedFile(Buffer, (DWORD)SizeofImage, CheckSum);
335340
}
336341
__except (EXCEPTION_EXECUTE_HANDLER) {
337342
SetLastError(RtlNtStatusToDosError(GetExceptionCode()));

0 commit comments

Comments
 (0)