Как предотвратить внедрение DLL - PullRequest
32 голосов
/ 15 мая 2009

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

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

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

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

Ответы [ 8 ]

33 голосов
/ 15 мая 2009

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

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

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

12 голосов
/ 07 апреля 2010

Как защититься от этих 3 техник:

CreateRemoteThread

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

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

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

SetWindowsHookEx

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

Код пещеры

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

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

6 голосов
/ 15 мая 2009

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

4 голосов
/ 11 апреля 2011

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

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

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

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

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

2 голосов
/ 16 июля 2009

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

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

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

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

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

1 голос
/ 01 июля 2009

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

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

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

0 голосов
/ 15 мая 2009

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

  1. Посмотрите, можете ли вы использовать Windows Data Execution Prevention (DEP). Это, вероятно, не будет работать для всех (читай: большинства) ситуаций, потому что процесс, описанный в вашей ссылке, является действительным процессом с точки зрения ОС. Глубокая защита, хотя

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

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

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

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

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

0 голосов
/ 15 мая 2009

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

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

Рэймонд Чен скоро будет здесь связываться ...

...