2010-03-10 6 views
6

Comment serait-il difficile de récupérer des ressources embarquées à partir d'une application .NET, depuis l'extérieur de l'application elle-même? Même si les ressources sont compressées et cryptées de manière triviale, à quel point est-il difficile de les récupérer à l'aide d'un outil? (Je ne suis pas concerné par la protection des données en soi, seulement les méthodes de récupération de la ressource elle-même)Quelle est la sécurité des ressources dans .NET?


EDIT:

Je pense que ma question a été mal compris, il était moins sur le cryptage et plus sur la récupération, autre que le réflecteur, quoi d'autre peut être utilisé?

+2

Encrypted comment, exactement? –

+0

Beaucoup d'outils peuvent le faire. ILSpy peut le faire par exemple. Les ressources sont facilement récupérables. Et la méthode de décryptage que vous utilisez en interne dans l'assembly .NET peut être facilement annulée. – BrainSlugs83

Répondre

8

Il est trivial de récupérer des ressources à partir d'une DLL .NET compilée à l'aide d'outils tels que .NET Reflector ou .NET Resourcer.

+0

Y a-t-il un autre moyen que vous connaissez? Je vais tester Resourcer, mais Reflector n'est actuellement pas un problème. –

+2

Eh bien, vous pourriez écrire un peu de code. Assembly.GetManifestResourceStream(). –

+0

Essayez également d'ouvrir l'assembly dans Visual Studio. Juste curieux, avez-vous trouvé que Reflector ne peut pas les extraire? –

6

Si vous cryptez les ressources avec une clé intégrée dans l'application, il sera facile de récupérer la clé, et donc les ressources, avec un peu de reverse engineering.

Si vous les cryptez à l'aide d'un algorithme sécurisé et demandez à l'utilisateur d'entrer le mot de passe, il sera impossible d'extraire les ressources sans le mot de passe. Mais je suppose que ce n'est pas ce que tu veux. Je suppose que vous voulez empêcher l'utilisateur d'utiliser vos ressources en dehors de l'application?

Si oui, la réponse courte est: les ressources dans .NET ne sont pas sécurisées.

+3

Je vous ai mis à jour; Cependant, les ressources de RACONTE ne sont pas sécurisées. Peu importe la langue que vous utilisez, si la clé de chiffrement est intégrée dans l'application elle-même, elle peut être retirée. – NotMe

2

Si je vous montre un coffre-fort avec un million de dollars, alors partez, vous finirez par entrer dans ce coffre-fort. Il n'y a aucune technologie qui protégera cet argent, votre seul véritable obstacle est le temps.

Il en est de même pour le logiciel. La seule façon de protéger les ressources est de ne pas les placer là où quelqu'un peut, avec suffisamment de temps, les atteindre. L'option la plus efficace que je connaisse est de stocker les ressources critiques sur un serveur que vous contrôlez.

Bien sûr, beaucoup de gens se trompent. D'une manière ou d'une autre, ils permettent à la ressource sécurisée d'être temporairement copiée sur l'ordinateur de l'utilisateur. À quel moment, le jeu est perdu. Cela signifie que vous ne pouvez réellement sécuriser que les ressources ayant un clone temporaire. Par exemple, un jeton de sécurité qui expire ou les résultats de calcul qui ne révèlent pas comment le calcul a été effectué.

2

Le problème concerne moins les ressources .NET et plus la sécurité en général. Vous pourriez reformuler la question en disant que «mon application client stocke des secrets que je ne veux pas inverser» et ne change pas l'intention.

Que contient votre fichier de ressources et pourquoi doit-il être sécurisé? Avez-vous considéré un design dans lequel vous ne stockez pas ces secrets sur le client du tout? Si vous comptez sécuriser vos secrets côté client, je pense que vous serez déçu.

+1

Qu'en est-il d'un fichier de licence qui vous permet d'utiliser une bibliothèque tierce? - Si vous souhaitez utiliser cette bibliothèque tierce sur le client, vous devez pouvoir accéder à ce fichier de licence, sur le client, mais vous ne voulez pas que l'utilisateur final puisse extraire le fichier de licence. et réutilisez-le lui-même ... - s'il est divulgué, la licence est révoquée. Alors, comment sécurisez-vous? – BrainSlugs83

3

Voici un code rapide pour extraire des ressources des assemblages. Vous décidez comment il est facile et sécurisé ...

class Program 
{ 
    static void Main(string[] args) 
    { 
     var assemblies = from file in args 
         let assembly = TryLoad(file) 
         where assembly != null 
         from rName in assembly.GetManifestResourceNames() 
         select new { assembly, rName }; 

     foreach (var item in assemblies) 
      using (var rs = item.assembly 
           .GetManifestResourceStream(item.rName)) 
       SaveTo(rs, item.rName); 

    } 

    static void SaveTo(Stream stream, string name) 
    { 
     var buffer = new byte[32*1024]; 
     var bufferLen = 1; 
     using (var fs = new FileStream(name, FileMode.Create)) 
      while (bufferLen > 0) 
       if ((bufferLen = stream.Read(buffer, 0, buffer.Length)) > 0) 
        fs.Write(buffer, 0, bufferLen); 
    } 

    static Assembly TryLoad(string filename) 
    { 
     if (string.IsNullOrEmpty(filename) || 
      !File.Exists(filename)) 
      return null; 
     try 
     { 
      var fullName = Path.GetFullPath(filename); 
      return Assembly.LoadFile(fullName); 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine(ex); 
      return null; 
     } 
    } 
} 
Questions connexes