как это предотвратить?
Вы не можете, насколько я понимаю. Но можно сделать сделать это не просто.
В простом случае вам даже не нужно вводить 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.
Другой случай — вставка кода в работающую сборку. и это разделить на два случая:
- Когда код не перегружен\nгенерирован
- Когда код скомпилирован\ngen'd
В первом случае проще, у вас все еще есть IL каждого метода, и вы вводите свои собственные IL-инструкции.
Второй случай более сложен, поскольку Jitter перенаправляет указатель IL на машинный код.
Для двух из них вы можете увидеть кучу статей\библиотек, чтобы заставить инжект работать.
Но даже если вы все же сделаете инъекцию невозможной, вы все равно не защититесь. Потому что вы можете изменить сами байты. Подробнее см. в этой статье.
Для всех вышеперечисленных методов бывают случаи, когда выполнить работу сложнее. Например, Generics, DynamicMethods предотвращают загрузку сборок в ваш процесс (что необходимо в некоторых случаях).
Подводя итог, вы можете сделать это очень трудно, чтобы внедрить свой код, но не предотвратить его.
person
Dudi Keleti
schedule
05.07.2016