@@ -222,7 +222,7 @@ DWORD ManualMapping_Shell(MANUAL_MAPPING_DATA * pData)
222222 IMAGE_OPTIONAL_HEADER * pOptionalHeader = nullptr ;
223223 IMAGE_FILE_HEADER * pFileHeader = nullptr ;
224224
225- MANUAL_MAPPING_FUNCTION_TABLE * f = &pData->f ;
225+ auto * f = &pData->f ;
226226 f->pLdrpHeap = *f->LdrpHeap ;
227227
228228 if (!f->pLdrpHeap )
@@ -399,7 +399,9 @@ DWORD ManualMapping_Shell(MANUAL_MAPPING_DATA * pData)
399399
400400 if (LocationDelta)
401401 {
402- if (!pOptionalHeader->DataDirectory [IMAGE_DIRECTORY_ENTRY_BASERELOC].Size )
402+ auto * pRelocDir = ReCa<IMAGE_DATA_DIRECTORY*>(&pOptionalHeader->DataDirectory [IMAGE_DIRECTORY_ENTRY_BASERELOC]);
403+
404+ if (!pRelocDir->Size )
403405 {
404406 ImgSize = 0 ;
405407 f->NtFreeVirtualMemory (hProc, ReCa<void **>(&pBase), &ImgSize, MEM_RELEASE);
@@ -408,7 +410,7 @@ DWORD ManualMapping_Shell(MANUAL_MAPPING_DATA * pData)
408410 return INJ_MM_ERR_IMAGE_CANT_BE_RELOCATED;
409411 }
410412
411- IMAGE_BASE_RELOCATION * pRelocData = ReCa<IMAGE_BASE_RELOCATION*>(pBase + pOptionalHeader-> DataDirectory [IMAGE_DIRECTORY_ENTRY_BASERELOC]. VirtualAddress );
413+ auto * pRelocData = ReCa<IMAGE_BASE_RELOCATION*>(pBase + pRelocDir-> VirtualAddress );
412414
413415 while (pRelocData->VirtualAddress )
414416 {
@@ -424,7 +426,12 @@ DWORD ManualMapping_Shell(MANUAL_MAPPING_DATA * pData)
424426 }
425427 }
426428
427- pRelocData = ReCa<IMAGE_BASE_RELOCATION*>(ReCa<BYTE*>(pRelocData) + pRelocData->SizeOfBlock );
429+ pRelocData = ReCa<IMAGE_BASE_RELOCATION*>(ReCa<BYTE*>(pRelocData) + pRelocData->SizeOfBlock );
430+
431+ if (pRelocData >= reinterpret_cast <IMAGE_BASE_RELOCATION*>(pBase + pRelocDir->VirtualAddress + pRelocDir->Size ))
432+ {
433+ break ;
434+ }
428435 }
429436
430437 pOptionalHeader->ImageBase += ReCa<ULONG_PTR>(LocationDelta);
@@ -592,10 +599,10 @@ DWORD ManualMapping_Shell(MANUAL_MAPPING_DATA * pData)
592599 break ;
593600 }
594601
595- LDRP_UNICODE_STRING_BUNDLE * pModPathW = NewObject<LDRP_UNICODE_STRING_BUNDLE>(f, 1 );
602+ auto * pModPathW = NewObject<LDRP_UNICODE_STRING_BUNDLE>(f, 1 );
596603
597604 pModPathW->String .MaxLength = sizeof (pModPathW->StaticBuffer );
598- pModPathW->String .szBuffer = pModPathW->StaticBuffer ;
605+ pModPathW->String .szBuffer = pModPathW->StaticBuffer ;
599606
600607 ntRet = f->LdrpPreprocessDllName (&ModNameW, pModPathW, nullptr , &flags);
601608
@@ -641,8 +648,8 @@ DWORD ManualMapping_Shell(MANUAL_MAPPING_DATA * pData)
641648 *pModule = hDll;
642649 }
643650
644- IMAGE_THUNK_DATA * pIAT = ReCa<IMAGE_THUNK_DATA*>(pBase + pDelayImportDescr->ImportAddressTableRVA );
645- IMAGE_THUNK_DATA * pNameTable = ReCa<IMAGE_THUNK_DATA*>(pBase + pDelayImportDescr->ImportNameTableRVA );
651+ IMAGE_THUNK_DATA * pIAT = ReCa<IMAGE_THUNK_DATA*>(pBase + pDelayImportDescr->ImportAddressTableRVA );
652+ IMAGE_THUNK_DATA * pNameTable = ReCa<IMAGE_THUNK_DATA*>(pBase + pDelayImportDescr->ImportNameTableRVA );
646653
647654 for (; pIAT->u1 .Function ; ++pIAT, ++pNameTable)
648655 {
@@ -806,7 +813,7 @@ DWORD ManualMapping_Shell(MANUAL_MAPPING_DATA * pData)
806813 Callback (pBase, DLL_PROCESS_ATTACH, nullptr );
807814 }
808815 }
809-
816+
810817 if (Flags & INJ_MM_RUN_DLL_MAIN && pOptionalHeader->AddressOfEntryPoint )
811818 {
812819 f_DLL_ENTRY_POINT DllMain = ReCa<f_DLL_ENTRY_POINT>(pBase + pOptionalHeader->AddressOfEntryPoint );
@@ -858,7 +865,7 @@ DWORD ManualMapping_Shell(MANUAL_MAPPING_DATA * pData)
858865 }
859866
860867 Size = pOptionalHeader->DataDirectory [IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT].Size ;
861- if (Size)
868+ if (Size && !(Flags & INJ_MM_RESOLVE_DELAY_IMPORTS) )
862869 {
863870 auto * pDelayImportDescr = ReCa<IMAGE_DELAYLOAD_DESCRIPTOR*>(pBase + pOptionalHeader->DataDirectory [IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT].VirtualAddress );
864871
0 commit comments