В этом посте я хочу обобщить идеи защиты от рефлектора, предложенные 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 skipPoppop 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
|