Подтвердить что ты не робот

Как предотвратить инъекцию DLL

Итак, на днях я увидел это:

http://www.edgeofnowhere.cc/viewtopic.php?p=2483118

и он использует три разных метода DLL-инъекции. Как я могу предотвратить это из процесса? Или, как минимум, как предотвратить первый?

Я думал, что возможно, что Ring 0-драйвер может быть единственным способом остановить все три, но я хотел бы посмотреть, что думает сообщество.

4b9b3361

Ответ 1

Лучшим техническим решением было бы сделать что-то, из-за чего код загрузчика не сможет нормально работать после инициализации вашего процесса. Один из способов сделать это - принять блокировку загрузчика NT, которая эффективно предотвратит любое действие загрузчика. Другие варианты включают в себя исправление кода загрузчика непосредственно в памяти, чтобы сделать вызовы с ошибкой LoadLibrary для злоумышленника (например, вставить точку останова int3 и самостоятельную отладку для обработки ожидаемых случаев).

Но говоря как хакер (тот, кто админирует сайт, на котором вы связаны, на самом деле), вы никогда не станете препятствовать тому, чтобы люди получали код в ваш процесс, так или иначе. LoadLibrary просто удобна для быстрого доступа, но есть много разных способов загрузки кода вручную, что вы никогда не сможете остановить полностью, за исключением чрезвычайно задействованного кода ring0. И даже если вы перейдете на ринг0, хакеры будут рядом с вами.

Кроме того, существует много законных применений для инъекций DLL. Тематические программы, инструменты доступности и различные программы, расширяющие функциональность ОС, могут потенциально использовать DLL-инъекцию, чтобы предоставить дополнительную функциональность любой программе.

Ответ 2

Как защитить от этих трех методов:

CreateRemoteThread

Вы можете предотвратить первый метод (CreateRemoteThread, который вызывает LoadLibrary), подключив LoadLibrary. В вашем случае вы проверяете список имен DLL, которые, как вам известно, являются частью процесса и могут быть загружены, или вы можете проверить список известных DLL, которые вы не хотите загружать.

Когда вы найдете DLL, вы не хотите загружать SetLastError (ERROR_ACCESS_DENIED), а затем возвращать NULL. Я установил последнюю ошибку, чтобы люди, которые пишут код, ищущий код ошибки, получают один. Кажется, что это работает, возможно, более подходящим может быть другой код.

Это остановит загрузку DLL.

SetWindowsHookEx

Я думаю, что тот же метод блокировки CreateRemoteThread будет работать для SetWindowsHookEx, но только если вы сможете установить свой крючок до того, как техника SetWindowsHookEx начала загружать свой код (что обычно происходит при создании первого окна в приложении - так рано в течение его жизни).

Пещера кода

Хорошая техника. Не видел этого раньше. Вы можете защититься от этого, но вам придется привязать точку входа LoadLibrary (а не таблицу IAT), поскольку кодовая строка вызывает LoadLibrary напрямую.

Как прокомментировал автор статьи - существует множество способов нападения на вас, и вам, вероятно, будет трудно победить их всех. Но часто вы только хотите защищаться от определенных DLL-нагрузок (таких как конкретная сторонняя DLL, которая несовместима с вашим программным обеспечением, потому что сторонняя DLL не была написана правильно, чтобы разместить тот факт, что может присутствовать и другой крючок, поэтому вы блокируете это от загрузки).

Ответ 3

Лучшим способом было бы гарантировать, что ненадежный процесс не получит доступ администратора или будет работать как та же учетная запись пользователя, что и ваше приложение. Без этого доступа ввод кода в ваше приложение невозможен; и как только такой процесс получит этот доступ, он может вызвать всевозможные озорства без необходимости вводить себя в другой процесс - инъекция просто упрощает скрытие.

Ответ 4

Поскольку этот плакат ссылается на то, что он инвестирует в игру против взлома, позвольте мне пролить свет на то, что я думаю. Как бывший читер.

Просто указатель на игру против взлома.

