Считывание ОП

Тема в разделе "WASM.WIN32", создана пользователем drem1lin, 20 мар 2010.

  1. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    Не нашел ответа на вопрос, можно ли к \Device\PhysicalMemory обратиться из ring3?

    Код (Text):
    1.     HANDLE hPM = CreateFile(L"\\??\\Device\\PhysicalMemory",FILE_READ_ATTRIBUTES|
    2.                      FILE_READ_DATA,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    3.     if (hPM == INVALID_HANDLE_VALUE)
    4.     {
    5.         return GetLastError();
    6.     }
    получаю ошибку 3. Видел, что в ядре используют, NtOpenSection в ring3 какой ее аналог?
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    drem1lin
    Это секция, открывайте через NtOpenSection. Для этого сервиса пользовательский аналог OpenFileMapping().
     
  3. f1redArk

    f1redArk Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    34
    Вроде бы закрыли после Sp 1, только из ядра можно.
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    В XPSP3 робит.
     
  5. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    Нафига ето хрень заниматься, для этого дровы есть - начиная с Windows 2003 SP1 ета дырка прикрыта.
     
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    а зачем вам? есть как бы другие варианты, не зависимо от того, какую задачу вы пытаетесь решить)))
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    d2k9
    Прикрыта.. на XP работает. Вы плохо осведамлены. Помню когдато аверы директорию не проверяли, тупо сравнивали по имени секцию, этим можно было их обойти. Вобщем функционал кошерный, открывает всё ядро для юзермода, не смотря на палевность.
     
  8. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    Это просто задание такое, надо считать ОП с определенного адреса, определенного размера, вот и разбираюсь, что и как
     
  9. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    Уважаемый Clerk видимо забыл, что ХР в линейке виндов стоит левее 2003 (имхо, раньше вышла), так что d2k9 хорошо осведомлен :)
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    gorodon
    Не забыл. Просто сказал что в XP работает. Разумеется это чисто теоретический интерес представляет, практически подобные манипуляции не нужны(из юзермода).
     
  11. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    Рылся, нашел функцию MmMapIoSpace, я так понимаю, она мне подойдет?
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    drem1lin
    Во первых тут раздел про ринг3. Во вторых что есть "ОП" - предположу что имелось ввиду адресное пространство. MmMapIoSpace() отображает определённый регион физической памяти в системное ап.
     
  13. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    2 drem1lin (по поводу \Device\PhysicalMemory):
    Код (Text):
    1.     HANDLE hSection;
    2.     OBJECT_ATTRIBUTES ObjectAttributes;
    3.     NTSTATUS status;
    4.     DWORD Size = 0x00002000;
    5.     void *pPointer = (void*)0x000FE000;//адрес, с которого надо начать чтение
    6.     //
    7.     //
    8.     _UNICODE_STRING strObjName;
    9.     strObjName.Buffer = (PWSTR)L"\\Device\\PhysicalMemory";
    10.     strObjName.Length = wcslen(strObjName.Buffer)*sizeof(WCHAR);
    11.     strObjName.MaximumLength = strObjName.Length + sizeof(WCHAR);
    12.     //
    13.     ObjectAttributes.uLength = sizeof( OBJECT_ATTRIBUTES );
    14.     ObjectAttributes.hRootDirectory = NULL;
    15.     ObjectAttributes.pObjectName = &strObjName;
    16.     ObjectAttributes.uAttributes = OBJ_CASE_INSENSITIVE;
    17.     ObjectAttributes.pSecurityDescriptor = NULL;
    18.     ObjectAttributes.pSecurityQualityOfService = NULL;
    19.     //
    20.     status = pNtOpenSection(&hSection,SECTION_MAP_READ,&ObjectAttributes);
    21.     //
    22.     if(status == STATUS_SUCCESS)
    23.     {
    24.         PBYTE pbFile = (PBYTE) MapViewOfFile(hSection, SECTION_MAP_READ, 0, (DWORD)pPointer, Size);
    25.         if(pbFile != NULL)
    26.             ;//здесь копируем с адреса pbFile, размер Size
    27.         else
    28.             printf("MapViewOfFile error!\n");
    29.         //
    30.         UnmapViewOfFile(pbFile);
    31.         //
    32.         pNtClose(hSection);
    33.     }
    34.     else
    35.     {
    36.         printf("NtOpenSection return Error %08X\n",status);
    37.     }
    Rel
    Так расскажите про альтернативные способы... :)