ZwMapViewOfSection в Windows Vista

Тема в разделе "WASM.NT.KERNEL", создана пользователем DeeoniS, 20 мар 2007.

  1. DeeoniS

    DeeoniS New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2004
    Сообщения:
    132
    Имеется драйвер, который загружается при старте системы и в DriverEntry вызывает ф-ю которая считывает в память ядро:
    Код (Text):
    1. NTSTATUS MapKernel(UNICODE_STRING usKernelFile)
    2. {
    3.     OBJECT_ATTRIBUTES oaKernelFile;
    4.     NTSTATUS ns = STATUS_SUCCESS;
    5.     IO_STATUS_BLOCK iosb;
    6.     ULONG dwViewSize = 0;
    7.  
    8.     InitializeObjectAttributes(&oaKernelFile, &usKernelFile, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
    9.         NULL, NULL);
    10.  
    11.     ns = ZwOpenFile(&hKernelFile, FILE_READ_DATA | SYNCHRONIZE, &oaKernelFile, &iosb,
    12.         FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, FILE_SYNCHRONOUS_IO_NONALERT);
    13.     if (ns != STATUS_SUCCESS)
    14.         return ns;
    15.  
    16.     ns = ZwCreateSection(&hKernelSection, SECTION_MAP_READ, NULL, NULL, PAGE_READONLY, 0x8000000,
    17.         hKernelFile);
    18.  
    19.     if (ns != STATUS_SUCCESS)
    20.     {
    21.         UnMapKernel();
    22.         return ns;
    23.     }
    24.     ns = ZwMapViewOfSection(hKernelSection, NtCurrentProcess(), &pKernel, 0, 0, NULL, &dwViewSize,
    25.         ViewShare, 0, PAGE_READONLY);
    26.  
    27.     if (ns != STATUS_SUCCESS)
    28.         UnMapKernel();
    29.  
    30.     return ns;
    31. }
    Но ZwMapViewOfSection возвращает какое-то странное значение в pKernel - 0x00ad0000. Соответсвенно дальше при парсинге хидера ядра получается полная фигня. Такое значение получается только в Висте, в других NT там 0х40000. В чем может быть дело?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    В хидере база ядра стоит 40000. У висты, наверное, другая.

    Хотя я не понимаю зачем ставится такая база в хидере, если все равно ядро потом релоцируется на верхние два гига адресного пространства..
     
  3. DeeoniS

    DeeoniS New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2004
    Сообщения:
    132
    Great, неа, база такаяже как и в XP
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    =\
    значит мистика от дяди билла )
     
  5. DeeoniS

    DeeoniS New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2004
    Сообщения:
    132
    Great, я в мистику не верю... Может еще предложения будут???
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    А чем оно такое странное?
    Ага? А не 400000 случаем?
    Вот 40000 действительно странное значение.
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    DeeoniS
    Ты бы полный сорц скинул, и написал бы как грущишь драйвер.
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    плюс-минус нолик, я таких подробностей не помню :lol:
     
  9. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    http://en.wikipedia.org/wiki/ASLR, но это, кажется, только в 64-разрядной Висте

    а там разве не отмапирован образ процесса?
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    то есть отмапиован?
    Мы же вроде говорили про поле ImageBase в PE-заголовке?
     
  11. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    n0name
    я это скорее Great'у
     
  12. DeeoniS

    DeeoniS New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2004
    Сообщения:
    132
    Драйвер грузится автоматически при загрузке Windows, т.е. в реестре праметр Start равен 1.
    Код собственно и так полный... Сначала выполняется ф-я MapKernel, которую я уже запостил, а потом выполняется эта ф-я:
    Код (Text):
    1. ULONG xGetProcAddress(ULONG hModule, char *pszName)
    2. {
    3.     ULONG dwNameCount, *AddressOfNames, *AddressOfFunctions;
    4.     USHORT *AddressOfOrdinals;
    5.     ULONG i;
    6.     char *pszExportName;    
    7.  
    8.     char *ptr = (char *)hModule;
    9.     ptr += 0x3c;
    10.     ptr = (char *)(*(ULONG *)ptr) + hModule + 0x78;
    11.     ptr = (char *)(*(ULONG *)ptr) + hModule;
    12.     dwNameCount = *(ULONG *)(ptr + 24);
    13.     AddressOfNames = (ULONG *)(*(ULONG *)(ptr + 32) + hModule);
    14.     AddressOfOrdinals = (USHORT *)((*(ULONG *)(ptr + 36)) + hModule);
    15.     AddressOfFunctions = (ULONG *)((*(ULONG *)(ptr + 28)) + hModule);
    16.     for(i = 0; i < dwNameCount; i++)
    17.     {      
    18.         pszExportName = (char *)(AddressOfNames[i] + hModule);
    19.         if(mystrcmp(pszExportName, pszName) == 1)
    20.             return (ULONG)(AddressOfFunctions[AddressOfOrdinals[i]]);
    21.     }
    22.     return 0;
    23. }
    где hModule - это адрес куда мы мэппировали ядро. Она собственно ищет в образе ядра KeServiceDescriptorTable. Т.к. адрес мэппирования нестандартный, то xGetProcAddress падает на первом операторе цикла - выдает BSOD с ошибкой PAGE_FAULT_IN_NONPAGED_AREA.
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Можешь не объяснять, я помню свой код :P
    Ты разве не видишь, что я к VA прибавляю hModule, так что это не зависит от адреса маппирования. Если ошибка раньше не вылезла, то значит образ подгрузился корректно.
    Vista случаем не 64 битная?
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    не должно. давай вывод !analyze -v для крешдампа и дизассемблерный листинг сбойного участка кода
     
  15. DeeoniS

    DeeoniS New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2004
    Сообщения:
    132
    ну мало ли, ты же попросил полный сырец :)


    неа, 32-х битная, RC2
     
  16. DeeoniS

    DeeoniS New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2004
    Сообщения:
    132
    Great, походу это уже не нужно
     
  17. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Откуда же я знаю, что делает твоё приложение, и зачем ему нужно маппить ядро. Как я уже написал выще MapKernel всё делает коректно, проблема почему-то в xGetProcAddress.
    Скинь ntoskrnl.exe.
     
  18. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    так какая Виста, все таки? 64?
     
  19. DeeoniS

    DeeoniS New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2004
    Сообщения:
    132
    Nouzui, я ж сказал Виста 32-битная, RC2
     
  20. DeeoniS

    DeeoniS New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2004
    Сообщения:
    132
    n0name, дело походу действительно в xGetProcAddress, т.к. смещения получаются неправильные. Ядро висты тут http://webfile.ru/1354068