На рисунке показан taskmgr. При попытке завершить процесс выдалось сообщение о том, что процесс PID: 1680 (taskmgr.exe) пытается завершить процесс с PID: 4 (System.exe).
Об устройстве Dll:
* Загружается Dll в адресное пространство процессов с помощью ключа реестра:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs = C:\HookTermProc.dll
* Перехват осуществляется путем замены первых 5 байт (SetHook()) перехватываемой функции своими, для вызова реальной функции нужно установить обратно замененные байты (UnHook()), а после вызова — снова установить перехват (SetHook())
* Нужно получить Pid «убиваемого» процесса зная hProcess, но hProcess открыт с правами PROCESS_TERMINATE. И при попытке получить Pid с помощью функции GetProcessId(hProcess) – получим ошибку ERROR_ACCESS_DENIED. Поэтому используем функцию DuplicateHandle(*, hProcess, *, &hProcess1, PROCESS_QUERY_INFORMATION, *, *) теперь GetProcessId(hProcess1) выполняется успешно
Здравствуйте, x64, Вы писали:
x64>На Windows XP SP2 и выше рекомендуется пользоваться Microsoft'овской технологией hot-patching.
Про 5 nop'ов перед API функцией для команды jmp я знаю, но никогда не использовал hot-patching т.к.:
1) вызывается функция из NTDLL.DLL (LdrHotPatchRoutine)
2) работает только с WinXP SP2
3) объемность кода (выходит больше чем 120 строк кода)
Microsoft использует hot-patching для того чтобы ставить security патчи на лету ("обновлять Windows без перезагрузки").
Если есть желание продемонстрировать перехват TerminateProcess() используя технологию hot-patching думаю, многим это будет интересно.
X>1) вызывается функция из NTDLL.DLL (LdrHotPatchRoutine)
Значит так, если кому реально интересно как это происходит, читайте здесь раздел HotPatching. Официальная информация здесь, плюс статья базы знаний под номером 897341.
Но можно и по простому, обойтись без всех этих сложностей. Сначала ставишь far jmp вместо 5 байт перед функцией, затем short jmp назад на начало функции минус 5 байт, т.е. на уже подготовленный far jmp. Short jmp занимает 2 байта, т.е. уже меньше проблем с атомарностью операции. Я так делал, хотя, конечно, надо понимать, что для коммерческого продукта просто так оно не делается.
X>2) работает только с WinXP SP2
Да, начиная с Windows XP SP2 или с Windows Server 2003.
X>3) объемность кода (выходит больше чем 120 строк кода)
Да не сказал бы, всё достаточно просто (см. выше).
X>Microsoft использует hot-patching для того чтобы ставить security патчи на лету ("обновлять Windows без перезагрузки").
Да. Впервые появилось для серверных платформ на Windows Server 2003, чтобы уменьшить кол-во перезагрузок собственно сервера.
X>Если есть желание продемонстрировать перехват TerminateProcess() используя технологию hot-patching думаю, многим это будет интересно.
Может быть, как-нибудь... Сейчас мне не интересно заниматься этим.