99
1010
1111PEParser::PEParser (const wchar_t * path) :_path(path) {
12- _hFile = ::CreateFile (path, GENERIC_READ | GENERIC_WRITE ,
13- FILE_SHARE_READ | FILE_SHARE_WRITE , nullptr , OPEN_EXISTING, 0 , nullptr );
12+ _hFile = ::CreateFile (path, GENERIC_READ,
13+ FILE_SHARE_READ, nullptr , OPEN_EXISTING, 0 , nullptr );
1414 if (_hFile == INVALID_HANDLE_VALUE)
1515 return ;
1616 ::GetFileSizeEx (_hFile, &_fileSize);
17- _hMemMap = ::CreateFileMapping (_hFile, nullptr , PAGE_READWRITE , 0 , 0 , nullptr );
17+ _hMemMap = ::CreateFileMapping (_hFile, nullptr , PAGE_READONLY , 0 , 0 , nullptr );
1818 if (!_hMemMap)
1919 return ;
2020
21- _address = (PBYTE)::MapViewOfFile (_hMemMap, FILE_MAP_ALL_ACCESS , 0 , 0 , 0 );
21+ _address = (PBYTE)::MapViewOfFile (_hMemMap, FILE_MAP_READ , 0 , 0 , 0 );
2222 if (!_address)
2323 return ;
2424
@@ -496,4 +496,54 @@ void PEParser::RelocateImageByDelta(std::vector<RelocInfo>& relocs, const uint64
496496
497497PVOID PEParser::GetDataDirectoryAddress (UINT index, PULONG size) const {
498498 return ::ImageDirectoryEntryToData (_address, FALSE , index, size);
499+ }
500+
501+ void PEParser::SetDefaultFileAligment () {
502+ if (IsPe64 ()) {
503+ GetOptionalHeader64 ().FileAlignment = _fileAlignmentConstant;
504+ }
505+ else {
506+ GetOptionalHeader32 ().FileAlignment = _fileAlignmentConstant;
507+ }
508+ }
509+
510+ DWORD PEParser::GetSectionAlignment () {
511+ if (IsPe64 ()) {
512+ return GetOptionalHeader64 ().SectionAlignment ;
513+ }
514+ else {
515+ return GetOptionalHeader32 ().SectionAlignment ;
516+ }
517+ }
518+
519+ DWORD PEParser::GetFileAlignment () {
520+ if (IsPe64 ()) {
521+ return GetOptionalHeader64 ().FileAlignment ;
522+ }
523+ else {
524+ return GetOptionalHeader32 ().FileAlignment ;
525+ }
526+ }
527+
528+ DWORD PEParser::AlignValue (DWORD badValue, DWORD alignTo) {
529+ return (badValue + alignTo - 1 ) & ~(alignTo - 1 );
530+ }
531+
532+ void PEParser::AlignAllSectionHeaders () {
533+ auto sections = _sections;
534+ DWORD sectionAlignment = GetSectionAlignment ();
535+ DWORD fileAlignment = GetFileAlignment ();
536+ DWORD newFileSize = 0 ;
537+
538+ newFileSize = _dosHeader->e_lfanew + sizeof (DWORD) + sizeof (IMAGE_FILE_HEADER) +
539+ _ntHeader->FileHeader .SizeOfOptionalHeader * sizeof (IMAGE_SECTION_HEADER);
540+
541+ for (int i = 0 ; i < GetSectionCount (); ++i) {
542+ sections[i].VirtualAddress = AlignValue (sections[i].VirtualAddress , sectionAlignment);
543+ sections[i].Misc .VirtualSize = AlignValue (sections[i].Misc .VirtualSize , sectionAlignment);
544+
545+ sections[i].PointerToRawData = AlignValue (newFileSize, fileAlignment);
546+
547+ newFileSize = sections[i].PointerToRawData + sections[i].SizeOfRawData ;
548+ }
499549}
0 commit comments