99#pragma comment(lib,"imagehlp")
1010
1111
12- PEParser::PEParser (const wchar_t * path) :_path(path) {
13- _hFile = ::CreateFile (path, GENERIC_READ,
14- FILE_SHARE_READ, nullptr , OPEN_EXISTING, 0 , nullptr );
15- if (_hFile == INVALID_HANDLE_VALUE)
16- return ;
17- ::GetFileSizeEx (_hFile, &_fileSize);
18- _hMemMap = ::CreateFileMapping (_hFile, nullptr , PAGE_READONLY, 0 , 0 , nullptr );
19- if (!_hMemMap)
20- return ;
21-
22- _address = (PBYTE)::MapViewOfFile (_hMemMap, FILE_MAP_READ, 0 , 0 , 0 );
23- if (!_address)
24- return ;
12+ PEParser::PEParser (const wchar_t * path,bool isScylla) :_path(path) {
13+ if (isScylla) {
14+ _hFile = ::CreateFile (path, GENERIC_READ|GENERIC_WRITE,
15+ FILE_SHARE_READ| FILE_SHARE_WRITE, nullptr , OPEN_EXISTING, 0 , nullptr );
16+ if (_hFile == INVALID_HANDLE_VALUE)
17+ return ;
18+ ::GetFileSizeEx (_hFile, &_fileSize);
19+ _hMemMap = ::CreateFileMapping (_hFile, nullptr , PAGE_READWRITE, 0 , 0 , nullptr );
20+ if (!_hMemMap)
21+ return ;
22+
23+ _address = (PBYTE)::MapViewOfFile (_hMemMap, FILE_MAP_READ|FILE_MAP_WRITE, 0 , 0 , 0 );
24+ if (!_address)
25+ return ;
26+ }
27+ else {
28+ _hFile = ::CreateFile (path, GENERIC_READ,
29+ FILE_SHARE_READ, nullptr , OPEN_EXISTING, 0 , nullptr );
30+ if (_hFile == INVALID_HANDLE_VALUE)
31+ return ;
32+ ::GetFileSizeEx (_hFile, &_fileSize);
33+ _hMemMap = ::CreateFileMapping (_hFile, nullptr , PAGE_READONLY, 0 , 0 , nullptr );
34+ if (!_hMemMap)
35+ return ;
36+
37+ _address = (PBYTE)::MapViewOfFile (_hMemMap, FILE_MAP_READ, 0 , 0 , 0 );
38+ if (!_address)
39+ return ;
40+ }
2541
2642 CheckValidity ();
2743 if (IsValid ()) {
@@ -665,16 +681,22 @@ void PEParser::AlignAllSectionHeaders() {
665681 DWORD fileAlignment = GetFileAlignment ();
666682 DWORD newFileSize = 0 ;
667683
684+
685+ std::sort (_PESections.begin (), _PESections.end (), [](const PEFileSection& d1, const PEFileSection& d2) {
686+ return d1._sectionHeader .PointerToRawData < d2._sectionHeader .PointerToRawData ;
687+ });
688+
668689 newFileSize = _dosHeader->e_lfanew + sizeof (DWORD) + sizeof (IMAGE_FILE_HEADER) +
669- _ntHeader->FileHeader .SizeOfOptionalHeader * sizeof (IMAGE_SECTION_HEADER);
690+ _ntHeader->FileHeader .SizeOfOptionalHeader + GetSectionCount () * sizeof (IMAGE_SECTION_HEADER);
670691
671692 for (int i = 0 ; i < GetSectionCount (); ++i) {
672- sections [i].VirtualAddress = AlignValue (sections[i].VirtualAddress , sectionAlignment);
673- sections [i].Misc .VirtualSize = AlignValue (sections[i].Misc .VirtualSize , sectionAlignment);
693+ _PESections [i]. _sectionHeader .VirtualAddress = AlignValue (sections[i].VirtualAddress , sectionAlignment);
694+ _PESections [i]. _sectionHeader .Misc .VirtualSize = AlignValue (sections[i].Misc .VirtualSize , sectionAlignment);
674695
675- sections[i].PointerToRawData = AlignValue (newFileSize, fileAlignment);
696+ _PESections[i]._sectionHeader .PointerToRawData = AlignValue (newFileSize, fileAlignment);
697+ _PESections[i]._sectionHeader .SizeOfRawData = AlignValue (_PESections[i]._dataSize , fileAlignment);
676698
677- newFileSize = sections [i].PointerToRawData + sections [i].SizeOfRawData ;
699+ newFileSize = _PESections [i]._sectionHeader . PointerToRawData + _PESections [i]. _sectionHeader .SizeOfRawData ;
678700 }
679701
680702 std::sort (_PESections.begin (), _PESections.end (), [](const PEFileSection& d1, const PEFileSection& d2) {
@@ -717,6 +739,8 @@ void PEParser::FixPEHeader() {
717739 _opt64->NumberOfRvaAndSizes = IMAGE_NUMBEROF_DIRECTORY_ENTRIES;
718740 _fileHeader->SizeOfOptionalHeader = sizeof (IMAGE_OPTIONAL_HEADER64);
719741
742+ _opt64->SizeOfImage = GetSectionHeaderBasedSizeOfImage ();
743+
720744 if (_moduleBase) {
721745 _opt64->ImageBase = _moduleBase;
722746 }
@@ -847,6 +871,7 @@ void PEParser::GetPESections() {
847871
848872 for (WORD i = 0 ; i < count; i++) {
849873 _PESections[i]._normalSize = _sections[i].Misc .VirtualSize ;
874+ _PESections[i]._dataSize = _sections[i].Misc .VirtualSize ;
850875 offset = _sections[i].VirtualAddress ;
851876 GetPESectionData (offset, _PESections[i]);
852877 }
@@ -938,8 +963,7 @@ bool PEParser::SavePEFileToDisk(const WCHAR* pNewFile) {
938963 writeSize = sizeof (IMAGE_SECTION_HEADER);
939964 auto sections = GetSections ();
940965 for (WORD i = 0 ; i < GetSectionCount (); i++) {
941- auto section = sections[i];
942- if (!WriteMemoryToFile (_hFile, fileOffset, writeSize, §ion)) {
966+ if (!WriteMemoryToFile (_hFile, fileOffset, writeSize, &_PESections[i]._sectionHeader )) {
943967 ret = false ;
944968 break ;
945969 }
@@ -948,12 +972,11 @@ bool PEParser::SavePEFileToDisk(const WCHAR* pNewFile) {
948972
949973
950974 for (WORD i = 0 ; i < GetSectionCount (); i++) {
951- auto section = sections[i];
952- if (!section.PointerToRawData )
975+ if (!_PESections[i]._sectionHeader .PointerToRawData )
953976 continue ;
954977
955- if (section .PointerToRawData > fileOffset) {
956- writeSize = section .PointerToRawData - fileOffset;
978+ if (_PESections[i]. _sectionHeader .PointerToRawData > fileOffset) {
979+ writeSize = _PESections[i]. _sectionHeader .PointerToRawData - fileOffset;
957980
958981 if (!WriteZeroMemoryToFile (_hFile, fileOffset, writeSize)) {
959982 ret = false ;
@@ -962,15 +985,24 @@ bool PEParser::SavePEFileToDisk(const WCHAR* pNewFile) {
962985 fileOffset += writeSize;
963986 }
964987
965- writeSize = section .SizeOfRawData ;
988+ writeSize = _PESections[i]. _sectionHeader .SizeOfRawData ;
966989
967990 if (writeSize) {
968- BYTE* pData = GetFileAddress (section. PointerToRawData );
969- if (! WriteMemoryToFile (_hFile, section. PointerToRawData , writeSize, pData )) {
991+ if (! WriteMemoryToFile (_hFile, _PESections[i]. _sectionHeader . PointerToRawData ,
992+ writeSize, _PESections[i]. _pData )) {
970993 ret = false ;
971994 break ;
972995 }
973996 fileOffset += writeSize;
997+
998+ if (_PESections[i]._dataSize < _PESections[i]._sectionHeader .SizeOfRawData ) {
999+ writeSize = _PESections[i]._sectionHeader .SizeOfRawData - _PESections[i]._dataSize ;
1000+ if (!WriteZeroMemoryToFile (_hFile, fileOffset, writeSize)) {
1001+ ret = false ;
1002+ break ;
1003+ }
1004+ fileOffset += writeSize;
1005+ }
9741006 }
9751007 }
9761008
0 commit comments