Load Config Directory

Тема в разделе "WASM.WIN32", создана пользователем mz80, 24 май 2011.

  1. mz80

    mz80 New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2010
    Сообщения:
    10
    Приветствую,

    Задался целью сгенерить Load Config Directory. Да только что то системному загрузчику никак не нравится. Посмотрел по виндовым файлам и обратил внимание, что собсно заполняются в основном только Size, SEHandlerTable, SecurityCookie.

    SecurityCookie дал VA на просто пустую секцию, а SEHandlerTable на рандомную функцию кода.

    MSDN мало даёт информации про эту структуру. Буду благодарен любой помоще.
     
  2. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    http://dl.dropbox.com/u/22509984/pecoff_v8.docx
    В офф. доке есть описание, см 86 страницу.
     
  3. mz80

    mz80 New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2010
    Сообщения:
    10
    я так понимаю, если поставить флаг IMAGE_DLLCHARACTERISTICS_NO_SEH, то VA SEHandlerTable можно обнулить и SEHandlerCount тоже. Но всё равно не работает.

    Может подскажете, что надо по минимуму заполнить, что бы загрузчик отработал?
     
  4. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
    mz80
    "Не работает" это не описание ошибки или причины. Это ничего, просто следствие огромного числа вероятных событий.

    U-ntldr.5.1.2600.5512

    ref. to RtlImageDirectoryEntryToData(IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG):

    LdrpInitializeProcess():
    Код (Text):
    1.         ImageConfigData = RtlImageDirectoryEntryToData( Peb->ImageBaseAddress,
    2.                                                         TRUE,
    3.                                                         IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG,
    4.                                                         &i
    5.                                                       );
    6.     }
    7.  
    8.     RtlZeroMemory( &HeapParameters, sizeof( HeapParameters ) );
    9.     ProcessHeapFlags = HEAP_GROWABLE | HEAP_CLASS_0;
    10.     HeapParameters.Length = sizeof( HeapParameters );
    11.     if (ImageConfigData != NULL && i == sizeof( *ImageConfigData )) {
    12.         Peb->NtGlobalFlag &= ~ImageConfigData->GlobalFlagsClear;
    13.         Peb->NtGlobalFlag |= ImageConfigData->GlobalFlagsSet;
    14.  
    15.         if (ImageConfigData->CriticalSectionDefaultTimeout != 0) {
    16.             //
    17.             // Convert from milliseconds to NT time scale (100ns)
    18.             //
    19.             RtlpTimeout.QuadPart = Int32x32To64( (LONG)ImageConfigData->CriticalSectionDefaultTimeout,
    20.                                                  -10000
    21.                                                );
    22.  
    23.             }
    24.  
    25.         if (ImageConfigData->ProcessHeapFlags != 0) {
    26.             ProcessHeapFlags = ImageConfigData->ProcessHeapFlags;
    27.             }
    28.  
    29.         if (ImageConfigData->DeCommitFreeBlockThreshold != 0) {
    30.             HeapParameters.DeCommitFreeBlockThreshold = ImageConfigData->DeCommitFreeBlockThreshold;
    31.             }
    32.  
    33.         if (ImageConfigData->DeCommitTotalFreeThreshold != 0) {
    34.             HeapParameters.DeCommitTotalFreeThreshold = ImageConfigData->DeCommitTotalFreeThreshold;
    35.             }
    36.  
    37.         if (ImageConfigData->MaximumAllocationSize != 0) {
    38.             HeapParameters.MaximumAllocationSize = ImageConfigData->MaximumAllocationSize;
    39.             }
    40.  
    41.         if (ImageConfigData->VirtualMemoryThreshold != 0) {
    42.             HeapParameters.VirtualMemoryThreshold = ImageConfigData->VirtualMemoryThreshold;
    43.             }
    44.         }
    LdrpValidateImageForMp():
    Код (Text):
    1.     // If we are on an MP system and the DLL has image config info, check to see
    2.     // if it has a lock prefix table and make sure the locks have not been converted
    3.     // to NOPs
    4.     //
    5.  
    6.     ImageConfigData = RtlImageDirectoryEntryToData( LdrDataTableEntry->DllBase,
    7.                                                     TRUE,
    8.                                                     IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG,
    9.                                                     &i
    10.                                                   );
    11.  
    12.     if (ImageConfigData != NULL &&
    13.         i == sizeof( *ImageConfigData ) &&
    14.         ImageConfigData->LockPrefixTable ) {
    15.             pb = (PUCHAR *)ImageConfigData->LockPrefixTable;
    LdrpFetchAddressOfSecurityCookie()
    RtlCaptureImageExceptionValues()

    Последние две функции понятны по названию. K-ntldr не использует данную директорию.

    При инвалидной директории генерится только STATUS_IMAGE_MP_UP_MISMATCH. При инвалидных смещениях возможны #AV etc.