Как предотвратить внедрение MSIL во время выполнения?

Как показано здесь программная инъекция MSIL или здесь http://www.codeproject.com/Articles/463508/NET-CLR-Injection-Modify-IL-Code-during-Run-time вы можете модифицировать IL-код во время выполнения с помощью некоторых хитрых инъекций.

Мой вопрос: как предотвратить это? Например, если кто-то использует это для обхода функции безопасности, как я могу избежать этой дыры в безопасности?


person Jacques Martin    schedule 04.07.2016    source источник
comment
Этот вопрос в корне некорректен. Если можно обойти некоторые функции безопасности, изменив MSIL, то также возможно обойти те же функции безопасности без изменения MSIL. Какую функцию безопасности вы имеете в виду? Дайте подробную информацию об этом, а затем ответы могут объяснить, как обход этого можно полностью предотвратить или почему обход этого никогда нельзя полностью предотвратить.   -  person    schedule 05.07.2016
comment
Интересный вопрос, добро пожаловать, почему существуют предприятия, единственной целью которых является предотвращение подобных мер. У меня нет ответа, но я могу сказать, что около 15 лет назад я имел обыкновение получать массу удовольствия от взламывания отладчика SoftICE для различных гнусных целей. Урок, который я усвоил тогда, заключается в том, что они (мы) всегда находят выход! В наши дни это намного сложнее, но это быстро становится балансом между раздражающими законными пользователями и предотвращением плохого.   -  person Trevor Ash    schedule 05.07.2016
comment
Предотвратить что именно? Способность пользователя запускать любой код на своих машинах или изменять двоичные файлы так, как они хотят? Запуск кода на вашем собственном сервере доступен только в том случае, если вы не можете позволить себе построить закрытую систему, подобную Xbox/PS.   -  person Alexei Levenkov    schedule 05.07.2016
comment
Например, для входа в систему. Вы входите в приложение, процесс защищен SSL, проверкой хэша, защитой от несанкционированного доступа, защитой от отладки и т. д., но прямо сейчас все, что нужно сделать «плохому парню», — это войти в обычную учетную запись, а затем разблокировать функции приложения посредством внедрения MSI во время выполнения. И я хочу предотвратить это.   -  person Jacques Martin    schedule 05.07.2016
comment
Я бы порекомендовал, чтобы такой критически важный код был написан в нативном коде (и использовал PInvoke или через C++.Net для взаимодействия) или использовал NGen для компиляции нативного кода, что усложняет его выполнение, но не делает его невозможным.   -  person yoel halb    schedule 25.03.2021
comment
Тем не менее, можно было бы обойти что угодно, и лучший способ — использовать функцию входа в систему, чтобы вернуть некоторый токен, и вся соответствующая информация должна быть зашифрована и требует токена для расшифровки, я надеюсь, вы поняли идею и т. д.   -  person yoel halb    schedule 25.03.2021


Ответы (1)


как это предотвратить?

Вы не можете, насколько я понимаю. Но можно сделать сделать это не просто.

В простом случае вам даже не нужно вводить IL. Вы можете сделать плетение IL, чтобы изменить сборку. Например, вы можете найти метод входа в систему и удалить исходный код IL и просто вернуть true, или вы можете перейти к своему собственному методу входа.

public bool Login(string userName)
{
    // original method did security checks 
    // and return true if the user is authorized
    // your implementation can return true or jump to other method
}

Для этого вы должны сделать это, когда приложение не запущено, вы модифицируете саму сборку. Вы можете сделать это с помощью mono.cecil и посмотреть, например, StaticProxy.Fody.

Другой случай — вставка кода в работающую сборку. и это разделить на два случая:

  1. Когда код не перегружен\nгенерирован
  2. Когда код скомпилирован\ngen'd

В первом случае проще, у вас все еще есть IL каждого метода, и вы вводите свои собственные IL-инструкции.

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

Для двух из них вы можете увидеть кучу статей\библиотек, чтобы заставить инжект работать.

Но даже если вы все же сделаете инъекцию невозможной, вы все равно не защититесь. Потому что вы можете изменить сами байты. Подробнее см. в этой статье.

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

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

person Dudi Keleti    schedule 05.07.2016
comment
Вы можете сделать плетение IL, чтобы изменить сборку. Например, вы можете найти метод входа в систему и удалить исходный код IL и просто вернуть true, или вы можете перейти к своему собственному методу входа. Нет, потому что мое приложение защищено от несанкционированного доступа. Так что единственный способ сейчас обойти мою систему входа в систему — это внедрить MSIL во время выполнения. И это возможно, потому что я довольно легко взломал свою собственную программу. то, что я ищу, это КАК ЗАЩИТИТЬ мою программу от инъекции во время выполнения, а не от самой инъекции. Но спасибо за ответ. - person Jacques Martin; 05.07.2016
comment
@JacquesMartin Я понимаю, что вы ищете. Мой ответ таков, что вы не можете, AFAIK, и я объяснил, почему. Буду очень рад, если кто-нибудь ответит, как можно защититься от инъекций. - person Dudi Keleti; 05.07.2016