Приветствую, Задался целью сгенерить Load Config Directory. Да только что то системному загрузчику никак не нравится. Посмотрел по виндовым файлам и обратил внимание, что собсно заполняются в основном только Size, SEHandlerTable, SecurityCookie. SecurityCookie дал VA на просто пустую секцию, а SEHandlerTable на рандомную функцию кода. MSDN мало даёт информации про эту структуру. Буду благодарен любой помоще.
я так понимаю, если поставить флаг IMAGE_DLLCHARACTERISTICS_NO_SEH, то VA SEHandlerTable можно обнулить и SEHandlerCount тоже. Но всё равно не работает. Может подскажете, что надо по минимуму заполнить, что бы загрузчик отработал?
mz80 "Не работает" это не описание ошибки или причины. Это ничего, просто следствие огромного числа вероятных событий. U-ntldr.5.1.2600.5512 ref. to RtlImageDirectoryEntryToData(IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG): LdrpInitializeProcess(): Код (Text): ImageConfigData = RtlImageDirectoryEntryToData( Peb->ImageBaseAddress, TRUE, IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG, &i ); } RtlZeroMemory( &HeapParameters, sizeof( HeapParameters ) ); ProcessHeapFlags = HEAP_GROWABLE | HEAP_CLASS_0; HeapParameters.Length = sizeof( HeapParameters ); if (ImageConfigData != NULL && i == sizeof( *ImageConfigData )) { Peb->NtGlobalFlag &= ~ImageConfigData->GlobalFlagsClear; Peb->NtGlobalFlag |= ImageConfigData->GlobalFlagsSet; if (ImageConfigData->CriticalSectionDefaultTimeout != 0) { // // Convert from milliseconds to NT time scale (100ns) // RtlpTimeout.QuadPart = Int32x32To64( (LONG)ImageConfigData->CriticalSectionDefaultTimeout, -10000 ); } if (ImageConfigData->ProcessHeapFlags != 0) { ProcessHeapFlags = ImageConfigData->ProcessHeapFlags; } if (ImageConfigData->DeCommitFreeBlockThreshold != 0) { HeapParameters.DeCommitFreeBlockThreshold = ImageConfigData->DeCommitFreeBlockThreshold; } if (ImageConfigData->DeCommitTotalFreeThreshold != 0) { HeapParameters.DeCommitTotalFreeThreshold = ImageConfigData->DeCommitTotalFreeThreshold; } if (ImageConfigData->MaximumAllocationSize != 0) { HeapParameters.MaximumAllocationSize = ImageConfigData->MaximumAllocationSize; } if (ImageConfigData->VirtualMemoryThreshold != 0) { HeapParameters.VirtualMemoryThreshold = ImageConfigData->VirtualMemoryThreshold; } } LdrpValidateImageForMp(): Код (Text): // If we are on an MP system and the DLL has image config info, check to see // if it has a lock prefix table and make sure the locks have not been converted // to NOPs // ImageConfigData = RtlImageDirectoryEntryToData( LdrDataTableEntry->DllBase, TRUE, IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG, &i ); if (ImageConfigData != NULL && i == sizeof( *ImageConfigData ) && ImageConfigData->LockPrefixTable ) { pb = (PUCHAR *)ImageConfigData->LockPrefixTable; LdrpFetchAddressOfSecurityCookie() RtlCaptureImageExceptionValues() Последние две функции понятны по названию. K-ntldr не использует данную директорию. При инвалидной директории генерится только STATUS_IMAGE_MP_UP_MISMATCH. При инвалидных смещениях возможны #AV etc.