Вопросы: 1) как найти указатель на самую первую структуру EPROCESS(ту, которая указывает на SYSTEM)? ZwQuerySystemInformation и другие API не предлагать... Экспортируемые переменные ядра приветствуются... 2) Как называются поля структуры EPROCESS, которые являются указателями на предыдующий и следующий эл-т двустороннего списка данных структур? 3) Сколько и какие параметры берет ф-ция ZwCreateProcess? 4) Я перехватываю ZwTerminateProcess и на попытки закрыть все процессы делаю mov eax,STATUS_ACCESS_DENIED ret При НОРМАЛЬНОМ(не через taskmgr.exe) закрытии самого процесса происходит ошибка, какой бы я статус не ставил. Вопрос - как разрешить самому процессу закрывать себя? Гугл не предлагать... Ибо там был. А если задаю вопросы - значит был, но нифига нужного не достал...
На эти 2 вопроса ответит тебе Свен Шрайбер. Полистай - оччень полезно.(Shreiber, Undocumented windows 2000). Кстати в Руссиновиче есть ответ на второй вопрос. Это уже Гэрри Неббет. Да и вообще говоря, в инете полно, всякого по поводу native api. Один из параметров ZwTerminateProcess - handle процесса. Так вот можно по хэндлу получить ID процесса(уникальный для всей системы), а потом запросить ID текущего процесса непосредственно, и сравнить. PS. прошу прошения - маленькая поправка... Нсчет второго вопроса я написал что в Руссиновиче модно прочесть. На самом деле, все конечно зависит от хидера, в котором определена структура EPROCESS
IoGetCurrentProcess, и иди по Active Processes Links до процесса с pid = 0. ActiveProcessLinks google. Первая же ссылка по NtCreateProcess содержит прототип. проверяй хендл на -1UL.
1. PVOID eprocess; ObReferenceObjectByHandle(h_proc,0,0,KernelMode,&eprocess,NULL); h_proc - хендл процесса SYSTEM 4. имхо, для этого лучше перехватывать OpenProcess
>> как получить ID по Handle? Код (Text): ULONG get_pid_from_eprocess(PEPROCESS eproc) { if (!eproc) return 0xFFFFFFFF; ULONG pid=*(ULONG *)((UCHAR *)eproc+offset_eprocess_pid); return pid; } ULONG get_pid_from_process_handle(HANDLE proc) { PVOID obj; NTSTATUS status=ObReferenceObjectByHandle(proc,0,0,KernelMode,&obj,NULL); if (NT_SUCCESS(status)) { ULONG pid=compat_get_pid_from_eprocess((PEPROCESS)obj); ObDereferenceObject(obj); return pid; } return 0xFFFFFFFF; }
1. чему равно offset_eprocess_pid? 2. а нельзя ли сделать это(получит id по handle) с помощью ZwQueryInformationProcess?
Смещение PID в стркутуре EPROCESS, различается для разных ОСей. Можно только если открыт с PROCESS_QUERY_INFORMATION.