ААААА... PEB

Тема в разделе "WASM.NT.KERNEL", создана пользователем brainFucker, 1 июн 2009.

  1. brainFucker

    brainFucker New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2009
    Сообщения:
    16
    Здарова мужики!
    я закалустался получать эту стуктуру.
    пишу драйвер, в нем пытаюсь получить указатель на PEB.
    скачал с мелкософта ntoskrnl.pdb для xp (скачивал для sp2, блин - на сколько помню). С помощью pdbdump'а получил файл со структурами, в том числе и EPROCESS, KPROCESS и PEB.
    Тестю драйвер на виртуальной машине. На компе установлен xp3, на виртуальной машине xp2,
    отлаживаю с помощью windbg... получаю указатель на EPROCESS с помощью PsLookupProcessByProcessId.
    Смотрю что у меня показывает отладчик в структуре PEB - а там memory access error. Попробовал обратиться к полям этой структуры - конечно ничего хорошо не произошло, пришлось перезагружать виртуальную машину. Вот не пойму из-за чего.
    Может быть из-за того что смещение не правильно объявленно????
    у меня вот:
    typedef struct _EPROCESS {
    ...
    /*<thisrel this+0x190>*/ /*|0x4|*/ struct _PEB* Peb;
    ...
    } EPROCESS, *PEPROCESS;
    подскажите, кто знает
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    KeStackAttachProcess().
     
  3. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Не понял, зачем указатель на PEB получать по смещению? Для этого существует PsGetProcessPeb().
     
  4. brainFucker

    brainFucker New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2009
    Сообщения:
    16
    не помогло(((((((
     
  5. wasm_test

    wasm_test wasm test user

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

    А вообще, как уже сказали, есть PsGetProcessPeb, ну или на худой конец ZwQueryInformationProcess (ProcessBasicInformation) : поле PebBaseAddress
     
  6. brainFucker

    brainFucker New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2009
    Сообщения:
    16
    вот рабочая функция
    и еще на счет: ...PEB - а там memory access error... уточнение
    сам указатель struct _PEB * Peb имеет значения, а вот его поля как раз содержат memory access error
    NTSTATUS DeviceControlRoutine( IN PDEVICE_OBJECT fdo, IN PIRP Irp )
    NTSTATUS DeviceControlRoutine( IN PDEVICE_OBJECT fdo, IN PIRP Irp )
    {
    NTSTATUS status = STATUS_SUCCESS;
    ULONG BytesTxd =0;
    PIO_STACK_LOCATION IrpStack=IoGetCurrentIrpStackLocation(Irp);


    PDEVICE_EXTENSION dx =
    (PDEVICE_EXTENSION)fdo->DeviceExtension;

    ULONG ControlCode =
    IrpStack->Parameters.DeviceIoControl.IoControlCode;
    ULONG method = ControlCode & 0x03;


    //KIRQL irql,
    //currentIrql = KeGetCurrentIrql();

    #if DBG
    DbgPrint("-Example- In DeviceControlRoutine (fdo= %X)\n",fdo);
    DbgPrint("-Example- DeviceIoControl: IOCTL %x.", ControlCode );
    //if(currentIrql==PASSIVE_LEVEL)
    // DbgPrint("-Example- PASSIVE_LEVEL (val=%d)",currentIrql);
    #endif


    switch( ControlCode) {

    #ifndef SMALL_VERSION
    case IOCTL_PROCESS:
    {
    PEPROCESS pEprocess, pEprocess0;
    PPEB Peb = NULL;
    DWORD InputLength =
    (DWORD)IrpStack->Parameters.DeviceIoControl.InputBufferLength;
    if (InputLength != sizeof(DWORD))
    break;
    DWORD dwPID;
    dwPID = *((PDWORD)(Irp -> AssociatedIrp.SystemBuffer));


    NTSTATUS s;

    s =
    PsLookupProcessByProcessId((HANDLE)dwPID, &pEprocess);
    if (!NT_SUCCESS(s))
    {
    break;
    }
    dx->pEPROCESS = pEprocess;
    KAPC_STATE ApcState;
    KeStackAttachProcess((PKPROCESS)pEprocess, &ApcState);
    Peb = pEprocess->Peb;
    KeUnstackDetachProcess(&ApcState);


    break;
    }
    #endif

    default: status = STATUS_INVALID_DEVICE_REQUEST;
    }


    #if DBG
    DbgPrint("-Example- DeviceIoControl: %d bytes written.", (int)BytesTxd);
    #endif

    return CompleteIrp(Irp,status,BytesTxd);
    }
     
  7. Clerk

    Clerk Забанен

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

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    brainFucker
    При обращении к PEB, а не при чтении указателя из EPROCESS.
     
  9. brainFucker

    brainFucker New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2009
    Сообщения:
    16
    Так так так
    Значит PEB находится в адресном пространстве процесса???
    я прально понял?
    просто думал что KeStackAttachProcess все сделает
    знаю что он редактирует регистр cr3 указывающий на католог страниц процесса... который отражается в моей голове пустым звуком
    ладно буду разбиратся с этим, спасибо - направил на путь праведный
    да и не подскажешь как загрузить в таком случае PEB?
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    - PASSIVE_LEVEL.
    - Обращение защищено сех.
    - Перед обращением аттачь.
    - Обращаться атомарно.
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Clerk
    Он же и так аттачнут о_0

    Да, ты прав, keStackAttachProcess всё сделает.
    Memory access error - в чем смотришь, в WinDbg? Страница может быть выгружена, он такие смотреть не умеет.
     
  12. brainFucker

    brainFucker New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2009
    Сообщения:
    16
    >03:47:05 Great
    приятно видеть что не я один не могу спать спокойно
    да смотрю в Windbg
    Вот пытаюсь использовать MmGetSystemAddressForMdl и MmProbeAndLockPages:
    у Солдатова написано что он загружает по необходимости страницы, только без результатно.
     
  13. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Great
    Куда он аттачнут, чтото я не вижу где к PEB обращение..
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Clerk
    А я не увидел обращений к пеб после детача. Где там?

    brainFucker
    То, что WinDbg показывает memory access error для участка памяти, _НЕ_ означает, что драйверу не получится к ней обратиться. Драйверам вообще-то тоже можно обращаться к подкачиваемой памяти. Правда, с условиями: код должен выолняться на IRQL < 2.
    Где у тебя вообще обращение к поням Peb? Не надо полагаться на вывод виндбг, просто напиши чтение любого поля (естественно, внутри блока Attach/Detach) и проверь. А то уже в мдл полез.. Не надо никаких MmProbe.../MmMap.../MmGetSystemAddress...
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Great
    А страница с PEB вобще подкачивается ?
    Вроде как она не свопится.
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Clerk
    Ну вообще по-моему вроде как тоже нет. Я на всякий случай сказал. Ибо автор предоставляет маловато информации.

    PS. Посморел щас MiCreatePebOrTeb - вроде выделяется обычный VAD для частной страницы. Должно свопиться.
     
  17. brainFucker

    brainFucker New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2009
    Сообщения:
    16
    уже пробовал обртиться к полям PEB
    только на этот раз заключил в сех))
    не работает все равно((
    Код (Text):
    1. NTSTATUS DeviceControlRoutine( IN PDEVICE_OBJECT fdo, IN PIRP Irp )
    2. {
    3.     NTSTATUS status = STATUS_SUCCESS;
    4.     ULONG BytesTxd =0;
    5.     PIO_STACK_LOCATION IrpStack=IoGetCurrentIrpStackLocation(Irp);
    6.  
    7.    
    8.     PDEVICE_EXTENSION dx =
    9.                  (PDEVICE_EXTENSION)fdo->DeviceExtension;
    10.    
    11.     ULONG ControlCode =
    12.     IrpStack->Parameters.DeviceIoControl.IoControlCode;
    13.     ULONG method = ControlCode & 0x03;
    14.  
    15.    
    16.     //KIRQL irql,
    17.     //currentIrql = KeGetCurrentIrql();
    18.  
    19.     #if DBG
    20.     DbgPrint("-Example- In DeviceControlRoutine (fdo= %X)\n",fdo);
    21.     DbgPrint("-Example- DeviceIoControl: IOCTL %x.", ControlCode );
    22.     //if(currentIrql==PASSIVE_LEVEL)
    23.     //  DbgPrint("-Example- PASSIVE_LEVEL (val=%d)",currentIrql);
    24.     #endif
    25.    
    26.  
    27.     switch( ControlCode) {
    28.  
    29.     #ifndef SMALL_VERSION
    30.     case IOCTL_PROCESS:
    31.     {
    32.         KIRQL irql = PASSIVE_LEVEL, currentIrql = KeGetCurrentIrql();
    33.         PVOID pVoid = NULL;
    34.         PEPROCESS pEprocess, pEprocess0;
    35.         PPEB Peb = NULL;
    36.         DWORD InputLength =
    37.             (DWORD)IrpStack->Parameters.DeviceIoControl.InputBufferLength;
    38.         if (InputLength != sizeof(DWORD))
    39.             break;
    40.         DWORD dwPID;
    41.             dwPID = *((PDWORD)(Irp -> AssociatedIrp.SystemBuffer));
    42.        
    43.        
    44.        
    45.  
    46.         NTSTATUS s;    
    47.        
    48.         s =
    49.             PsLookupProcessByProcessId((HANDLE)dwPID,
    50.                 &pEprocess);
    51.         if (!NT_SUCCESS(s))
    52.         {
    53.             break;
    54.         }
    55.         dx->pEPROCESS = pEprocess;
    56.         if (currentIrql != PASSIVE_LEVEL)
    57.         {
    58.             KeLowerIrql(irql);
    59.         }
    60.         KAPC_STATE ApcState;
    61.         KeStackAttachProcess((PKPROCESS)pEprocess, &ApcState);
    62.         Peb = pEprocess->Peb;
    63.         __try
    64.         {
    65.             pVoid = Peb->ImageBaseAddress;
    66.         }
    67.         __except(EXCEPTION_EXECUTE_HANDLER)
    68.         {
    69.             #if DBG
    70.                 DbgPrint("Fuck!");
    71.             #endif
    72.         }
    73.        
    74.  
    75.    
    76.  
    77.         KeUnstackDetachProcess(&ApcState);
    78.  
    79.        
    80.         if (currentIrql != PASSIVE_LEVEL)
    81.         {
    82.             KeRaiseIrql(currentIrql, &irql);
    83.         }
    84.        
    85.         break;
    86.     }
    87.     #endif
    88.  
    89.     default: status = STATUS_INVALID_DEVICE_REQUEST;
    90.     }
    91.  
    92.  
    93.     #if DBG
    94.     DbgPrint("-Example- DeviceIoControl: %d bytes written.", (int)BytesTxd);
    95.     #endif
    96.  
    97. return CompleteIrp(Irp,status,BytesTxd);
    98. }
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Я уже n*10^m раз писал, что "не работает" - не описание ошибки. Не работает == выполняется сех?
    Или бсод? Или где.

    Специально для танкистов напоминаю про debug printы. Очень хорошее средство отладки.
    Замени на
    Код (Text):
    1.         KAPC_STATE ApcState;
    2.         KeStackAttachProcess((PKPROCESS)pEprocess, &ApcState);
    3.        
    4.         Peb = pEprocess->Peb;
    5.         DbgPrint ("Attached to process %p, PEB %p\n", pEprocess, Peb);
    6.        
    7.         __try
    8.         {
    9.             DbgPrint("ImageBaseAddress = %p\n", Peb->ImageBaseAddress);
    10.         }
    11.         __except(EXCEPTION_EXECUTE_HANDLER)
    12.         {
    13.             DbgPrint("Got exception code %x\n", GetExceptionCode());
    14.         }
    15.        
    16.         KeUnstackDetachProcess(&ApcState);
    и покажи отладочный вывод

    PS. Это что еще за бред!??!
    Код (Text):
    1.         if (currentIrql != PASSIVE_LEVEL)
    2.         {
    3.             KeLowerIrql(irql);
    4.         }
    Нельзя насильно понижать IRQL ниже уровня вызова функции! Кто тебе этот кошмар подсказал?
    Тем более, что это здесь и не нужно. DriverDispatch всегда вызывается на IRQL достаточно низком для выполнения аттача.
     
  19. brainFucker

    brainFucker New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2009
    Сообщения:
    16
    от танкиста танкисту

    черт знает зачем вставил этот код
    Код (Text):
    1. if (currentIrql != PASSIVE_LEVEL)
    2. {
    3.     KeLowerIrql(irql);
    4. }
    отчаялся наверное

    заменил на код предложенный Great

    вот что показывает отладчик
    [​IMG]
    [​IMG]
     
  20. brainFucker

    brainFucker New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2009
    Сообщения:
    16
    ...ляяяя
    как тут картинку вставить?