diff --git a/Source/ResourceEditor.cpp b/Source/ResourceEditor.cpp index 8b216aa7..653eb369 100644 --- a/Source/ResourceEditor.cpp +++ b/Source/ResourceEditor.cpp @@ -125,10 +125,11 @@ PRESOURCE_DIRECTORY CResourceEditor::GetResourceDirectory( // Construction/Destruction ////////////////////////////////////////////////////////////////////// -CResourceEditor::CResourceEditor(BYTE* pbPE, int iSize) { +CResourceEditor::CResourceEditor(BYTE* pbPE, int iSize, bool bKeepData /*=true*/) { // Copy the data pointer m_pbPE = pbPE; m_iSize = iSize; + m_bKeepData = bKeepData; // Get NT headers m_ntHeaders = GetNTHeaders(m_pbPE); @@ -270,6 +271,9 @@ bool CResourceEditor::UpdateResource(WORD szType, WORD szName, LANGID wLanguage, // Returns a copy of the requested resource // Returns 0 if the requested resource can't be found BYTE* CResourceEditor::GetResourceW(WCHAR* szType, WCHAR* szName, LANGID wLanguage) { + if (!m_bKeepData) + throw runtime_error("Can't GetResource() when bKeepData is false"); + CResourceDirectory* nameDir = 0; CResourceDirectory* langDir = 0; CResourceDataEntry* data = 0; @@ -398,6 +402,9 @@ void CResourceEditor::FreeResource(BYTE* pbResource) // Saves the edited PE into a buffer and returns it. DWORD CResourceEditor::Save(BYTE* pbBuf, DWORD &dwSize) { + if (!m_bKeepData) + throw runtime_error("Can't Save() when bKeepData is false"); + unsigned int i; DWORD dwReqSize; @@ -624,6 +631,18 @@ CResourceDirectory* CResourceEditor::ScanDirectory(PRESOURCE_DIRECTORY rdRoot, P LPBYTE pbData = (LPBYTE)rdRoot + ConvertEndianness(rde->OffsetToData) - m_dwResourceSectionVA; DWORD dwOffset = DWORD(pbData - m_pbPE); + if (m_bKeepData) + { + if (dwOffset > m_iSize) + { + throw runtime_error("Invalid resource entry data pointer, possibly compressed resources"); + } + } + else + { + pbData = m_pbPE; // dummy pointer to "nothing" + } + rdc->AddEntry( new CResourceDirectoryEntry( szName, diff --git a/Source/ResourceEditor.h b/Source/ResourceEditor.h index 5174e4d5..51b1bdbf 100644 --- a/Source/ResourceEditor.h +++ b/Source/ResourceEditor.h @@ -109,7 +109,7 @@ typedef struct RESOURCE_DIRECTORY { ) class CResourceEditor { public: - CResourceEditor(BYTE* pbPE, int iSize); + CResourceEditor(BYTE* pbPE, int iSize, bool bKeepData = true); virtual ~CResourceEditor(); bool UpdateResource(WORD szType, WORD szName, LANGID wLanguage, BYTE* lpData, DWORD dwSize); @@ -144,6 +144,7 @@ public: private: BYTE* m_pbPE; int m_iSize; + bool m_bKeepData; PIMAGE_NT_HEADERS m_ntHeaders; diff --git a/Source/icon.cpp b/Source/icon.cpp index c47beb4a..4c2ad0b1 100644 --- a/Source/icon.cpp +++ b/Source/icon.cpp @@ -368,7 +368,7 @@ int generate_unicons_offsets(LPBYTE exeHeader, size_t exeHeaderSize, LPBYTE unin DWORD offset; DWORD size; - CResourceEditor re(exeHeader, exeHeaderSize); + CResourceEditor re(exeHeader, exeHeaderSize, false); LPBYTE seeker = uninstIconData; @@ -397,7 +397,7 @@ int generate_unicons_offsets(LPBYTE exeHeader, size_t exeHeaderSize, LPBYTE unin size = FIX_ENDIAN_INT32(*(LPDWORD)seeker); seeker += sizeof(DWORD); - if (real_size < size) + if (real_size != size) { throw runtime_error("invalid icon size (possibly compressed icon)"); }