mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 17:34:57 +00:00
Implemented LdrVerifyImageMatchesChecksum().
svn path=/trunk/; revision=4875
This commit is contained in:
parent
b7bf13d061
commit
b99ad0e0a6
4 changed files with 175 additions and 7 deletions
|
@ -96,8 +96,8 @@ LdrGetDllHandle(IN ULONG Unknown1,
|
|||
OUT PVOID *BaseAddress);
|
||||
|
||||
NTSTATUS STDCALL
|
||||
LdrFindEntryForAddress(PVOID Address,
|
||||
PLDR_MODULE *Module);
|
||||
LdrFindEntryForAddress(IN PVOID Address,
|
||||
OUT PLDR_MODULE *Module);
|
||||
|
||||
NTSTATUS STDCALL
|
||||
LdrGetProcedureAddress(IN PVOID BaseAddress,
|
||||
|
@ -131,6 +131,12 @@ LdrShutdownThread(VOID);
|
|||
NTSTATUS STDCALL
|
||||
LdrUnloadDll(IN PVOID BaseAddress);
|
||||
|
||||
NTSTATUS STDCALL
|
||||
LdrVerifyImageMatchesChecksum (IN HANDLE FileHandle,
|
||||
ULONG Unknown1,
|
||||
ULONG Unknown2,
|
||||
ULONG Unknown3);
|
||||
|
||||
#endif /* __NTOSKRNL_INCLUDE_INTERNAL_LDR_H */
|
||||
|
||||
/* EOF */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
; $Id: ntdll.def,v 1.101 2003/06/07 11:32:42 ekohl Exp $
|
||||
; $Id: ntdll.def,v 1.102 2003/06/09 13:44:11 ekohl Exp $
|
||||
;
|
||||
; ReactOS Operating System
|
||||
;
|
||||
|
@ -52,7 +52,7 @@ LdrQueryProcessModuleInformation@12
|
|||
LdrShutdownProcess@0
|
||||
LdrShutdownThread@0
|
||||
LdrUnloadDll@4
|
||||
;LdrVerifyImageMatchesChecksum@16
|
||||
LdrVerifyImageMatchesChecksum@16
|
||||
NlsAnsiCodePage DATA
|
||||
NlsMbCodePageTag DATA
|
||||
NlsMbOemCodePageTag DATA
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
; $Id: ntdll.edf,v 1.90 2003/06/07 11:32:42 ekohl Exp $
|
||||
; $Id: ntdll.edf,v 1.91 2003/06/09 13:44:11 ekohl Exp $
|
||||
;
|
||||
; ReactOS Operating System
|
||||
;
|
||||
|
@ -52,7 +52,7 @@ LdrQueryProcessModuleInformation=LdrQueryProcessModuleInformation@12
|
|||
LdrShutdownProcess=LdrShutdownProcess@0
|
||||
LdrShutdownThread=LdrShutdownThread@0
|
||||
LdrUnloadDll=LdrUnloadDll@4
|
||||
;LdrVerifyImageMatchesChecksum=LdrVerifyImageMatchesChecksum@16
|
||||
LdrVerifyImageMatchesChecksum=LdrVerifyImageMatchesChecksum@16
|
||||
NlsAnsiCodePage DATA
|
||||
NlsMbCodePageTag DATA
|
||||
NlsMbOemCodePageTag DATA
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: utils.c,v 1.65 2003/05/12 19:47:53 ekohl Exp $
|
||||
/* $Id: utils.c,v 1.66 2003/06/09 13:43:42 ekohl Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -1879,4 +1879,166 @@ LdrQueryProcessModuleInformation(IN PMODULE_INFORMATION ModuleInformation OPTION
|
|||
return(Status);
|
||||
}
|
||||
|
||||
|
||||
static BOOLEAN
|
||||
LdrpCheckImageChecksum (IN PVOID BaseAddress,
|
||||
IN ULONG ImageSize)
|
||||
{
|
||||
PIMAGE_NT_HEADERS Header;
|
||||
PUSHORT Ptr;
|
||||
ULONG Sum;
|
||||
ULONG CalcSum;
|
||||
ULONG HeaderSum;
|
||||
ULONG i;
|
||||
|
||||
Header = RtlImageNtHeader (BaseAddress);
|
||||
if (Header == NULL)
|
||||
return FALSE;
|
||||
|
||||
HeaderSum = Header->OptionalHeader.CheckSum;
|
||||
if (HeaderSum == 0)
|
||||
return TRUE;
|
||||
|
||||
Sum = 0;
|
||||
Ptr = (PUSHORT) BaseAddress;
|
||||
for (i = 0; i < ImageSize / sizeof (USHORT); i++)
|
||||
{
|
||||
Sum += (ULONG)*Ptr;
|
||||
if (HIWORD(Sum) != 0)
|
||||
{
|
||||
Sum = LOWORD(Sum) + HIWORD(Sum);
|
||||
}
|
||||
Ptr++;
|
||||
}
|
||||
|
||||
if (ImageSize & 1)
|
||||
{
|
||||
Sum += (ULONG)*((PUCHAR)Ptr);
|
||||
if (HIWORD(Sum) != 0)
|
||||
{
|
||||
Sum = LOWORD(Sum) + HIWORD(Sum);
|
||||
}
|
||||
}
|
||||
|
||||
CalcSum = (USHORT)(LOWORD(Sum) + HIWORD(Sum));
|
||||
|
||||
/* Subtract image checksum from calculated checksum. */
|
||||
/* fix low word of checksum */
|
||||
if (LOWORD(CalcSum) >= LOWORD(HeaderSum))
|
||||
{
|
||||
CalcSum -= LOWORD(HeaderSum);
|
||||
}
|
||||
else
|
||||
{
|
||||
CalcSum = ((LOWORD(CalcSum) - LOWORD(HeaderSum)) & 0xFFFF) - 1;
|
||||
}
|
||||
|
||||
/* fix high word of checksum */
|
||||
if (LOWORD(CalcSum) >= HIWORD(HeaderSum))
|
||||
{
|
||||
CalcSum -= HIWORD(HeaderSum);
|
||||
}
|
||||
else
|
||||
{
|
||||
CalcSum = ((LOWORD(CalcSum) - HIWORD(HeaderSum)) & 0xFFFF) - 1;
|
||||
}
|
||||
|
||||
/* add file length */
|
||||
CalcSum += ImageSize;
|
||||
|
||||
return (BOOLEAN)(CalcSum == HeaderSum);
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* NAME EXPORTED
|
||||
* LdrVerifyImageMatchesChecksum
|
||||
*
|
||||
* DESCRIPTION
|
||||
*
|
||||
* ARGUMENTS
|
||||
*
|
||||
* RETURN VALUE
|
||||
*
|
||||
* REVISIONS
|
||||
*
|
||||
* NOTE
|
||||
*/
|
||||
NTSTATUS STDCALL
|
||||
LdrVerifyImageMatchesChecksum (IN HANDLE FileHandle,
|
||||
ULONG Unknown1,
|
||||
ULONG Unknown2,
|
||||
ULONG Unknown3)
|
||||
{
|
||||
FILE_STANDARD_INFORMATION FileInfo;
|
||||
IO_STATUS_BLOCK IoStatusBlock;
|
||||
HANDLE SectionHandle;
|
||||
ULONG ViewSize;
|
||||
PVOID BaseAddress;
|
||||
BOOLEAN Result;
|
||||
NTSTATUS Status;
|
||||
|
||||
DPRINT ("LdrVerifyImageMatchesChecksum() called\n");
|
||||
|
||||
Status = NtCreateSection (&SectionHandle,
|
||||
SECTION_MAP_EXECUTE,
|
||||
NULL,
|
||||
NULL,
|
||||
PAGE_EXECUTE,
|
||||
SEC_COMMIT,
|
||||
FileHandle);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1 ("NtCreateSection() failed (Status %lx)\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
ViewSize = 0;
|
||||
BaseAddress = NULL;
|
||||
Status = NtMapViewOfSection (SectionHandle,
|
||||
NtCurrentProcess (),
|
||||
&BaseAddress,
|
||||
0,
|
||||
0,
|
||||
NULL,
|
||||
&ViewSize,
|
||||
ViewShare,
|
||||
0,
|
||||
PAGE_EXECUTE);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1 ("NtMapViewOfSection() failed (Status %lx)\n", Status);
|
||||
NtClose (SectionHandle);
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = NtQueryInformationFile (FileHandle,
|
||||
&IoStatusBlock,
|
||||
&FileInfo,
|
||||
sizeof (FILE_STANDARD_INFORMATION),
|
||||
FileStandardInformation);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1 ("NtMapViewOfSection() failed (Status %lx)\n", Status);
|
||||
NtUnmapViewOfSection (NtCurrentProcess (),
|
||||
BaseAddress);
|
||||
NtClose (SectionHandle);
|
||||
return Status;
|
||||
}
|
||||
|
||||
Result = LdrpCheckImageChecksum (BaseAddress,
|
||||
FileInfo.EndOfFile.u.LowPart);
|
||||
if (Result == FALSE)
|
||||
{
|
||||
Status = STATUS_IMAGE_CHECKSUM_MISMATCH;
|
||||
}
|
||||
|
||||
NtUnmapViewOfSection (NtCurrentProcess (),
|
||||
BaseAddress);
|
||||
|
||||
NtClose (SectionHandle);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
|
Loading…
Reference in a new issue