Доброй ночи всем. Перехватываю nOpenProcess по Рему. Когда после загрузки драйвера пытаюсь убить заданный процесс, пришет "отказано в доступе", но при попытке закрыть любой другой процесс, пишет : "error terminate process: неверный хендл". Что за шляпа? Вот код обработчика: Код (Text): newOpenProcess proc ProcessHandle:dword, access_mask:dword, pobject_attribute:dword, pclient_id:dword pushad mov eax, pclient_id .if eax > MmUserProbeAddress ; если переменная указывает на ядерный адрес, то возвращаем ошибку popad mov eax, STATUS_INVALID_PARAMETER ret .endif mov eax,dword ptr [eax] cmp eax, 1836 ; ID процесса jne @f popad mov eax, STATUS_ACCESS_DENIED ret @@: popad push trueOP ret ;переходим на правильную ф-цию ntOpenProcess newOpenProcess endp Что то совсем туго уже к ночи соображается...
Clerk Обна... Т.е., лучше сделать Так: Код (Text): mov eax,trueOP call eax ret Вроде так ? Ща проверю.. Теперь при закрытии др процесса выдает: "Error opening process: Неверная попытка доступа к адресу памяти." Всё..пипец..спать.
Aspire нет не так на входе 4 параметра! Значит на выходе тебе нужно вытолкнуть из стека 4 дворда! т.е. 16 байт!
Спасибо, nester7! Colibri Медитирую... _basmp_ Вот, еще бы поточнее, чтоб запомнить раз и навсегда...
Я никогда не понимал, зачем все любят такой изврат с push XXX/retn ? Чем не устраивает обычный jmp imm32 ?
Неустраивает потомучто придётся считать смещения. Выталкивать из стека ничего не надо(ну кроме адреса перехода). Код (Text): push trueOP retn 0 ;переходим на правильную ф-цию ntOpenProcess Но всёравно код слишком кривой. Определяй процедуру как proc C без параметров и сам считай их в стеке.
Colibri Все еще медитирую. Возможности проверить нет, поскольку нахожусь на работе сейчас. Но понимаю вот что: если мы пытаемся открыть другой процесс, то первые два ret'a просто пролетаются. Great Я просто не уверен,что если я напишу: Код (Text): mov eax,trueOP jmp eax ; то компилятор соберет то, что мне нужно...
[esp+16]: ClientId [esp+12]: ObjectAttributes [esp+8]: DesiredAccess [esp+4]: ProcessHandle [esp]: Address return from call HANDLER_PARAMETERS struct Return PVOID ? ProcessHandle HANDLE ? DesiredAccess ACCESS_MASK ? ObjectAttributes POBJECT_ATTRIBUTES ? ClientId PCLIENT_ID ? HANDLER_PARAMETERS ends PHANDLER_PARAMETERS typedef ptr HANDLER_PARAMETERS PROTECT_PID equ 1836 NtOpenProcessHandler proc C ;ClientId может быть NULL, если процесс открывается по имени. Здесь открываем только через явно заданный PID. lea edx,[esp] assume edx:PHANDLER_PARAMETERS mov ecx,[edx].ClientId mov eax,STATUS_INVALID_PARAMETER cmp MmUserProbeAddress,ecx jnc return_ mov eax,STATUS_ACCESS_DENIED cmp CLIENT_ID.UniqueProcess[ecx],PROTECT_PID je return_ push OriginalHandler retn 0 return_: retn 4*4 NtOpenProcessHandler endp
Clerk Это я еще не проходил, но ошибка вылезала даже если я снова запихиваю все параметры в стек, а потом прыгаю на тру-функцию. Посчитать в стеке параметры, наверное это правильно... Можно поподробней? Упс..уже вижу. Сенкс!
В стеке уже сформировано всё, а ты изменяешь стек, определяе stdcall прототип функции. Я привёл код, как и должно писать одработчик.
Я тоже с этой особенностью компилятора сталкнулся первый раз лет 5 назад, помню в процедуре заливки фигуры.