Я пытаюсь создать часть программного обеспечения, которая позволяет пользователю входить в систему и передавать поток байтов [] DLL для использования для инъекции. Например
public static byte[] getDLL()
{
using (WebClient wc = new WebClient())
{
Uri url = new Uri("http://mysite/dll.dll");
return wc.DownloadData(url);
}
}
Мне удалось сделать это в C # с использованием Visual Studio. Однако вы можете легко декомпилировать программу и заставить ее создавать dll в определенном месте на вашем компьютере, что приводит к ее утечке. И я почти не могу это предотвратить.
Буду ли я лучше использовать язык, который сложнее декомпилировать, например, скажем, C ++ или C, или я просто столкнусь с той же проблемой, что и язык, который я использую? И это действительно стоит усилий.
Мне не очень понятен первый абзац вашего вопроса. Но вот вам идея.
Простая декомпиляция не является проблемой, если посторонние не могут использовать сгенерированный код для захвата вашей сборки.
Насколько я понимаю, существует множество инструментов для «разумной декомпиляции» или просмотра содержимого сборок .NET.
Если вы используете C ++ или C, существуют декомпиляторы. Исходный код, созданный ими, не является точным и требует много ручной работы.
Во-вторых, если вы использовали родной язык, такой как C или C ++, у него много уязвимостей. Вы должны использовать все передовые практики, чтобы избежать подобных проблем. https://www.securecoding.cert.org/confluence/pages/viewpage.action?pageId=637
Есть инструменты, позволяющие избежать декомпиляции. ты можешь гуглить Obfuscator
, некоторые известные — Dotfuscator, Secure Team.
А также вы можете подумать об изменениях архитектуры проекта. такие как включение кода DLL в основной EXE и т. д.
Также вы можете использовать механизм генерации ключей для проверки DLL. Сразу после загрузки DLL-файла вызовите общую функцию в DLL и получите one time key
и проверить.
Вы не можете предотвратить декомпиляцию ничего, ни C #, ни C ++, ни чего-либо еще.
Такие языки, как C ++, требуют больше ручной работы по сравнению, например, с. C # и обфускаторы могут усложнить понимание кода, но все просто замедляет то, что делает, вместо того, чтобы предотвращать это.
(И такие вещи, как DLL и шифрование не помогут вообще для защиты кода)
Если проблема в том, что какой-то пользователь программы может увидеть полный код, вы делаете что-то не так. Любые секреты, такие как пароли и т. Д., Не принадлежат файлам, которые получает пользователь, но на каком-то сервере, контролируемом вами, и доступны для пользователя только через сетевые подключения и т. Д.