установить IOPL=3?

Тема в разделе "WASM.NT.KERNEL", создана пользователем Mikl___, 23 июн 2010.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Не пинайте сильно... Подскажите как user-mode процессу установить IOPL равным 3?
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Из user-mode это сделать невозможно, т.к. иначе вся защита пойдет лесом. Поэтому придется писать драйвер. Как вариант, отдельные порты ввода-вывода можно разрешить еще с помощью TSS. Но это тоже с помощью драйвера.
     
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Mika0x65
    Из user-mode это делается через NtSetInformationProcess (см. здесь) я хотел это зделать через драйвер, поэтому и написал сюда, с вариантом изменения IOPM в TSS я уже разобрался, хотелось бы через IOPL
     
  4. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Еще как возможно если есть привелегия(SeTcbPrivilege), нужно выполнить NtSetInformationProcess с классом ProcessUserModeIOPL.
     
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Я хотел изменить IOPL одному единственному user-mode процессу из драйвера ибо "This field can only be modified by the POPF and IRET instructions when operating at a CPL of 0." но по неопытности получаю только BSOD'ы
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Запускаю в user-mode приложении функцию GetCurrentProcessId и передаю полученный ProcessId через DeviceIoControl драйверу. В драйвере из ProcessId через PsLookupProcessByProcessId получаю адрес процесса. В w2kundoc.inc документирована часть структуры процесса
    Код (Text):
    1. ; a part of EPROCESS structure (first member)
    2. ; also known as Process Control Block, PCB
    3.  
    4. KPROCESS STRUCT         ; sizeof = 06Ch
    5.     Header              DISPATCHER_HEADER   <>  ; 000h DO_TYPE_PROCESS (0x1B)
    6.     ProfileListHead     LIST_ENTRY          <>  ; 010h
    7.     DirectoryTableBase  DWORD               ?   ; 018h
    8.     PageTableBase       DWORD               ?   ; 01Ch
    9.     LdtDescriptor       KGDTENTRY           <>  ; 020h
    10.     Int21Descriptor     KIDTENTRY           <>  ; 028h
    11.     IopmOffset          WORD                ?   ; 030h
    12.     Iopl                BYTE                ?   ; 032h
    13.     VdmFlag             BOOLEAN             ?   ; 033h
    14.     ActiveProcessors    DWORD               ?   ; 034h
    15.     KernelTime          DWORD               ?   ; 038h ticks
    16.     UserTime            DWORD               ?   ; 03Ch ticks
    17.     ReadyListHead       LIST_ENTRY          <>  ; 040h
    18.     SwapListEntry       LIST_ENTRY          <>  ; 048h
    19.     ThreadListHead      LIST_ENTRY          <>  ; 050h KTHREAD.ThreadListEntry
    20.     ProcessLock         PVOID               ?   ; 058h
    21.     Affinity            KAFFINITY           ?   ; 05Ch
    22.     StackCount          WORD                ?   ; 060h
    23.     BasePriority        BYTE                ?   ; 062h
    24.     ThreadQuantum       BYTE                ?   ; 063h
    25.     AutoAlignment       BOOLEAN             ?   ; 064h
    26.     State               BYTE                ?   ; 065h
    27.     ThreadSeed          BYTE                ?   ; 066h
    28.     DisableBoost        BOOLEAN             ?   ; 067h
    29.     PowerState          BYTE                ?   ; 068h
    30.     DisableQuantum      BOOLEAN             ?   ; 069h
    31.     Spare               BYTE          2 dup(?)  ; 06Ah
    32. KPROCESS ENDS
    по смещению 0x30 NT хранит смещение IOPM для каждого процесса об этом есть у Dale Roberts а по смещению 0x32 находится байт с названием Iopl. Пытаюсь поместить туда 3 но в EFLAGS user-mode приложения IOPL по прежднему остаются равным 0. Почему?
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Mikl___
    Не стоит юзать поля EPROCESS/KPROCESS, ETHREAD/KTHREAD. Они сильно отличаются от версии к версии.
    Сделай процессу ZwSetInformationProcess (ProcessUserModeIOPL) - из драйвера можно.
     
  8. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Если изменен iopl только у процесса, то нужно создать поток еще один, тогда для этого нового потока iopl обновится, ну и следом после переключения задач обновится и eflags.
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    не стоит так коряво делать.
    IRP-хендлеры вызываются уже в контексте твоего процесса.
    то есть достаточно сделать PsGetCurrentProcess()
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Mikl___
    Код (Text):
    1. VOID
    2. Ke386SetIOPL(
    3.     VOID
    4.     )
    5.  
    6. /*++
    7.  
    8. Routine Description:
    9.  
    10.     Gives IOPL to the specified process.
    11.  
    12.     All threads created from this point on will get IOPL.  The current
    13.     process will get IOPL.  Must be called from context of thread and
    14.     process that are to have IOPL.
    15.  
    16.     Iopl (to be made a boolean) in KPROCESS says all
    17.     new threads to get IOPL.
    18.  
    19.     Iopl (to be made a boolean) in KTHREAD says given
    20.     thread to get IOPL.
    21.  
    22.     N.B.    If a kernel mode only thread calls this procedure, the
    23.             result is (a) pointless and (b) will break the system.
    24.  
    25. Arguments:
    26.  
    27.     None.
    28.  
    29. Return Value:
    30.  
    31.     None.
    32.  
    33. --*/
    34.  
    35. {
    36.  
    37.     PKTHREAD    Thread;
    38.     PKPROCESS   Process2;
    39.     PKTRAP_FRAME    TrapFrame;
    40.     CONTEXT     Context;
    41.  
    42.     //
    43.     // get current thread and Process2, set flag for IOPL in both of them
    44.     //
    45.  
    46.     Thread = KeGetCurrentThread();
    47.     Process2 = Thread->ApcState.Process;
    48.  
    49.     Process2->Iopl = 1;
    50.     Thread->Iopl = 1;
    51.  
    52.     //
    53.     // Force IOPL to be on for current thread
    54.     //
    55.  
    56.     TrapFrame = (PKTRAP_FRAME)((PUCHAR)Thread->InitialStack -
    57.                 ALIGN_UP(sizeof(KTRAP_FRAME),KTRAP_FRAME_ALIGN) -
    58.                 sizeof(FX_SAVE_AREA));
    59.  
    60.     Context.ContextFlags = CONTEXT_CONTROL;
    61.     KeContextFromKframes(TrapFrame,
    62.                          NULL,
    63.                          &Context);
    64.  
    65.     Context.EFlags |= (EFLAGS_IOPL_MASK & -1);  // IOPL == 3
    66.  
    67.     KeContextToKframes(TrapFrame,
    68.                        NULL,
    69.                        &Context,
    70.                        CONTEXT_CONTROL,
    71.                        UserMode);
    72.  
    73.     return;
    74. }
     
  11. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    n0name
    адрес процесса можно получить еще вот так
    Код (Text):
    1.     mov eax,fs:[124h]
    2.     mov eax,[eax+44h]
    TSS
    учёл ваше замечание о новом потоке, всё заработало, спасибо!
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Mikl___
    Вызов NtSetContextThread взведёт IOPL в флажках, тоже и при исключениях.
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Mikl___
    неужели? Это и есть PsGetCurrentProcess(), только в асм виде
    не надо отсебятины, не редактируйте напрямую поля EPROCESS
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Great
    +1. Используйте движки для постороения графа :P