From efecb84a9fac99dabe16c332b61bd3c6c70ddec7 Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Thu, 29 Aug 2024 17:48:27 +0100 Subject: Fix module callbacks related crash (#790) Check optional headers size Check size and address of the image directory --- primedev/thirdparty/silver-bun/module.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/primedev/thirdparty/silver-bun/module.cpp b/primedev/thirdparty/silver-bun/module.cpp index dceb602a..26e9b6b6 100644 --- a/primedev/thirdparty/silver-bun/module.cpp +++ b/primedev/thirdparty/silver-bun/module.cpp @@ -69,11 +69,15 @@ void CModule::Init() // Get the location of IMAGE_IMPORT_DESCRIPTOR for this module by adding the IMAGE_DIRECTORY_ENTRY_IMPORT relative virtual address onto our // module base address. - IMAGE_IMPORT_DESCRIPTOR* pImageImportDescriptors = reinterpret_cast( - m_pModuleBase + m_pNTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress); - if (!pImageImportDescriptors) + + if (m_pNTHeaders->FileHeader.SizeOfOptionalHeader == 0) + return; + + IMAGE_DATA_DIRECTORY& imageDirectory = m_pNTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]; + if (imageDirectory.Size == 0 || imageDirectory.VirtualAddress == 0) return; + IMAGE_IMPORT_DESCRIPTOR* pImageImportDescriptors = reinterpret_cast(m_pModuleBase + imageDirectory.VirtualAddress); for (IMAGE_IMPORT_DESCRIPTOR* pIID = pImageImportDescriptors; pIID->Name != 0; pIID++) { // Get virtual relative Address of the imported module name. Then add module base Address to get the actual location. -- cgit v1.2.3