Skip to Content
Nouvelle version 12 disponible 🎉
ObfuscatorProxy dynamique

Proxy dynamique

La protection par proxy dynamique est une fonctionnalité de Babel Obfuscator qui renforce l’obfuscation et la protection du code de votre application. Elle permet de masquer les appels de méthodes vers du code externe comme vers du code interne en générant des classes proxy dynamiques.

Lorsque la protection par proxy dynamique est activée, Babel Obfuscator crée des types délégués ou des classes proxy qui servent d’intermédiaires pour les appels de méthodes. Ces classes proxy sont construites dynamiquement pendant le processus d’obfuscation et remplacent les appels de méthodes d’origine dans votre code.

Le principal avantage des proxys dynamiques est qu’ils masquent efficacement les appels de méthodes réels : il devient beaucoup plus difficile, pour des attaquants ou des spécialistes de la rétro-ingénierie, de comprendre et d’analyser le flux du code. Les proxys dynamiques permettent d’empêcher l’accès direct aux méthodes sensibles et de masquer la logique de l’application.

Cette section couvre :

Fonctionnement du proxy dynamique

À la génération, pour chaque appel protégé, Babel Obfuscator génère un petit type délégué proxy et réécrit l’instruction call, callvirt ou newobj d’origine pour la faire passer par ce proxy. La cible réelle (son type déclarant, la méthode et le champ qui contiendra l’appel résolu) n’est plus référencée directement par le code réécrit. Elle est retrouvée par un minuscule résolveur injecté la première fois que chaque appel par proxy s’exécute, puis mise en cache afin que les appels suivants passent directement.

Deux propriétés découlent de cette conception :

  • L’analyse statique est perturbĂ©e. Les sites d’appel réécrits ne portent plus de rĂ©fĂ©rence de mĂ©tadonnĂ©es directe vers la cible ; les dĂ©compilateurs et les dĂ©sobfuscateurs automatisĂ©s ne peuvent donc pas reconstruire le graphe d’appels d’origine Ă  partir des seules mĂ©tadonnĂ©es. La manière dont les cibles sont codĂ©es varie aussi d’un build Ă  l’autre, si bien que les outils ne peuvent pas s’appuyer sur des motifs fixes : voir RĂ©sistance Ă  la dĂ©sobfuscation.
  • La rĂ©solution est diffĂ©rĂ©e et mise en cache. Le premier appel Ă  un membre donnĂ© passant par proxy paie un petit coĂ»t unique pour rĂ©soudre la cible et raccorder le dĂ©lĂ©gué ; chaque appel ultĂ©rieur passe par le dĂ©lĂ©guĂ© mis en cache avec un surcoĂ»t nĂ©gligeable : voir Performances.

Le passage par proxy est une transformation purement managée, effectuée à la génération : elle ne nécessite pas le .NET Framework, fonctionne sur .NET et .NET Framework et ne modifie pas le comportement observable de votre programme (à l’exception du petit ensemble d’appels répertoriés dans Couverture, qui restent volontairement directs).

Limites de compatibilité AOT et plateforme

Le proxy dynamique n’est actuellement pas pris en charge sur les assemblies .NET MAUI et Blazor, en raison d’une combinaison de limites des plateformes et de restrictions du runtime qui empêchent de générer et d’exécuter les proxys de manière sûre ou cohérente dans ces environnements.

Contraintes des plateformes

  • Compilation anticipĂ©e (AOT) : des plateformes telles qu’iOS (utilisĂ©e par .NET MAUI) et WebAssembly (utilisĂ©e par Blazor WebAssembly) imposent la compilation AOT. Celle-ci exclut les fonctionnalitĂ©s d’exĂ©cution comme l’émission de code par rĂ©flexion ou la gĂ©nĂ©ration de types Ă  l’exĂ©cution. Bien que le proxy dynamique de Babel n’utilise pas la gĂ©nĂ©ration de code Ă  l’exĂ©cution, la logique de proxy qu’il gĂ©nère peut dĂ©pendre de mĂ©tadonnĂ©es et de constructions IL qui sont supprimĂ©es ou non prises en charge dans les environnements compilĂ©s en AOT.

Limites de compatibilité IL

  • Jetons de mĂ©tadonnĂ©es non pris en charge : le mĂ©canisme de proxy dynamique injecte des couches d’appel intermĂ©diaires au moyen de types proxy gĂ©nĂ©rĂ©s et de stubs de dĂ©lĂ©guĂ©s. Ceux-ci reposent sur des jetons de mĂ©tadonnĂ©es et des mĂ©canismes d’indirection qui peuvent ne pas ĂŞtre vĂ©rifiables, ou qui ne sont pas du tout pris en charge sur certaines cibles AOT, ce qui entraĂ®ne des Ă©checs de validation Ă  l’exĂ©cution ou des plantages de l’application.

Limites de Blazor/WebAssembly

  • CapacitĂ©s de rĂ©flexion restreintes : dans Blazor WebAssembly, la rĂ©flexion est fortement limitĂ©e. Comme le proxy dynamique enveloppe ou intercepte souvent des appels de mĂ©thodes, il peut produire des chemins d’appel indirects incompatibles avec le processus d’édition de liens et d’élimination du code inutilisĂ© (tree-shaking) des flux de travail de publication WebAssembly.

Recommandation

Pour une compatibilité totale avec les environnements AOT tels que .NET MAUI et Blazor, il est recommandé de définir DynamicProxy=false. Les assemblies générés restent ainsi entièrement vérifiables, conformes à la plateforme et exempts de fonctionnalités susceptibles d’échouer lors de l’édition de liens native ou au démarrage du runtime.

Last updated on