Лучший способ - позволить серверу запускать основную логику игры. например В шутере от первого лица отслеживают движения клиентов, отправляемых на сервер. Не позволяйте им перемещаться наугад. Пусть сервер сообщает клиентам, где каждый игрок основан на собственной логике. Никогда не переводите команды вперед. Они могут быть фиктивными.

Кто заботится, взламывает ли хакер своего клиента? просто отказываешься от других, и все хорошо. Для Starcraft maphacks решение прост. Не выдавайте игры для зон, которые должны быть неизвестны. Это также экономит полосу пропускания.

Я был большим мошенником в Delta Force (его старая игра). Основной трюк, который я использовал, это деформировать в любом месте игры, напрямую изменяя память процесса. Не требуется DLL!

Ответ 5

Вы ищете решение Ring3? Если это так, вы хотите создать дополнительную функциональность в системе, которая в настоящее время (по крайней мере, насколько мне известно) не предоставлена ​​из коробки, поэтому для этого потребуется немного работы. Кроме того, это возможно из драйвера, на самом деле большая часть вашего программного обеспечения AV регулярно выполняет этот вид деятельности.

Как для остановки вышеуказанных методов из пользовательского режима, это становится немного сложнее, поскольку вы не можете просто зарегистрировать себя как обратный вызов для создания процесса или загрузки DLL. Тем не менее, если вы предполагаете, что ваш процесс начался раньше их, зацепите CreateRemoteThread и другие подобные функции во всем мире и выполните этот тип проверки самостоятельно.

Таким образом, вы хотите проверить, где CreateRemoteThread хочет создать поток, и вернуть ошибку, если вы не удовлетворены этим.

Это отрицает первые два метода. Для третьего метода, если у вас есть допустимые хэши исходной программы на диске, вы всегда можете проверить хэш перед загрузкой. Если у вас нет хэшей, вы можете, по крайней мере, просто проверить некоторые из простых мест, которые кто-то добавил бы в этот тип кода, и искать библиотеки DLL, которые вы не ожидаете там (например, IAT или запустить строки).

Это не безупречно, но, похоже, дает запрошенную вами функциональность.

Ответ 6

Почему вы хотите предотвратить это? Это реальная "деловая" потребность, или вас просто интересует "взломать", чтобы противостоять "взлому"

Если права пользователя разрешают это, он по дизайну - ОС предоставляет возможность всем пользователям, которые вы, администратор системы, назначили учетным записям, в которых они выполняются.

Раймонд Чен скоро свяжется с нами...

Ответ 7

Просто краткие мысли для обсуждения:)

Использование кодовой пещеры для вставки проверки CRC в ваш собственный код, возможно, замедлит других использование других кодовых пещер.

Опрос списка модулей процесса для неизвестной DLL, загружаемой, может помочь замедлить людей, просто вставляя любую старую вещь с помощью прикрепленного потока и крючков сообщения.

Ответ 8

Я не знаком с Windows API, но могу дать вам еще несколько обобщенных указателей:

  • Посмотрите, можете ли вы использовать Windows Data Execution Prevention (DPE). Вероятно, это не сработает для всех (прочитанных: большинство) ситуаций, потому что процесс, указанный в вашей ссылке, является действительным процессом с точки зрения ОС. Оборона в глубине, хотя

  • Убедитесь, что ваши методы процесса утверждают разрешения безопасности во всем приложении

  • Статически выделяйте пространство памяти, чтобы все новые потоки, возникшие в нем, либо сбой, либо перезапись существующего пространства памяти; вам понадобится здоровенный кусок   логики для обнаружения и исправления для этого, хотя.

  • Кодируйте свой код в драйвере устройства или в каком-то другом процессе низкого уровня, который можно охватить под защитой Windows File Protection.

Только что увидел ответ Ктулона (приятное имя, кстати!), и я боюсь, что он, вероятно, исправит: любой, кто хочет выполнить инъекцию кода в вашем приложении, найдет способ сделать это. Вышеупомянутые шаги могут сделать это немного сложнее.

Надеюсь, что это поможет