Как перехватить любой вызов API на windows x64, x86? - PullRequest
1 голос
/ 15 октября 2019

Я работаю над тем, чтобы перехватить любой вызов API, чтобы выполнить некоторую проверку функции. (Я создаю SandBox)

Первый способ, о котором я думаю, - это использование регистрационного ключа и реализация нашей собственной библиотеки DLL в MicrosoftNT, чтобы иметь возможность перенаправить любой определенный системный вызов. https://www.apriorit.com/dev-blog/160-apihooks. Проблема? работает только на 32-битной, и если бинарник загружает User32.dll, так что это проблема abig.

Второй способ - внедрить dll в процесс? Простой, но невозможный, большинство программ защищено от этих инъекций, поэтому это невозможно.

Последний способ, который я думаю, заключался в том, чтобы изменить SSDT, чтобы изменить адрес функции по моему и перенаправить на оригинал, создав драйвер,Или по InlineHook и просто измените первый байт каждого адреса, который я хочу. Проблема, работающая только на 32 битах, потому что окна добавляют PatchGuard в ядро, поэтому мы не можем этого сделать. Мы можем удалить de PatchGuard, но anticheat заметит технику.

Для Песочницы я думаю, что удалить PatchGuard не составит проблемы.

Основная проблема - анализ в реальном времени. Я понятия не имею, как я могу подключить каждый вызов API, который я хочу, в любой ОС Windows. Я имею в виду на 32 и 62 бит. Я новичок в этой области, которую я начал на этой неделе, поэтому я открыт для любых предложений.

1 Ответ

0 голосов
/ 15 октября 2019

Вы говорите, что хотите подключить каждый вызов API для песочницы, но затем сослаться на SSDT? Это две совершенно разные вещи. Вы хотите подключить VirtualQuery (Ex) или хотите подключить NtQueryVirtualMemory? Из ядра или пользовательского режима? Или, может быть, вы имеете в виду экспорт всех загруженных модулей, а также системные службы ядра?

WinApi

Выполнить итерацию всех загруженных модулей, а также установить событие, чтобы перехватить все будущие загруженные модули. Для каждого вы будете перебирать все экспорты и применять хук по своему предпочтению, который все переходит к некоторому обработчику. Этот обработчик должен быть необработанной сборкой, которая сохраняет состояние процессора, вызывает некоторый метод, который выполняет регистрацию и фильтрацию, восстанавливает состояние процессора, прежде чем, наконец, перейти к оригиналу.

Системные вызовы

  1. Отключите Patchguard и примените перехватчики к каждому методу в таблице обслуживания, аналогичному методу WinApi, описанному выше. Это явно не подходит для производства по понятным причинам.

  2. Используйте инструментальный обратный вызов , который использует ZwSetInformationProcess для перенаправления большинства системных вызовов в произвольный блок сборки. Здесь вы можете извлечь идентификатор системного вызова, а также параметры. Универсальная поддержка является проблемой, так как она не была представлена ​​до W7 iirc, и у вас есть много ограничений до W10.

  3. Сопоставить модуль-оболочку, который имеет хук для каждого системного вызова, с каждым вновь загруженным процессом из ядра. Эти ловушки будут применяться к ntdll и просто вызывать вызов NtDeviceIoControlFile с идентификатором и аргументами syscall, перенаправляя его в драйвер ядра для обработки. Это обычно используется антивирусным программным обеспечением для мониторинга системных вызовов в режиме пользователя без нарушения работы Patchguard.

  4. Наиболее одобренный метод - это, вероятно, обратные вызовы. Вы можете регистрировать обратные вызовы процессов и потоков в ядре, освобождая доступ к дескриптору на досуге. Это даст вам полный контроль над процессом и потоком доступа из внешних процессов, и вы можете добавить файл minfilter, чтобы аналогичным образом ограничить доступ к файловой системе.

...