?

Log in

No account? Create an account
 

Обьяснение принципов защиты от Рефлектора - Russian DotNet Alliance

About Обьяснение принципов защиты от Рефлектора

Previous Entry Обьяснение принципов защиты от Рефлектора 12 ноя, 2005 @ 13:16 Next Entry
В этом посте я хочу обобщить идеи защиты от рефлектора, предложенные vitaly_cypress здесь и kaban_mefodyi здесь.
Значит для начала уточним исходные позиции любую нетовскую программу можно ildasm превратить в msil код, откомпилировать это код ilasm и получить равноценную копию этой программы. Как этому противостоять я не знаю, в этой статье рассматриваются меры противодействия декомпиляции программы на любой язык программирования .NET, кроме IL.
Далее везде речь пойдет о C#, но нижесказанное справедливо для любого языка высокого уровня

Базовая идея того, что будет дальше излагаца, состоит в следующем, не все последовательности конструкций IL можно перевести на C#. Например, что является аналогом операций: ldc, pop в C#?. Таких атомарных конструкций у C# нет.
Рассмотрим на практике пример. Я его минимизировал, чтобы показать саму суть:
.method public hidebysig static void SeeMeInReflector() cil managed
{
br.s skipPop
pop
skipPop:
<...Здесь мог быть Ваш гениальный код...>
}
Что происходит, когда эта функция открывается Reflector с выбранным C#? Аналога pop нет, а выкинуть этот кусок кода у рефлектора наглости не хватает и он честно вылетает по exception.

Теперь этот:
call string ConsoleApplication1.Program::MyReadLine()
ldstr "Hello "
call void ConsoleApplication1.Program::MyWrite(string)
void ConsoleApplication1.Program::MyWrite(string)
переводится в
Program.MyWrite("Hello ");
Program.MyWrite(Program.MyReadLine()); (поменялся порядок вызовов методов!)

В данном случае  в C# нельзя разнести вызов функции и установку аргументов. В IL коде сначала накидали аргументов для двух функций, а потом их вызвали. Причем Рефлектор не вылетает по exception, а просто тихо генерит неправильный код. Это даже лучше, поскольку можно очень злобно обыграть, ну а тестовая программа это обнаружит и выдаст предупреждение.

Теперь как делаеца защита программы, компилируется C# версия программы. потом ildasm получаеца исходный код, который немного меняется ручками в текстовом редакторе, поскольку Visual IL .NET. 
Код, подтверждающий вышеизложенные идеи

UPD. я честно хотел пошутить насчет Visual IL.NET, но как оказалось в каждой шутке есть доля истины.
На что мне указал vitaly_cypress и дал ссылку на Visual IL.NET
Оставить комментарий
From:ivaliy
Date:Ноябрь, 15, 2005 06:29 (UTC)
(Link)
http://blogs.msdn.com/ericlippert/archive/2005/11/14/492607.aspx
Вот тут есть статья по шарпу, насколько я понял, в шарпе возможна геренация IL кода, который нельзя будет декомпилировать обратно в шарп при помощи рефлектора, хотя статья конечно о другом :).

предыстория здесь.
http://blogs.gotdotnet.ru/personal/mihailik/PermaLink.aspx?guid=f9040488-1eac-4a02-8768-330c0aafd7f5
From:kaban_mefodyi
Date:Ноябрь, 16, 2005 11:41 (UTC)
(Link)
1) в той статье речь идет о том, почему компилятор генерит warning при компиляции определенного кода с анонимным делегатом и как исправить такой код, чтобы он стал верифицируемым программой PeVerify. 2) Относительно решаемой сабжем проблемы достаточно обьявить просто анонимного делегата и код нельзя будет скопировать простым копипастом. Как я понимаю тоже самое будет и для генерика. Но такое решение будет работать только под .net 2.0 и до выходы новой версии рефлектора, поддерживающего эти конструкции.
From:kaban_mefodyi
Date:Ноябрь, 16, 2005 12:14 (UTC)
(Link)
И еще 2 копейки по поводу той статьи..
честно не понимаю, почему людей так смущает слово unsafe.
Я лично вставлял в свои програмы unsafe код, чтобы использовать pointer
для реализации быстрого поиска последовательности байт в другой последовательности байт и не вижу почему бы такой возможностью не пользоваца.
Что нестабильность программы увеличивается если компилятор warning напишет или не напишет? страусиная позиция.
Я это поводу статьи той исключительно, посколько вы ее читали захотелось поделица своим мнением.

From:ivaliy
Date:Ноябрь, 17, 2005 07:18 (UTC)
(Link)
unsafe не смущает ни разу, просто в моих проектах не требуется вот и не использую. Нестабильность программы от того, что компилятор напишет warning или не напишет не увеличивается, но сами warning честна говоря ни на дух не перевариваю.
From:(Anonymous)
Date:Ноябрь, 18, 2005 08:23 (UTC)

compile it to the end

(Link)
http://www.remotesoft.com/salamander/protector.html
(Оставить комментарий)
Top of Page Разработано LiveJournal.com