Шифрование DLL C ++ / CLI / clr и Assembly.Load () - PullRequest
1 голос
/ 24 декабря 2009

ребята. Я разрабатываю клиентское программное обеспечение для интернет-сообщества, к которому я принадлежу. Чтобы позволить мне написать клиент для этого, владельцы и веб-мастера требуют, чтобы мой код был зашифрован (а не просто запутан). Большая часть моего проекта написана на VB.NET (F3.5), а некоторые используют SQLite и libcrypt через C ++ / CLI по соображениям производительности (поэтому я не могу использовать / clr: safe). Другими словами, было бы бессмысленно писать код на C ++ / CLI, если бы использовался / clr: safe (я бы просто написал весь код на VB, что гораздо проще).

Если бы это был только проект VB, я просто написал бы загрузчик C ++, расшифровал код из хранилища в память и затем использовал Assembly.Load (), чтобы запустить его с помощью какого-либо открытого метода (например, Main Form) , Однако какая-то необъяснимая политика мешает мне делать это с непроверенным кодом C ++ / CLI. Я в растерянности, потому что я могу использовать любую «небезопасную» DLL без ограничений, используя обычный механизм загрузки DLL, но по какой-то причине я не могу сделать это с Assembly.Load (). Я не понимаю, почему это должно быть более безопасно (учитывая, что доступен другой вариант). Caspol.exe не помогает, и даже если это так, я не могу попросить всех в моем сообществе отключить защиту доступа на своих машинах. Непосредственная загрузка EXE или DLL из памяти не представляется осуществимой ( UPX делает это с обычными DLL, но не с .NET DLL).

Поэтому я спрашиваю следующее:

  • Ребята, вы можете придумать какой-нибудь метод, который я мог бы использовать для шифрования MISL-части C ++ / CLI DLL? (Я думаю, что код смешан с обычным машинным кодом x86).

  • Есть ли способ загрузить непроверенную .NET DLL из байтов, как я пытался сделать с Assembly.Load?

В качестве альтернативы, поскольку CreateProcess () и LoadLibrary () принимают только пути, хотя я мог бы написать временный образ EXE и запустить его из хранилища. Но мне нужно, чтобы изображение было недоступно для пользователя, поэтому запись его на диск была бы просто глупой; это должно быть что-то нестабильное, например частный виртуальный диск или что-то в этом роде. Что-нибудь приходит на ум? (Windows 2000 и выше).

Большое спасибо,

Guille

Ответы [ 3 ]

1 голос
/ 24 декабря 2009

Вы можете загрузить из потока, используя метод AssemblyResolve . См. этот ответ для деталей.

0 голосов
/ 16 июля 2013

Вы можете проверить это

http://www.codeproject.com/Articles/21888/A-Simple-Way-to-Pack-your-NET-Code-into-a-Single-E

это тебе очень поможет

0 голосов
/ 01 марта 2010

Assembly.Load (byte [] ...) явно запрещает непроверяемые сборки (смешанный режим). Вы можете проверить проблему на Microsoft Connect .

...