IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

[VB2005] Utilisation de DLL native cryptée


Sujet :

VB.NET

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Par défaut [VB2005] Utilisation de DLL native cryptée
    Bonjour,
    Je souhaite utiliser dans une appli VB.Net une classe dont les méthodes ne doivent pas être visualisées.

    Première idée : crypter au préalable le fichier comportant cette classe et, via le CodeDomProvider et sa méthode CompileAssemblyFromSource, exploiter les méthodes de cette classe en passant en paramètre la string décryptée (après chargement en mémoire du fichier crypté et décryptage de la chaîne chargée). Au passage merci à developpez.com pour les tutos !).
    Problème : un outil comme Reflector permettrait de voir le contenu de ces méthodes à l'exécution...

    Deuxième idée : utiliser une DLL générée sous Delphi (mais peu importe le langage finalement du moment qu'elle est native).
    Je ne rencontre aucun soucis lorsque la DLL est chargée via le DllImport. Par contre, il me semble qu'un bon outil pourrait visualiser le contenu des méthodes compilées dans la DLL (ceci dit, je n'en ai pas l'absolue certitude...)

    J'ai donc cherché à mélanger les deux idées à savoir crypter la dll native, et appeler les méthodes s'y trouvant après avoir lu et décrypté le fichier.

    Et là, ça coince... car le DLLImport ne fait pas l'affaire et le codeDom non plus !

    Quelqu'un a t'il une idée pour contourner ce problème à savoir appeler les méthodes d'une DLLNative qui ne serait pas dans un fichier mais uniquement en mémoire ?

    Merci par avance de vos réponses...

  2. #2
    Membre Expert
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Par défaut
    Salut

    A un moment ou a un autre, on pourra jouer de la reflexion sur ton assembly et voir ce qu'il y a dedans.

    Il y a une methode qui s'appelle l'obfuscation, elle consiste non pas a crypter le code mais a le rendre difficilement lisible (renommage de variables, labyrinthe d'appels...) Il y en a un dans VS (edition non express)
    Autre obfuscateurs commerciaux:
    http://lgmorand.developpez.com/dotnet/smartassembly/
    http://morpheus.developpez.com/xenocode/

    Si vraiement il y a trop peu de code et que l'obfuscation ne se revele pas efficace, la solution est de coder une DLL dans un langage non .Net (C++ nature, VB6...) et de l'appeler depuis ton appli .Net

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Par défaut
    Salut et merci de ta réponse.
    Je connais bien l'obfuscation (je suis en train de développer mon propre soft là dessus) et je compte bien l'appliquer en plus du cryptage (j'dois être parano de la sécurité )
    C'est bien pour résoudre cette problématique d'assembly que je souhaite utiliser des dll natives (pas de soucis pour le faire) et cryptées (c'est là que le bas blesse !)

  4. #4
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Ce n'est plus de la parano, c'est du gaspillage de ressources.
    De toute façon, il n'y a pas de sécurité parfaite, à moins que ton application gère les codes pour les sous-marins nucléaires, je ne vois pas trop l'intérêt de faire plus que déplacer le code dans une dll non managée.

    Après tu peux aussi embaucher un porte-flingue de la mafia russe, lui fournir un steelcase (avec un cd contenant ton application) menoté à son poignet, l'envoyer chez le client en utilisant un itinéraire déterminé pendant le trajet. Il est évident que le cd se détruit automatiquement si la mallette n'est pas ouverte avec la bonne empreinte retinienne et vocale. Il se détruit aussi dans le cas où le numéro de série du lecteur CD n'est pas préalablement enregistré dans le programme. Le cd se détruit automatiquement lors de l'éjection du lecteur pour éviter d'être réutilisé.
    Avec ça, tu devrais être à l'abri pour quelque temps, ton application qui gère tes divx est protégée (autant que faire se peut).

    A oui et n'oublie pas de faire exécuter ton client après pour ne pas qu'il divulgue des informations sur ton programme.

    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  5. #5
    Membre Expert
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Par défaut
    Quelqu'un a t'il une idée pour contourner ce problème à savoir appeler les méthodes d'une DLLNative qui ne serait pas dans un fichier mais uniquement en mémoire ?
    Normalement il y a deux moyens pour les Dlls managees en memoire:
    - La reflexion (codedom) ()
    - L'implementation d'une Interface commune entre l'appli et la dll en memoire

    La derniere solution est peut etre possible pour des dlls non managees

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Par défaut
    Citation Envoyé par Piotrek
    Normalement il y a deux moyens pour les Dlls managees en memoire:
    - La reflexion (codedom) ()
    - L'implementation d'une Interface commune entre l'appli et la dll en memoire

    La derniere solution est peut etre possible pour des dlls non managees
    Ah que voilà, môssieur Piotrek une piste interessante de travail que je vais de ce pas explorer (sinon, je ferai appel au porte flingue ) !
    Il est clair, môssieur SaumonAgile que la sécurité absolue n'existe pas mais ce qui m'interesse avant tout, c'est d'appliquer la maxime "il n'y a pas de problème, il n'y a que des solutions", autrement dit, de mettre au point une solution originale/atypique qui puisse contrer le hacker de base (et juste celui là) pour faire face à une problématique de confidencialité d'algorithme.

    Et puis y'a aussi l'apétit de connaissance et d'exploration de cette jungle de classe et de méthodes qu'est devenue le framework 2

    Ceci dit, pour mettre en place cette solution, je ne connais actuellement que les méthodes GetMethods et GetTypes qui s'appliquent à une assembly...donc à des dll managées.
    Je vais chercher un peu plus chez l'ami (?) MSDN...

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Par défaut
    Bien bien...
    L'ami MSDN ne m'a pas été d'une grande utilité...
    Une DLL native semble ne pas pouvoir être lue autrement que par une lecture directe du fichier.

    Par contre, une classe dotnet encryptée qui est décryptée et compilée via la méthode CompileAssemblyFromSource, en précisant les paramètres :
    - GenerateExecutable = False
    - GenerateInMemory = True
    génère en mémoire une DLL (dont le nom est une suite aléatoire de 8 caractères alphanumériques) que Reflector ne voit pas (enfin, que je n'ai pas réussi à voir sous Reflector ) et qu'un outil comme Process Explorer ne voit pas non plus.

    Alors que demander de plus !!!

  8. #8
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    whaou, CompileAssemblyFromSource ?? donc ça veux dire qu'à un moment il y aura dans une variable de ton programe managé tout le code source de ta dll ?? c'est trop beau pour être vrai, il suffirai donc d'un outil de debug ou d'un profiler pour exécuter pas à pas ton programme et donc avoir à un moment tout le code de ta dll ?

  9. #9
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Citation Envoyé par smyley
    whaou, CompileAssemblyFromSource ?? donc ça veux dire qu'à un moment il y aura dans une variable de ton programe managé tout le code source de ta dll ?? c'est trop beau pour être vrai, il suffirai donc d'un outil de debug ou d'un profiler pour exécuter pas à pas ton programme et donc avoir à un moment tout le code de ta dll ?
    Chuuuuuttt, c'est un programme ultra-sécurisé, il ne faut pas le dire
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Par défaut
    Merci Smyley pour ce rappel.
    A force de focaliser sur le fait de rendre des fichiers illisibles, j'en oublie la perméabilité des analyses de la mémoire.

    Il est vrai que je ne connais pas le pouvoir/les possibilités de ces outils de débogage mais si l'appel à la fonction de décryptage se fait en paramètre du compileassemblyfromsource, sans donc passer par une variable, on limiterait les dégats...

    Il va de soi aussi que le code source serait obfusqué...

  11. #11
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Citation Envoyé par nikoko34
    mais si l'appel à la fonction de décryptage se fait en paramètre du compileassemblyfromsource, sans donc passer par une variable, on limiterait les dégats...
    Non, on serai désespéré, car celà ne changerai rien, il y aura toujours à un moment sur la pile tout le code de ton programme de 1, et de 2, dans le code source de CompileAssemblyFromSource, rien ne te dit que M$ n'utilise pas une variable pour stoquer le code ( et d'ailleurs, c'est le cas )...

    Citation Envoyé par nikoko34
    Il va de soi aussi que le code source serait obfusqué...
    Je savais qu'on pouvais obfusquer des dlls, mais les fichiers sources ... et même si on le peut, dans ce cas, pourquoi ne pas tout simplement utiliser les dlls normallement, mais en les obfusquant avant la distribution de ton programme ? ( j'ai l'impression qu'on te la déjà dit plus haut ... ) car en ajoutant un CompileAssemblyFromSource, tu ne protèges pas ton programme, tu évites juste au cracker d'avoir à chercher le code source avec Reflector ... de plus, la dll compilée serai elle aussi accessible pour un cracker un peut plus expérimenté ( quoique si on peut injecter du code dans le programme, on pourrai lui demander d'analyser la dll crée ... ça me donne des idées ).

    Si tu veux une bonne protection et que tu ne crois pas à l'obfusquation, fait les parties critiques de ton programme en C++ et/ou investit dans un "vrai" logiciel de protection .. celà ne sert à rien de se casser pas la tête à crypter les dlls, vu qu'au final en mémoire t'aura toujours la "vrai" dlls, non cryptée ... a moins que tu soit capable de crypter chaque instruction du programme et ne la décrypter que quand nécéssaire pour la recrypter après, mais est-ce vraiment nécéssaire ( et possible ) ?

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Par défaut
    Je savais qu'on pouvais obfusquer des dlls, mais les fichiers sources ... et même si on le peut, dans ce cas, pourquoi ne pas tout simplement utiliser les dlls normallement, mais en les obfusquant avant la distribution de ton programme ? ( j'ai l'impression qu'on te la déjà dit plus haut ... )
    Je n'ai aucun soucis avec l'obfuscation comme dit plus haut. Il suffit juste de le faire de façon suffisament poussée (et pas que par remplacement des noms de variables ce qui ne cache rien de l'algorithme).

    Ma problématique initiale était surtout de savoir si on pouvait décrypter une DLL de type C++ ce qui ne semble pas possible du fait du mode de chargement de ce type de DLL (par nom de fichier devant se trouver à priori soit dans le répertoire projet soit dans system32).

    J'en profite (même si on papotte avec le tag résolu depuis plusieurs jours et qu'on s'éloigne un peu de VB.NET) pour poser une question qui est la cause de mes craintes de sécurité (je n'ai pas trouvé ce thème de discussion dans le forum) : est ce que l'on connaît le degré de lisibilité des DLL natives ?
    Avec un simple éditeur en hexadécimal, j'ai noté que l'on peut lire les noms des méthodes qui y sont définies (en tout cas pour Delphi).
    Je suppose que celà dépend pas mal du langage à l'origine de la DLL

    D'autre part, avez-vous connaissances de logiciels ayant pour finalité la décompilation de DLL natives

  13. #13
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Citation Envoyé par nikoko34
    est ce que l'on connaît le degré de lisibilité des DLL natives ?
    Je ne crois pas que celà se mesure ... . Enfin bon, le truc, c'est que pour un gars qui fait du C# toute ça vie ( moi par exemple ), une dll native c'est illisible, mais pour un gars qui fait de l'Assembleur depuis 10 ans une dll native c'est comme un bouquin avec des notes et tout, c'est à dire qu'il n'aura vraiment aucun problème à savoir ce que la dll fait.

    Citation Envoyé par nikoko34
    Avec un simple éditeur en hexadécimal, j'ai noté que l'on peut lire les noms des méthodes qui y sont définies (en tout cas pour Delphi).
    Les dlls de Delphi je les trouves un peut spéciales, elles ont un tas de données qui n'existent que pour les binnaires fait avec Delphi mais à la base, pour tous les langages natifs tu aura forcément le nom des functions importées et exportés ( par exemple, MessageBoxA ) et aussi les dlls utilisées ( user32.dll ).

    Citation Envoyé par nikoko34
    D'autre part, avez-vous connaissances de logiciels ayant pour finalité la décompilation de DLL natives
    WinDasm peut être ? il existe certains décompilateurs qui arrivent même à traduire les dlls en code "C", mais là je ne m'y connais pas vraiment ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. utilisation d'un dll native en C#
    Par sysalpha dans le forum C#
    Réponses: 13
    Dernier message: 27/01/2011, 11h48
  2. utilisation DLL native en C#
    Par 3aychoucha dans le forum C#
    Réponses: 8
    Dernier message: 07/01/2011, 09h04
  3. Utilisation d'une dll native par une toolbar managée
    Par didierll dans le forum C++/CLI
    Réponses: 1
    Dernier message: 10/07/2007, 07h56
  4. [C# 2.0] Utilisation d'un IntPtr par une dll native
    Par SesechXP dans le forum C++/CLI
    Réponses: 5
    Dernier message: 05/07/2007, 15h00
  5. Réponses: 2
    Dernier message: 28/05/2006, 11h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo