Read & Write Physical Memory (kernel mode)

Тема в разделе "WASM.NT.KERNEL", создана пользователем sasha_s, 23 дек 2008.

  1. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    Задача: читать и писать (для начала хотябы читать) в физическую память по любому валидному адресу (в кернеле).
    Для этого мне надо знать сколько вообще памяти на компе. Как узнать из кернела сколько именно физической памяти есть?

    И надо читать сию память. Нарыл здесь на форуме и на майкрософте следующую инфу:
    есть секция: \Device\PhysicalMemory, вот сампл по ее использованию:

    http://msdn.microsoft.com/en-us/library/aa479067.aspx

    Код (Text):
    1. UNICODE_STRING    UnicodeString;          // Name of the section object
    2. OBJECT_ATTRIBUTES ObjectAttributes;       // Description for the section object
    3. HANDLE            hPhysicalMemoryHandle;  // Handle to the section object
    4. PHYSICAL_ADDRESS  MappedLength;           // Length of the frame buffer
    5.  
    6. PHYSICAL_ADDRESS  MappedBase;             // Base physical address (CPU-relative)
    7.                                           // of the frame buffer
    8.  
    9. // Allocate a variable to receive the base virtual address of the view.
    10. // Set it to NULL for input to ZwMapViewOfSection, to specify that the memory
    11. // manager (rather than the caller) should determine the base virtual address.
    12. PVOID pViewBase = NULL;
    13.  
    14. RtlInitUnicodeString(&UnicodeString, L"\\Device\\PhysicalMemory");
    15.  
    16. InitializeObjectAttributes(
    17.    &ObjectAttributes,
    18.    &UnicodeString,
    19.    OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
    20.    (HANDLE) NULL,
    21.    (PSECURITY_DESCRIPTOR) NULL);
    22.  
    23. // Open a handle to the physical-memory section object.
    24. ntStatus = ZwOpenSection(&hPhysicalMemoryHandle, SECTION_ALL_ACCESS, &ObjectAttributes);
    25.  
    26. if(NT_SUCCESS(ntStatus))
    27. {
    28.    ntStatus = ZwMapViewOfSection(
    29.       hPhysicalMemoryHandle,
    30.       NtCurrentProcess(),
    31.       &pViewBase,
    32.       0L,
    33.       (ULONG_PTR)MappedLength.QuadPart,
    34.       &MappedBase,
    35.       (PULONG_PTR)(&(MappedLength.QuadPart)),
    36.       ViewUnmap,
    37.       0,
    38.       PAGE_READWRITE | PAGE_WRITECOMBINE);
    39.  
    40.    if(NT_SUCCESS(ntStatus))
    41.    {
    42.       // pViewBase holds the base virtual address of the view.
    43.    }
    44.  
    45.    // Close the handle to the physical-memory section object.
    46.    ZwClose(hPhysicalMemoryHandle);
    47. }
    но там же нашел следующее:
    http://support.microsoft.com/kb/189327

    А под ХР мне больше всего и надо...

    Так вот! Взываю к вам, о боги кернела. Просветите вашего скромного поклонника...
    Задача-то уверен решалась до меня и не раз.
    Если будете меня отсылать в МСДН или еще в какие доки -- то будьте любезны тыкать мордой в конкретное го.в.но в виде ссылок на нужную инфу. Я оттудава не вылажу в данный момент и буду продолжать не вылазить, но пока все что нарыл...
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    В XPSP2 с этой секцией всё прекрасно работает, в кернелмоде юзоется MmMapIoSpace().
     
  3. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    А можно более подробно порядок вызова апишек?

    а то тупо заменить вызов ZwMapViewOfSection на MmMapIoSpace не получается по причине разности параметров:

    Код (Text):
    1. NTSTATUS NTAPI
    2. ZwMapViewOfSection(
    3.     IN HANDLE SectionHandle,
    4.     IN HANDLE ProcessHandle,
    5.     IN OUT PVOID *BaseAddress,
    6.     IN ULONG ZeroBits,
    7.     IN ULONG CommitSize,
    8.     IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
    9.     IN OUT PSIZE_T ViewSize,
    10.     IN SECTION_INHERIT InheritDisposition,
    11.     IN ULONG AllocationType,
    12.     IN ULONG Protect
    13.     );
    14.  
    15. PVOID
    16. MmMapIoSpace (
    17.     IN PHYSICAL_ADDRESS PhysicalAddress,
    18.     IN SIZE_T NumberOfBytes,
    19.     IN MEMORY_CACHING_TYPE CacheType
    20.     );
    или мне тупо в цикле вызвать MmMapIoSpace для всех адресов.
    Ну типа того:


    Код (Text):
    1. offset = 0;
    2. while (offset < AllMemorySize)
    3. {
    4.     MmMapIoSpace (
    5.         0 + offset,
    6.         size,
    7.         "какой-то тип кеширования...");
    8.  
    9.     offset += size;
    10. }
    ???
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Забудь про секции вообще.

    LARGE_INTEGER Physaddr = { 0xB8000, 0 }; // physical address 0x000b8000
    PVOID ptr = MmMapIoSpace (Physaddr, 0x10000, MmNonCached)

    по виртуальному адресу ptr получишь 0x10 спроецированных физ страниц с физадреса B8000
    к примеру.
     
  5. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    Ну супер.
    Тока вот как проверить что читается именно физ. память?
    Как создать буфер какой-нить с кодовой строкой скажем и потом его найти сканом?
    Ведь винда все могет сбросить в своп и досвидания...
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    sasha_s
    Проекция находится в невыгружаемой памяти.
    Странные у тебя вопросы, что проверять, если ты сам физический адрес задаёшь..
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    кого в своп сбросить? =/