ZwCreateSection + ZwMapViewOfSection

Тема в разделе "WASM.NT.KERNEL", создана пользователем XshStasX, 14 мар 2012.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    0. Открываю файл \\SystemRoot\\system32\\ntdll.dll
    1. Создаю секцию.
    2. Мапирую ее .

    Далее изменяю память которую возвратила ZwMapViewOfSection .
    Могут ли эти изменения быть глобальными?
    В п.1 создается новая секция или мне возвращается HANDLE уже существующей секции ?
    Это все в ядре происходит.
     
  2. 100gold

    100gold New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2010
    Сообщения:
    165
    Без флага PAGE_WRITECOPY не будет производится копирования страниц и соответственно изменения глобальны для всех отображений секции.

    функция ZwCreateSection создаёт новую секцию, уже существующую можно открыть с пом. ZwOpenSection
     
  3. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Такое ощущение что я порчу проекцию нтдлл...

    Код (Text):
    1.    
    2.     PVOID ViewBase;
    3.     ULONG_PTR ViewSize;
    4.     UNICODE_STRING uStr;   
    5.     USHORT IdZwSetContext; 
    6.     NTSTATUS nt;
    7.     PVOID p;
    8.  
    9. RtlInitUnicodeString(&uStr,L"\\SystemRoot\\system32\\ntdll.dll");
    10. nt = MapPeFile(&uStr,&ViewBase,&ViewSize);
    11. if ( ! NT_SUCCESS(nt) )
    12.     return FALSE;
    13.  
    14. ZwUnmapViewOfSection(ZwCurrentProcess(),ViewBase);
    Код (Text):
    1. NTSTATUS MapPeFile(PUNICODE_STRING uStr,OUT PVOID *pRet,ULONG_PTR *ViewSize)
    2. {
    3.     OBJECT_ATTRIBUTES objAttr;
    4.     IO_STATUS_BLOCK  IoStatusBlock;
    5.     NTSTATUS    nt;
    6.     HANDLE      hFile,hSection;
    7.  
    8.     InitializeObjectAttributes(&objAttr,uStr,OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,NULL,NULL);
    9.     nt = ZwCreateFile(&hFile,GENERIC_READ,&objAttr,&IoStatusBlock,0,FILE_ATTRIBUTE_NORMAL,FILE_SHARE_READ,FILE_OPEN,0,NULL,0);
    10.     if  ( !NT_SUCCESS(nt) )
    11.     {
    12.         return nt;
    13.     }
    14.    
    15.     nt = ZwCreateSection(&hSection,SECTION_MAP_READ,NULL,NULL,PAGE_READONLY,SEC_IMAGE,hFile);
    16.     if  ( !NT_SUCCESS(nt) )
    17.     {
    18.         ZwClose(hFile);
    19.         return nt;
    20.     }
    21.        
    22.     *pRet = 0;
    23.     *ViewSize = 0;
    24.     nt = ZwMapViewOfSection(hSection,
    25.                             PsGetCurrentProcessId(),
    26.                             pRet,
    27.                             0,
    28.                             0,
    29.                             NULL,
    30.                             ViewSize,
    31.                             ViewUnmap,
    32.                             0,
    33.                             PAGE_READONLY
    34.                             );
    35.  
    36.  
    37. //  ZwClose(hFile);
    38. //  ZwClose(hSection);
    39.    
    40.     if ( nt == STATUS_IMAGE_NOT_AT_BASE )
    41.     do{
    42.         PIMAGE_BASE_RELOCATION pImgBaseReloc;
    43.         LONG_PTR SizeRelocDir;
    44.         ULONG_PTR   xDelta;
    45.         PIMAGE_DOS_HEADER   pDosHeader;
    46.         PIMAGE_NT_HEADERS   pNtHeaders;
    47.  
    48.         pDosHeader = (PIMAGE_DOS_HEADER)*pRet;
    49.         if ( pDosHeader->e_magic != IMAGE_DOS_SIGNATURE )
    50.             break;
    51.  
    52.         pNtHeaders = (PIMAGE_NT_HEADERS) (pDosHeader->e_lfanew  + (PCHAR)*pRet);
    53.         if ( pNtHeaders->Signature != IMAGE_NT_SIGNATURE )
    54.             break;
    55.        
    56.         pImgBaseReloc = (PIMAGE_BASE_RELOCATION)(pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress + (PCHAR)*pRet);
    57.         SizeRelocDir  = pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size;
    58.  
    59.         xDelta  =  (ULONG_PTR)*pRet - pNtHeaders->OptionalHeader.ImageBase;
    60.         __asm int 3;
    61.         if ( xDelta )
    62.         while ( (pImgBaseReloc->SizeOfBlock > 0) & (SizeRelocDir>0))
    63.         {
    64.             PMDL    Mdl;
    65.             PVOID   VirtAddr;
    66.             ULONG CountRel = (pImgBaseReloc->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION))/sizeof(WORD);
    67.             PWORD AddrRel =  (PWORD)( (PCHAR)pImgBaseReloc + sizeof(IMAGE_BASE_RELOCATION));
    68.            
    69.             Mdl = IoAllocateMdl((PCHAR)*pRet + pImgBaseReloc->VirtualAddress,2*PAGE_SIZE,FALSE,FALSE,NULL );
    70.             if ( Mdl )
    71.             {
    72.                 MmBuildMdlForNonPagedPool(Mdl);
    73.                 if ( VirtAddr = MmMapLockedPagesSpecifyCache(Mdl,UserMode,MmNonCached,NULL,FALSE,NormalPagePriority)/*MmGetSystemAddressForMdlSafe(Mdl,NormalPagePriority)*/ )
    74.                 {
    75.                     //MmProtectMdlSystemAddress(Mdl,PAGE_READWRITE);
    76.                     while ( CountRel--)
    77.                     {
    78.                         if ( (*AddrRel >> 12) == IMAGE_REL_BASED_HIGHLOW)
    79.                         {
    80.                            
    81.                             ULONG TargetVA;
    82.                             PULONG Pach;
    83.                             PIMAGE_SECTION_HEADER psec ;
    84.  
    85.                             TargetVA = /*pImgBaseReloc->VirtualAddress +*/ (*AddrRel & 0x0FFF);
    86.                             Pach = (PULONG)((PCHAR)VirtAddr + TargetVA);
    87.                             TargetVA = *(ULONG*)((PCHAR)*pRet + pImgBaseReloc->VirtualAddress + TargetVA);
    88.                             *Pach += xDelta;
    89.                         }
    90.                         ++AddrRel;
    91.                     }
    92.                     MmUnmapLockedPages(VirtAddr,Mdl);
    93.                 }
    94.                 IoFreeMdl(Mdl);
    95.             }
    96.             SizeRelocDir -= pImgBaseReloc->SizeOfBlock;
    97.             pImgBaseReloc = (PIMAGE_BASE_RELOCATION)((PCHAR)pImgBaseReloc + pImgBaseReloc->SizeOfBlock );
    98.         };
    99.       nt = 0;
    100.     }while(0);
    101.    
    102.     if (! NT_SUCCESS(nt) )
    103.     {
    104.         return nt;
    105.     };
    106.    
    107.     return nt;
    108. }
     
  4. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Эммммм, может быть ZwUnmapViewOfSection нужно вызывать внутри функции MapPeFile (после обработки данных или в случае неудачи)?
    Где гарантия, что твой hSection будет равен ZwCurrentProcess()?
     
  5. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Ты о ZwUnmapViewOfSection(ZwCurrentProcess(),ViewBase); ?
    Так туда надо как раз хендл процесса.

    Данные отлично обрабатываются:) а вот csrss падает после обработки иногда не доходя до ZwUnmapViewOfSection .

    Щас покажу лог виндбг...
     
  6. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    XshStasX

    Во-первых, флаг PAGE_WRITECOPY тебе не нужен, т.к. секция у тебя своя. Вот если бы ты лазил в уже существующую проекцию образа в каком-либо процессе, то твои изменения произошли бы и в других процессах, куда эта же секция была спроецирована. Во-вторых, функция MmBuildMdlForNonPagedPool() может быть использована только для невыгружаемого пула, в твоём случае следует использовать MmProbeAndLockPages() в try/except-блоке. Дальше код не смотрел и вообще непонятно, что это и зачем. А, и ещё замечание по поводу MmProtectMdlSystemAddress() - её нельзя использовать для изменения защиты страниц системного пула (не твой случай, конечно, но это так, мало ли). Запусти свой драйвер под Verifier-ом, вполне возможно, что он сходу укажет где на самом деле косяк.
     
  7. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Загружает РЕ файл и настраивает релоки.
    Зачем? Чтоб получить Id не которых сервисов.

    Verifier - пока не помог.

    Windbg: Terminating critical process csrss. И предлагает брякнуться к него.
     
  8. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    x64
    Этих апи обычно не достаточно. Простейшая казалось бы задача - запретить запись в файловую проекцию. Оказывается средствами ядра это сделать невозможно, без ручной правки VAD. Аверы вообще с памятью работать не умеют, вывод сделан на основе ресерча всех фаеров.

    XshStasX
    Не могут.
     
  9. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    В общем после выполнения RtlZeroMemory(VirtAddr,PAGE_SIZE); идет перезапись ntdll других процессов ( а именно csrss, мой процесс System).
    Код (Text):
    1.             if ( Mdl )
    2.             {
    3.                
    4.                 __asm int 3;
    5.                 __try
    6.                 {
    7.                      MmProbeAndLockPages(Mdl,KernelMode,IoReadAccess);
    8.                 }__except( EXCEPTION_EXECUTE_HANDLER )
    9.                 {
    10.                     __asm int 3;
    11.                     ZwUnmapViewOfSection(ZwCurrentProcess(),*pRet);
    12.  
    13.                     return GetExceptionCode();
    14.                 }
    15.                 if ( VirtAddr = MmGetSystemAddressForMdlSafe(Mdl,NormalPagePriority) )
    16.                 {
    17.                     MmProtectMdlSystemAddress(Mdl,PAGE_READWRITE);
    18.                     __asm int 3;
    19.                     RtlZeroMemory(VirtAddr,PAGE_SIZE);
    20.                     MmUnmapLockedPages(VirtAddr,Mdl);
    21.                 }
    22.                 MmUnlockPages(Mdl);
    23.                 IoFreeMdl(Mdl);
    24.             }
     
  10. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    XshStasX
    Вы как Image мапите надеюсь ?
     
  11. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Malfoy
    Ну конечно:)

    Вот код с первого поста

    Код (Text):
    1.    InitializeObjectAttributes(&objAttr,uStr,OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,NULL,NULL);
    2.     nt = ZwCreateFile(&hFile,GENERIC_READ,&objAttr,&IoStatusBlock,0,FILE_ATTRIBUTE_NORMAL,FILE_SHARE_READ,FILE_OPEN,0,NULL,0);
    3.     if  ( !NT_SUCCESS(nt) )
    4.     {
    5.         return nt;
    6.     }
    7.    
    8.     nt = ZwCreateSection(&hSection,SECTION_MAP_READ,NULL,NULL,PAGE_READONLY,SEC_IMAGE,hFile);
    9.     if  ( !NT_SUCCESS(nt) )
    10.     {
    11.         ZwClose(hFile);
    12.         return nt;
    13.     }
    14.        
    15.     *pRet = 0;
    16.     *ViewSize = 0;
    17.     nt = ZwMapViewOfSection(hSection,
    18.                             PsGetCurrentProcessId(),
    19.                             pRet,
    20.                             0,
    21.                             0,
    22.                             NULL,
    23.                             ViewSize,
    24.                             ViewUnmap,
    25.                             0,
    26.                             PAGE_READONLY
    27.                             );
     
  12. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Кто-то может подсказать причину этого ?
     
  13. 100gold

    100gold New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2010
    Сообщения:
    165
    Вот и верь мне после этого) Если передан файловый хендл, то ZwCreateSection берёт SECTION_OBJECT оттуда (FileObject->SectionObjectPointer->ImageSectionObject), если он там есть. Т.е. сам по себе объект секции будет новый, вызов ObCreateObject будет безусловно, но для разных секций созданных с одного файла будут использованы одни и те же физические страницы памяти.

    Если я опять наврал - я не виноват ))))
     
  14. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    XshStasX
    Убедись что реально была создана новая проекция , так как похоже ты открыл уже существующию ... (ZwMapViewOfSection для ntdll выполняется с Read\Write и похоже вы её заюзали)

    Malfoy
    Address descritpro пилятся антируткитами, ав кажится раньше не пилили.
     
  15. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    shchetinin
    Как в этом убедится ?
     
  16. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    XshStasX
    ZwOpenSection?
     
  17. 100gold

    100gold New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2010
    Сообщения:
    165
    Вобще мапить секцию READONLY, а потом через MDL получать те же физические страницы, но с другими правами - это "грязный хак" и так лучше не делать. Нужные права надо получать на этапе маппинга. Понятно, что если секция без права write, то мапнуть страницы с write неполучится. Тут можно попробовать PAGE_WRITECOPY...
     
  18. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Да секция созданная, winobj ее видит (если дать ей имя) .
     
  19. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    shchetinin
    Чо ?
     
  20. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Malfoy
    VAD - virtual address descritptor не?:читаёте посты рание . это про людей из АВ и выпили руткитов.