Как я предотвращаю Внедрение DLL

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

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

let
    Source = Excel.CurrentWorkbook(){[Name="Data"]}[Content],
    SplitDateTime = Table.SplitColumn(Table.TransformColumnTypes(Source, {{"Booking time", type text}}, "en-GB"), "Booking time", Splitter.SplitTextByDelimiter(" ", QuoteStyle.Csv), {"Date", "Time"}),
    FilteredDoorside = Table.SelectRows(SplitDateTime, each ([Doorside] <> "-")),
    ChangedType = Table.Buffer(Table.TransformColumnTypes(FilteredDoorside,{{"Date", type date}, {"Time", type time}, {"User", type text}, {"Doorside", type text}})),
    GetCloseTime = Table.AddColumn(ChangedType, "Duration", (row)=>List.Min(Table.SelectRows(ChangedType, each [Date]=row[Date] and [Time]>row[Time])[Time]) - row[Time]),
    SetType = Table.TransformColumnTypes(GetCloseTime,{{"Duration", type duration}})
in
    SetType

На шаге GetCloseTime я добавляю столбец функции, который выбирает строки из таблицы self с той же датой. и позже во времени, а затем выбирает минимальное время. Это будет в следующий раз. Вы можете добавить дополнительные критерии, если вам нужно.

Другой способ - использовать List.Min для создания отсортированной производной таблицы и взять ее 1-ую строку и значение в столбце Time: {0}[Time]

let
    Source = Excel.CurrentWorkbook(){[Name="Data"]}[Content],
    SplitDateTime = Table.SplitColumn(Table.TransformColumnTypes(Source, {{"Booking time", type text}}, "en-GB"), "Booking time", Splitter.SplitTextByDelimiter(" ", QuoteStyle.Csv), {"Date", "Time"}),
    FilteredDoorside = Table.SelectRows(SplitDateTime, each ([Doorside] <> "-")),
    ChangedType = Table.Buffer(Table.TransformColumnTypes(FilteredDoorside,{{"Date", type date}, {"Time", type time}, {"User", type text}, {"Doorside", type text}})),
    GetCloseTime = Table.AddColumn(ChangedType, "Duration", (row)=>Table.FirstN(Table.Sort(Table.SelectRows(ChangedType, each [Date]=row[Date] and [Time]>row[Time]),{{"Time", Order.Ascending}}),1){0}[Time] - row[Time]),
    SetType = Table.TransformColumnTypes(GetCloseTime,{{"Duration", type duration}})
in
    SetType
32
задан sashoalm 6 November 2015 в 07:31
поделиться

7 ответов

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

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

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

33
ответ дан 27 November 2019 в 20:38
поделиться

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

6
ответ дан 27 November 2019 в 20:38
поделиться

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

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

Рэймонд Чен скоро подключится сюда ...

0
ответ дан 27 November 2019 в 20:38
поделиться

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

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

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

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

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

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

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

0
ответ дан 27 November 2019 в 20:38
поделиться

Вы ищете модификатор /.../ s , также известный как модификатор dotall . Он заставляет точку . также для сопоставления символов новой строки, что не выполняет по умолчанию.

Плохая новость в том, что он не существует в JavaScript (он существует с ES2018, см. ниже) . Хорошая новость заключается в том, что вы можете обойти это, используя класс символов (например, \ s ) и его отрицание ( \ S ) вместе, например:

[\s\S]

Итак, в вашем Если регулярное выражение будет выглядеть следующим образом:

/<div class="box-content-5">[\s\S]*<h1>([^<]+?)<\/h1>/i

Начиная с ES2018, JavaScript поддерживает флаг s (dotAll), поэтому в современной среде ваше регулярное выражение может быть таким, как вы его написали, но с s флаг в конце (а не м ;

1
ответ дан 27 November 2019 в 20:38
поделиться

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

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

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

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

Это не надёжно, но похоже, что даёт требуемые функции.

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

Это не надёжно, но похоже, что даёт требуемые функции.

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

Это не надёжно, но похоже, что даёт требуемые функции.

2
ответ дан 27 November 2019 в 20:38
поделиться

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

CreateRemoteThread

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

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

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

SetWindowsHookEx

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

Code Cave

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

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

12
ответ дан 27 November 2019 в 20:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: