@@ -52,7 +52,8 @@ typedef enum _PVP_IMAGE_GENERAL_INDEX
52
52
PVP_IMAGE_GENERAL_INDEX_IMAGESIZE ,
53
53
PVP_IMAGE_GENERAL_INDEX_ENTRYPOINT ,
54
54
PVP_IMAGE_GENERAL_INDEX_CHECKSUM ,
55
- PVP_IMAGE_GENERAL_INDEX_CHECKSUMIAT ,
55
+ //PVP_IMAGE_GENERAL_INDEX_CHECKSUMIAT,
56
+ PVP_IMAGE_GENERAL_INDEX_HEADERSPARE ,
56
57
PVP_IMAGE_GENERAL_INDEX_SUBSYSTEM ,
57
58
PVP_IMAGE_GENERAL_INDEX_SUBSYSTEMVERSION ,
58
59
PVP_IMAGE_GENERAL_INDEX_CHARACTERISTICS ,
@@ -477,38 +478,11 @@ static NTSTATUS CheckSumImageThreadStart(
477
478
)
478
479
{
479
480
HWND windowHandle = Parameter ;
480
- PPH_STRING importHash = NULL ;
481
481
ULONG checkSum ;
482
- HANDLE fileHandle ;
483
482
484
483
checkSum = PhCheckSumMappedImage (& PvMappedImage );
485
484
486
- if (NT_SUCCESS (PhCreateFileWin32 (
487
- & fileHandle ,
488
- PhGetString (PvFileName ),
489
- FILE_READ_DATA | SYNCHRONIZE ,
490
- FILE_ATTRIBUTE_NORMAL ,
491
- FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE ,
492
- FILE_OPEN ,
493
- FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT
494
- )))
495
- {
496
- BYTE importTableMd5Hash [16 ];
497
-
498
- if (NT_SUCCESS (RtlComputeImportTableHash (fileHandle , importTableMd5Hash , RTL_IMPORT_TABLE_HASH_REVISION )))
499
- {
500
- importHash = PhBufferToHexString (importTableMd5Hash , 16 );
501
- }
502
-
503
- NtClose (fileHandle );
504
- }
505
-
506
- PostMessage (
507
- windowHandle ,
508
- PVM_CHECKSUM_DONE ,
509
- checkSum ,
510
- (LPARAM )importHash
511
- );
485
+ PostMessage (windowHandle , PVM_CHECKSUM_DONE , checkSum , 0 );
512
486
513
487
return STATUS_SUCCESS ;
514
488
}
@@ -546,7 +520,7 @@ VERIFY_RESULT PvpVerifyFileWithAdditionalCatalog(
546
520
PhSkipStringRef (& remainingFileName , windowsAppsPath -> Length );
547
521
indexOfBackslash = PhFindCharInStringRef (& remainingFileName , OBJ_NAME_PATH_SEPARATOR , FALSE);
548
522
549
- if (indexOfBackslash != -1 )
523
+ if (indexOfBackslash != SIZE_MAX )
550
524
{
551
525
baseFileName .Buffer = FileName -> Buffer ;
552
526
baseFileName .Length = windowsAppsPath -> Length + indexOfBackslash * sizeof (WCHAR );
@@ -818,7 +792,6 @@ VOID PvpSetPeImageSize(
818
792
PPH_STRING string ;
819
793
ULONG lastRawDataAddress = 0 ;
820
794
ULONG64 lastRawDataOffset = 0 ;
821
- ULONG64 lastRawDataAddressSize = 0 ;
822
795
823
796
// https://reverseengineering.stackexchange.com/questions/2014/how-can-one-extract-the-appended-data-of-a-portable-executable/2015#2015
824
797
@@ -907,13 +880,38 @@ VOID PvpSetPeImageCheckSum(
907
880
string = PhFormatString (L"0x%I32x (verifying...)" , PvMappedImage .NtHeaders -> OptionalHeader .CheckSum ); // same for 32-bit and 64-bit images
908
881
909
882
PhSetListViewSubItem (ListViewHandle , PVP_IMAGE_GENERAL_INDEX_CHECKSUM , 1 , string -> Buffer );
910
- PhSetListViewSubItem (ListViewHandle , PVP_IMAGE_GENERAL_INDEX_CHECKSUMIAT , 1 , L"(verifying...)" );
911
883
912
884
PhQueueItemWorkQueue (PhGetGlobalWorkQueue (), CheckSumImageThreadStart , WindowHandle );
913
885
914
886
PhDereferenceObject (string );
915
887
}
916
888
889
+ VOID PvpSetPeImageSpareHeaderBytes (
890
+ _In_ HWND ListViewHandle
891
+ )
892
+ {
893
+ if (PvMappedImage .Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC )
894
+ {
895
+ ULONG nativeHeadersLength = PtrToUlong (PTR_SUB_OFFSET (PvMappedImage .NtHeaders32 , PvMappedImage .ViewBase ));
896
+ ULONG optionalHeadersLength = UFIELD_OFFSET (IMAGE_NT_HEADERS32 , OptionalHeader ) + PvMappedImage .NtHeaders32 -> FileHeader .SizeOfOptionalHeader ;
897
+ ULONG sectionsLength = PvMappedImage .NtHeaders32 -> FileHeader .NumberOfSections * sizeof (IMAGE_SECTION_HEADER );
898
+ ULONG totalLength = nativeHeadersLength + optionalHeadersLength + sectionsLength ;
899
+ ULONG spareLength = PtrToUlong (PTR_SUB_OFFSET (PvMappedImage .NtHeaders32 -> OptionalHeader .SizeOfHeaders , totalLength ));
900
+
901
+ PhSetListViewSubItem (ListViewHandle , PVP_IMAGE_GENERAL_INDEX_HEADERSPARE , 1 , PhaFormatSize (spareLength , ULONG_MAX )-> Buffer );
902
+ }
903
+ else if (PvMappedImage .Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC )
904
+ {
905
+ ULONG nativeHeadersLength = PtrToUlong (PTR_SUB_OFFSET (PvMappedImage .NtHeaders , PvMappedImage .ViewBase ));
906
+ ULONG optionalHeadersLength = UFIELD_OFFSET (IMAGE_NT_HEADERS64 , OptionalHeader ) + PvMappedImage .NtHeaders -> FileHeader .SizeOfOptionalHeader ;
907
+ ULONG sectionsLength = PvMappedImage .NtHeaders -> FileHeader .NumberOfSections * sizeof (IMAGE_SECTION_HEADER );
908
+ ULONG totalLength = nativeHeadersLength + optionalHeadersLength + sectionsLength ;
909
+ ULONG spareLength = PtrToUlong (PTR_SUB_OFFSET (PvMappedImage .NtHeaders -> OptionalHeader .SizeOfHeaders , totalLength ));
910
+
911
+ PhSetListViewSubItem (ListViewHandle , PVP_IMAGE_GENERAL_INDEX_HEADERSPARE , 1 , PhaFormatSize (spareLength , ULONG_MAX )-> Buffer );
912
+ }
913
+ }
914
+
917
915
VOID PvpSetPeImageSubsystem (
918
916
_In_ HWND ListViewHandle
919
917
)
@@ -1045,14 +1043,14 @@ VOID PvpSetPeImageCharacteristics(
1045
1043
& debugEntry
1046
1044
)))
1047
1045
{
1048
- ULONG characteristics = ULONG_MAX ;
1046
+ ULONG characteristicsEx = ULONG_MAX ;
1049
1047
1050
1048
if (debugEntryLength == sizeof (ULONG ))
1051
- characteristics = * (ULONG * )debugEntry ;
1049
+ characteristicsEx = * (ULONG * )debugEntry ;
1052
1050
1053
- if (characteristics != ULONG_MAX )
1051
+ if (characteristicsEx != ULONG_MAX )
1054
1052
{
1055
- if (characteristics & IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT )
1053
+ if (characteristicsEx & IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT )
1056
1054
PhAppendStringBuilder2 (& stringBuilder , L"CET compatible, " );
1057
1055
}
1058
1056
}
@@ -1382,7 +1380,8 @@ VOID PvpSetPeImageProperties(
1382
1380
PhAddListViewGroupItem (Context -> ListViewHandle , PVP_IMAGE_GENERAL_CATEGORY_BASICINFO , PVP_IMAGE_GENERAL_INDEX_IMAGESIZE , L"Image size" , NULL );
1383
1381
PhAddListViewGroupItem (Context -> ListViewHandle , PVP_IMAGE_GENERAL_CATEGORY_BASICINFO , PVP_IMAGE_GENERAL_INDEX_ENTRYPOINT , L"Entry point" , NULL );
1384
1382
PhAddListViewGroupItem (Context -> ListViewHandle , PVP_IMAGE_GENERAL_CATEGORY_BASICINFO , PVP_IMAGE_GENERAL_INDEX_CHECKSUM , L"Header checksum" , NULL );
1385
- PhAddListViewGroupItem (Context -> ListViewHandle , PVP_IMAGE_GENERAL_CATEGORY_BASICINFO , PVP_IMAGE_GENERAL_INDEX_CHECKSUMIAT , L"Import checksum" , NULL );
1383
+ //PhAddListViewGroupItem(Context->ListViewHandle, PVP_IMAGE_GENERAL_CATEGORY_BASICINFO, PVP_IMAGE_GENERAL_INDEX_CHECKSUMIAT, L"Import checksum", NULL);
1384
+ PhAddListViewGroupItem (Context -> ListViewHandle , PVP_IMAGE_GENERAL_CATEGORY_BASICINFO , PVP_IMAGE_GENERAL_INDEX_HEADERSPARE , L"Header spare" , NULL );
1386
1385
PhAddListViewGroupItem (Context -> ListViewHandle , PVP_IMAGE_GENERAL_CATEGORY_BASICINFO , PVP_IMAGE_GENERAL_INDEX_SUBSYSTEM , L"Subsystem" , NULL );
1387
1386
PhAddListViewGroupItem (Context -> ListViewHandle , PVP_IMAGE_GENERAL_CATEGORY_BASICINFO , PVP_IMAGE_GENERAL_INDEX_SUBSYSTEMVERSION , L"Subsystem version" , NULL );
1388
1387
PhAddListViewGroupItem (Context -> ListViewHandle , PVP_IMAGE_GENERAL_CATEGORY_BASICINFO , PVP_IMAGE_GENERAL_INDEX_CHARACTERISTICS , L"Characteristics" , NULL );
@@ -1403,6 +1402,7 @@ VOID PvpSetPeImageProperties(
1403
1402
PvpSetPeImageSize (Context -> ListViewHandle );
1404
1403
PvpSetPeImageEntryPoint (Context -> ListViewHandle );
1405
1404
PvpSetPeImageCheckSum (Context -> WindowHandle , Context -> ListViewHandle );
1405
+ PvpSetPeImageSpareHeaderBytes (Context -> ListViewHandle );
1406
1406
PvpSetPeImageSubsystem (Context -> ListViewHandle );
1407
1407
PvpSetPeImageCharacteristics (Context -> ListViewHandle );
1408
1408
// File information
@@ -1621,13 +1621,11 @@ INT_PTR CALLBACK PvpPeGeneralDlgProc(
1621
1621
case PVM_CHECKSUM_DONE :
1622
1622
{
1623
1623
PPH_STRING string ;
1624
- PPH_STRING importTableHash ;
1625
1624
ULONG headerCheckSum ;
1626
1625
ULONG realCheckSum ;
1627
1626
1628
1627
headerCheckSum = PvMappedImage .NtHeaders -> OptionalHeader .CheckSum ; // same for 32-bit and 64-bit images
1629
1628
realCheckSum = (ULONG )wParam ;
1630
- importTableHash = (PPH_STRING )lParam ;
1631
1629
1632
1630
if (headerCheckSum == 0 )
1633
1631
{
@@ -1648,12 +1646,6 @@ INT_PTR CALLBACK PvpPeGeneralDlgProc(
1648
1646
PhSetListViewSubItem (context -> ListViewHandle , PVP_IMAGE_GENERAL_INDEX_CHECKSUM , 1 , string -> Buffer );
1649
1647
PhDereferenceObject (string );
1650
1648
}
1651
-
1652
- if (importTableHash )
1653
- {
1654
- PhSetListViewSubItem (context -> ListViewHandle , PVP_IMAGE_GENERAL_INDEX_CHECKSUMIAT , 1 , PhGetStringOrEmpty (importTableHash ));
1655
- PhDereferenceObject (importTableHash );
1656
- }
1657
1649
}
1658
1650
break ;
1659
1651
case PVM_VERIFY_DONE :
0 commit comments