Из user-mode это сделать невозможно, т.к. иначе вся защита пойдет лесом. Поэтому придется писать драйвер. Как вариант, отдельные порты ввода-вывода можно разрешить еще с помощью TSS. Но это тоже с помощью драйвера.
Mika0x65 Из user-mode это делается через NtSetInformationProcess (см. здесь) я хотел это зделать через драйвер, поэтому и написал сюда, с вариантом изменения IOPM в TSS я уже разобрался, хотелось бы через IOPL
Еще как возможно если есть привелегия(SeTcbPrivilege), нужно выполнить NtSetInformationProcess с классом ProcessUserModeIOPL.
Я хотел изменить IOPL одному единственному user-mode процессу из драйвера ибо "This field can only be modified by the POPF and IRET instructions when operating at a CPL of 0." но по неопытности получаю только BSOD'ы
Запускаю в user-mode приложении функцию GetCurrentProcessId и передаю полученный ProcessId через DeviceIoControl драйверу. В драйвере из ProcessId через PsLookupProcessByProcessId получаю адрес процесса. В w2kundoc.inc документирована часть структуры процесса Код (Text): ; a part of EPROCESS structure (first member) ; also known as Process Control Block, PCB KPROCESS STRUCT ; sizeof = 06Ch Header DISPATCHER_HEADER <> ; 000h DO_TYPE_PROCESS (0x1B) ProfileListHead LIST_ENTRY <> ; 010h DirectoryTableBase DWORD ? ; 018h PageTableBase DWORD ? ; 01Ch LdtDescriptor KGDTENTRY <> ; 020h Int21Descriptor KIDTENTRY <> ; 028h IopmOffset WORD ? ; 030h Iopl BYTE ? ; 032h VdmFlag BOOLEAN ? ; 033h ActiveProcessors DWORD ? ; 034h KernelTime DWORD ? ; 038h ticks UserTime DWORD ? ; 03Ch ticks ReadyListHead LIST_ENTRY <> ; 040h SwapListEntry LIST_ENTRY <> ; 048h ThreadListHead LIST_ENTRY <> ; 050h KTHREAD.ThreadListEntry ProcessLock PVOID ? ; 058h Affinity KAFFINITY ? ; 05Ch StackCount WORD ? ; 060h BasePriority BYTE ? ; 062h ThreadQuantum BYTE ? ; 063h AutoAlignment BOOLEAN ? ; 064h State BYTE ? ; 065h ThreadSeed BYTE ? ; 066h DisableBoost BOOLEAN ? ; 067h PowerState BYTE ? ; 068h DisableQuantum BOOLEAN ? ; 069h Spare BYTE 2 dup(?) ; 06Ah KPROCESS ENDS по смещению 0x30 NT хранит смещение IOPM для каждого процесса об этом есть у Dale Roberts а по смещению 0x32 находится байт с названием Iopl. Пытаюсь поместить туда 3 но в EFLAGS user-mode приложения IOPL по прежднему остаются равным 0. Почему?
Mikl___ Не стоит юзать поля EPROCESS/KPROCESS, ETHREAD/KTHREAD. Они сильно отличаются от версии к версии. Сделай процессу ZwSetInformationProcess (ProcessUserModeIOPL) - из драйвера можно.
Если изменен iopl только у процесса, то нужно создать поток еще один, тогда для этого нового потока iopl обновится, ну и следом после переключения задач обновится и eflags.
не стоит так коряво делать. IRP-хендлеры вызываются уже в контексте твоего процесса. то есть достаточно сделать PsGetCurrentProcess()
Mikl___ Код (Text): VOID Ke386SetIOPL( VOID ) /*++ Routine Description: Gives IOPL to the specified process. All threads created from this point on will get IOPL. The current process will get IOPL. Must be called from context of thread and process that are to have IOPL. Iopl (to be made a boolean) in KPROCESS says all new threads to get IOPL. Iopl (to be made a boolean) in KTHREAD says given thread to get IOPL. N.B. If a kernel mode only thread calls this procedure, the result is (a) pointless and (b) will break the system. Arguments: None. Return Value: None. --*/ { PKTHREAD Thread; PKPROCESS Process2; PKTRAP_FRAME TrapFrame; CONTEXT Context; // // get current thread and Process2, set flag for IOPL in both of them // Thread = KeGetCurrentThread(); Process2 = Thread->ApcState.Process; Process2->Iopl = 1; Thread->Iopl = 1; // // Force IOPL to be on for current thread // TrapFrame = (PKTRAP_FRAME)((PUCHAR)Thread->InitialStack - ALIGN_UP(sizeof(KTRAP_FRAME),KTRAP_FRAME_ALIGN) - sizeof(FX_SAVE_AREA)); Context.ContextFlags = CONTEXT_CONTROL; KeContextFromKframes(TrapFrame, NULL, &Context); Context.EFlags |= (EFLAGS_IOPL_MASK & -1); // IOPL == 3 KeContextToKframes(TrapFrame, NULL, &Context, CONTEXT_CONTROL, UserMode); return; }
n0name адрес процесса можно получить еще вот так Код (Text): mov eax,fs:[124h] mov eax,[eax+44h] TSS учёл ваше замечание о новом потоке, всё заработало, спасибо!
Mikl___ неужели? Это и есть PsGetCurrentProcess(), только в асм виде не надо отсебятины, не редактируйте напрямую поля EPROCESS