FR3096803A1 - Procédé mis en œuvre par ordinateur pour obscurcir un code de programme - Google Patents
Procédé mis en œuvre par ordinateur pour obscurcir un code de programme Download PDFInfo
- Publication number
- FR3096803A1 FR3096803A1 FR2005567A FR2005567A FR3096803A1 FR 3096803 A1 FR3096803 A1 FR 3096803A1 FR 2005567 A FR2005567 A FR 2005567A FR 2005567 A FR2005567 A FR 2005567A FR 3096803 A1 FR3096803 A1 FR 3096803A1
- Authority
- FR
- France
- Prior art keywords
- computer
- variable
- program
- instruction
- program code
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 55
- 238000004590 computer program Methods 0.000 claims description 9
- 238000004458 analytical method Methods 0.000 description 36
- 230000004224 protection Effects 0.000 description 14
- 230000003068 static effect Effects 0.000 description 11
- 238000010586 diagram Methods 0.000 description 9
- 238000012545 processing Methods 0.000 description 8
- 230000006870 function Effects 0.000 description 7
- 230000005540 biological transmission Effects 0.000 description 4
- 230000014509 gene expression Effects 0.000 description 4
- 238000004422 calculation algorithm Methods 0.000 description 3
- 235000021183 entrée Nutrition 0.000 description 3
- 238000004873 anchoring Methods 0.000 description 2
- 238000013459 approach Methods 0.000 description 2
- 230000006399 behavior Effects 0.000 description 2
- 230000001419 dependent effect Effects 0.000 description 2
- 239000000835 fiber Substances 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 238000012856 packing Methods 0.000 description 2
- 230000001902 propagating effect Effects 0.000 description 2
- 230000001012 protector Effects 0.000 description 2
- 230000001131 transforming effect Effects 0.000 description 2
- SVONRAPFKPVNKG-UHFFFAOYSA-N 2-ethoxyethyl acetate Chemical compound CCOCCOC(C)=O SVONRAPFKPVNKG-UHFFFAOYSA-N 0.000 description 1
- RYGMFSIKBFXOCR-UHFFFAOYSA-N Copper Chemical compound [Cu] RYGMFSIKBFXOCR-UHFFFAOYSA-N 0.000 description 1
- 238000003491 array Methods 0.000 description 1
- 230000003190 augmentative effect Effects 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 238000010276 construction Methods 0.000 description 1
- 229910052802 copper Inorganic materials 0.000 description 1
- 239000010949 copper Substances 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000004880 explosion Methods 0.000 description 1
- 238000005206 flow analysis Methods 0.000 description 1
- 238000003780 insertion Methods 0.000 description 1
- 230000037431 insertion Effects 0.000 description 1
- 239000000203 mixture Substances 0.000 description 1
- 230000000135 prohibitive effect Effects 0.000 description 1
- 238000011084 recovery Methods 0.000 description 1
- 230000001846 repelling effect Effects 0.000 description 1
- 230000001052 transient effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/10—Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
- G06F21/12—Protecting executable software
- G06F21/14—Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Multimedia (AREA)
- Technology Law (AREA)
- Computer Hardware Design (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Executing Machine-Instructions (AREA)
Abstract
La présente invention concerne un procédé mis en œuvre par ordinateur pour obscurcir un code de programme, comprenant les étapes suivantes : - sélectionner (101), dans le code de programme, au moins une instruction d'affectation de variable affectant une valeur de variable d'entrée à une variable de sortie, - remplacer (102) chaque instruction d'affectation de variable sélectionnée par un jeu d'instructions obscurci qui est fonctionnellement équivalent et qui crée autant de nouveaux chemins qu'il y a de valeurs de variables d'entrée. Figure 1
Description
Domaine d'application
La présente invention concerne le domaine de la protection de codes de programme et plus particulièrement concerne un procédé et un programme informatique pour obscurcir un code de programme d'origine.
Problème général à résoudre
Les actifs de propriété tels que des algorithmes, des clés cryptographiques, des identifiants privés ou des données confidentielles sont de plus en plus menacés par des attaques d'ingénierie inverse. L'invention concerne des procédés pour protéger des codes de programme contre de telles attaques. La protection des codes, aussi connue sous le nom d'obscurcissement, a pour but d'empêcher de telles attaques man-at-the-end, dans lesquelles les attaquants ont un contrôle total sur le code exécutable et son environnement. De nombreuses protections et attaques ont été proposées et utilisées au cours des dernières dizaines d'années. L'obscurcissement est un procédé pour protéger un code de programme contre des attaques, qui consiste à transformer un code source ou machine en un code obscurci qui est difficile à comprendre par des humains. Toutefois, une nouvelle classe d'attaques, appelée analyse sémantique, s'est récemment avérée efficace contre des procédés d'obscurcissement courants. La présente invention concerne un nouveau procédé d'obscurcissement de code de programme qui est plus résistant aux attaques par analyse sémantique.
Art antérieur
Un procédé d'obscurcissement a pour but de dissimuler le comportement d'un programme ou de protéger des informations personnelles telles que des algorithmes ou des clés cryptographiques en transformant le programme à protéger P en un programme P' de telle sorte que P et P' soient équivalents du point de vue sémantique. Autrement dit, P et P' doivent calculer la même fonction mais P' est plus difficile à comprendre. Une autre propriété importante est que P' est approximativement aussi efficace que P.
L'art antérieur comprend plusieurs techniques d'obscurcissement pratiques.
Une première technique d'obscurcissement est appelée « technique d'arithmétique booléenne mixte ». Un exemple d'une telle technique est divulgué dans la référence [1]. Ce procédé a pour but de transformer une expression arithmétique et/ou booléenne en une expression équivalente mais plus compliquée formée à partir d'une combinaison d'opérandes booléens et arithmétiques, dans le but d'être plus complexe à comprendre.
D'autres techniques d'obscurcissement appelées techniques de « virtualisation » et « d'aplatissement » transforment le flux de commande en une boucle d'interprétation envoyant chaque instruction. Les procédés de « virtualisation » ajoutent également un interprète machine virtuel pour un programme de bytecode personnalisé codant la sémantique de programme d'origine. Par conséquent, le flux de commande visible du programme protégé est très éloigné du flux de commande d'origine.
D'autres techniques d'obscurcissement désignées par techniques à « code auto-modifiable » et de « packing » insèrent des instructions qui modifient de manière dynamique le flux des instructions exécutées.
D'autres techniques sont basées sur la divergence de chemins, comme par exemple celles décrites dans les références [2] et [3].
Une autre technique divulguée dans la référence [4], introduit un diviseur de gamme et des protections par commutateur qui présentent l'inconvénient de n'être ni maniables ni puissantes.
Finalement, la référence [5] définit des protections basées sur des conjectures mathématiques, introduisant des boucles dont la terminaison et les effets sont difficiles à prédire en général mais sont connus en pratique pour n'importe quelle valeur raisonnable des paramètres.
Les plus courantes classes d'attaques contre des programmes sont appellées analyse statique et analyse dynamique. Une analyse statique, telle qu'un désassemblage, a pour but d'analyser le code binaire lui-même pour comprendre ou extraire des informations pertinentes. Une analyse dynamique exécute ou simule une exécution pour surveiller concrètement le comportement du programme. Ces deux approches sont facilement vaincues par des procédés d'obscurcissement courants.
Limites de l'art antérieur
Bien que les procédés d'obscurcissement courants puissent vaincre les classes d'attaques courantes, ils sont moins efficaces contre des attaques plus élaborées telles que l'analyse sémantique.
La sémantique dans la programmation informatique peut être comprise comme étant la signification d'un programme. Les attaques sémantiques ont pour but d'analyser la sémantique d'un programme pour explorer ou simplifier plus efficacement un programme. Un tel raisonnement sémantique peut, par exemple, considérer des expressions qui sont exécutées sous forme de formules pour évaluer la faisabilité ou la non-faisabilité du chemin d'un programme.
Contrairement à l'analyse standard statique ou dynamique, les outils sémantiques sont robustes. L'analyse sémantique dépend de la signification d'un code qui est invariante dans tous les schémas de compilation et l'obscurcissement, et non de sa syntaxe qui est très volatile et facile à modifier.
Les outils sémantiques sont également capables de découvrir des chemins peu probables dans un code de programme. De nombreuses analyses sémantiques peuvent raisonner sur des jeux infinis de données entrées en une seule étape.
La plupart des analyses sémantiques courantes sont des analyses de teintes qui suivent la progression d'entrées à travers l'exécution d'un programme, des interprétations abstraites, qui rassemblent des informations sémantiques d'un programme par raisonnement statique (sans exécution), et finalement des exécutions symboliques dynamiques, Dynamic Symbolic Execution (DSE), qui considèrent des entrées sous forme de variables symboliques. La DSE est actuellement probablement l'attaque sémantique la plus puissante.
L'exécution symbolique dynamique simule l'exécution d'un programme le long de ses chemins, en générant systématiquement des entrées pour chaque nouvelle condition de branchement découverte. Ce processus d'exploration considère des entrées sous forme de « variables symboliques » dont les valeurs ne sont pas fixes. Le moteur d'exécution symbolique suit un chemin et chaque fois qu'il rencontre une déclaration conditionnelle impliquant l'entrée, une contrainte est ajoutée à la « valeur symbolique » associée à cette entrée. La résolution de ces contraintes de manière automatique (typiquement avec des solveurs de contraintes en vente libre) permet alors de générer de nouvelles valeurs d'entrée conduisant à de nouveaux chemins, en couvrant progressivement tous les chemins du programme jusqu'à une limite définie par un utilisateur. Cette technique a connu un fort renouvellement d'intérêt au cours des dix dernières années, devenant une technique de recherche de bugs prédominante.
Lorsque le moteur symbolique ne peut pas parfaitement traiter certaines constructions du langage de programmation sous-jacent, typiquement des appels de systèmes ou une auto-modification, le raisonnement symbolique est imbriqué avec une analyse dynamique permettant des approximations judicieuses. Typiquement, des valeurs concrètes de temps d'exécution sont utilisées pour compléter la partie manquante des contraintes de chemin, lesquelles sont ensuite envoyées au solveur par concrétisation. Cette solution rend l'approche particulièrement robuste vis-à-vis de constructions compliquées se retrouvant dans les codes binaires obscurcis, typiquement par packing ou auto-modification, ce qui fait de l'exécution symbolique dynamique un bon candidat pour le désobscurcissement automatisé. Elle est en particulier robuste en tant qu'analyse dynamique avec la capacité supplémentaire de trouver des conditions basées sur déclencheur.
Au vu de ce qui précède, il existe le besoin d'un nouveau procédé d'obscurcissement qui soit plus résistant aux attaques par analyse sémantique, en particulier à l'exécution symbolique dynamique. De nouveaux procédés de protection doivent être conçus pour résister à l'analyse automatisée avancée tout en étant efficaces en termes de durée en n'occasionnant pas de délais d'exécution élevés. De plus, les protections ne doivent pas considérablement augmenter la taille du code d'origine non protégé.
Brève description de la solutio
n
L'invention fournit une solution qui est capable de résister à une analyse sémantique, en particulier à des attaques par exécution symbolique dynamique. L'invention revendiquée est conçue pour être suffisamment solide pour rendre l'analyse basée sur la sémantique automatisée insurmontable. La solution proposée inclut en outre de faibles dépassements en termes de taille de codes et de performances d'exécution et sa conception est discrète.
Les procédés de protection existants repoussant les attaques par analyse sémantique sont la plupart du temps basés sur des contraintes de difficulté de résolution et ils impliquent souvent un compromis en termes de discrétion ou de délais d'exécution.
L'invention fournit une solution qui est basée sur l'explosion des chemins. Un objectif de l'invention est d'augmenter considérablement le nombre de chemins dans un programme, dans une proportion telle que le temps nécessaire pour explorer le code de programme devienne prohibitif.
L'invention utilise un flux de tâches pour de telles protections basées sur les chemins, constitué d'un générateur de point de branchement et d'une politique d'ancrage pour sélectionner des positions optimales dans le code de programme pour générer un point de branchement.
Un point de branchement est un jeu d'instructions obscurci devant être inséré dans le code de programme afin d'augmenter le nombre de chemins. L'invention propose des points de branchement particuliers qui créent autant de nouveaux chemins qu'il y a de valeurs de variables.
Selon un mode de réalisation de l'invention, de bonnes politiques d'ancrage sont introduites pour identifier des ancrages indépendants et des variables pertinentes afin de sélectionner les positions les plus appropriées dans le code de programme pour l'insertion de points de branchement.
Invention s'applique également à n'importe quel niveau de description de code : code source, bytecode ou code binaire. Elle s'applique également à des langages de description de matériel (par exemple le langage VHDL) ou à des modèles (par exemple le langage de modélisation unifié, Unified Modeling Language, UML) tant qu'ils contiennent des constructions reflétant des affectations de variables.
De manière correspondante, un aspect de l'invention consiste à fournir un procédé mis en œuvre par ordinateur pour obscurcir un code de programme, comprenant les étapes suivantes :
- sélectionner, dans le code de programme, au moins une instruction d'affectation de variable affectant une valeur de variable d'entrée à une variable de sortie,
- remplacer chaque instruction d'affectation de variable sélectionnée par un jeu d'instructions obscurci qui est fonctionnellement équivalent et qui crée autant de nouveaux chemins qu'il y a de valeurs de variables d'entrée.
Selon un mode de réalisation de l'invention, l'étape consistant à sélectionner au moins une instruction d'affectation de variable comprend l'identification d'au moins une instruction d'affectation de variable dans le code de programme.
Selon un mode de réalisation de l'invention, l'étape consistant à sélectionner au moins une instruction d'affectation de variable comprend la création, dans le code de programme, d'une instruction d'affectation de variable n'ayant aucune influence sur l'exécution du programme.
Selon un mode de réalisation de l'invention, le jeu d'instructions obscurci comprend au moins une boucle FOR contrôlée par la variable d'entrée via un opérateur incrémentiel.
Selon un mode de réalisation de l'invention, le jeu d'instructions obscurci comprend plusieurs boucles FOR en chaîne via un opérateur incrémentiel, chacune étant contrôlée par un octet de la variable d'entrée.
Selon un mode de réalisation de l'invention, le jeu d'instructions obscurci comprend une première instruction et une deuxième instruction exécutées séquentiellement, la deuxième instruction affectant une valeur constante donnée à la variable de sortie et la première instruction écrivant la valeur de variable d'entrée dans une adresse décalée de la valeur constante.
Selon un mode de réalisation de l'invention, le procédé comprend l'étape consistant à sélectionner, dans le code de programme, plusieurs instructions d'affectation de variables, chacune appartenant à un chemin indépendant associé à une valeur d'entrée distincte du code de programme.
Selon un mode de réalisation de l'invention, le procédé comprend l'étape consistant à sélectionner, dans le code de programme, au moins une instruction d'affectation de variable, la variable ayant une chaîne définition-utilisation avec à la fois une variable d'entrée du code de programme et une variable de sortie du code de programme.
Un autre aspect de l'invention consiste à fournir un produit de programme informatique, le produit de programme informatique comprenant un support de stockage lisible par ordinateur dans lequel sont incorporées des instructions exécutables par ordinateur, les instructions exécutables par ordinateur étant exécutables par un processeur pour amener le processeur à mettre en œuvre les étapes du procédé selon n'importe quel mode de réalisation de l'invention.
Encore un autre aspect de l'invention consiste à fournir un système informatique comprenant :
- une mémoire ayant des instructions exécutables par ordinateur et un programme dynamique d'une application ; et
- un processeur pour exécuter les instructions exécutables par ordinateur, l'exécution des instructions exécutables par ordinateur amenant le processeur à exécuter les étapes selon n'importe quel mode de réalisation de l'invention.
Description détaillée
Les éléments, caractéristiques et avantages ci-dessus ainsi que d'autres selon l'invention, seront mieux compris à la lecture de la description suivante plus spécifique de l'invention conjointement à l'examen des figures, dans lesquelles :
Selon la figure 1, il est à présent décrit un organigramme correspondant à certains exemples de réalisation de la présente invention. L'organigramme de la figure 1 et les diagrammes-blocs dans la figure illustrent l'architecture, la fonctionnalité et le fonctionnement de mises en œuvre possibles de systèmes, procédés et produits de programmes informatiques selon divers modes de réalisation de la présente invention. À cet égard, chaque bloc dans l'organigramme ou les diagrammes-blocs peut représenter un module, une unité, un segment ou une portion d'instructions, comprenant une ou plusieurs instructions exécutables pour mettre en œuvre la ou les fonctions logiques spécifiées.
Le procédé selon la figure 1 vise à transformer un code de programme d'origine P en un code de programme obscurci P'. Autrement dit, le code de programme P' est modifié par l'insertion d'un jeu d'instructions qui ajoute plusieurs nouveaux chemins au programme. Ce procédé fournit une protection pour le code de programme d'origine P désignée par protection basée sur les chemins. Le code de programme modifié P' doit être fonctionnellement équivalent au code de programme d'origine P mais contenir beaucoup plus de chemins que P.
Le procédé selon la figure 1 comprend principalement deux étapes 101, 102. La première étape 101 consiste à sélectionner un emplacement dans le code de programme P qui est approprié sur la base d'une politique d'ancrage. La deuxième étape 101 consiste à introduire, à l'emplacement sélectionné, un jeu d'instructions qui créent de nouveaux chemins possibles dans le programme.
Le jeu d'instructions inséré à l'emplacement sélectionné est appelé point de branchement. Un point de branchement peut également être défini comme une condition de branchement dépendant d'une variable x à une adresse a dans le code et créant tout au plus γ nouveaux chemins possibles. Γ est appelée la capacité d'un point de branchement. Par exemple, une déclaration "Si" dans un code de programme a une capacité γ = 1 parce qu'elle ne crée qu'un seul chemin possible.
Un point de branchement est appliqué à une instruction d'affectation de variable dans le programme. Dans certains modes de réalisation, il est appliqué afin de remplacer une instruction d'affectation de variable avec un nouveau jeu d'instructions qui est fonctionnellement équivalent mais qui crée de nouveaux chemins possibles.
Dans certains autres modes de réalisation, un point de branchement est inséré à un emplacement dans le programme où aucune instruction d'affectation existante n'est présente. Dans ce cas, le nouveau jeu d'instructions qui est inséré est fonctionnellement équivalent à une affectation de variable qui ne modifie pas l'exécution du programme. Par exemple, une instruction d'affectation de variable z=x avec une variable z non utilisée dans le programme ne modifie pas l'exécution du programme.
Le code de programme obscurci P' est obtenu après l'insertion de plusieurs points de branchement dans le code de programme d'origine P, à différents emplacements.
Dans certains modes de réalisation de l'invention, les points de branchement sont introduits à des emplacements sélectionnés arbitrairement dans le programme.
Dans certains autres modes de réalisation de l'invention, les emplacements sont sélectionnés en fonction d'une politique d'ancrage particulière, comme cela sera expliqué ci-dessous.
L'invention propose de nouvelles classes de points de branchement.
Un premier type de point de branchement est exemplifié par des programmes de pseudo-code illustrés sur les figures 2 et 3. Il consiste à remplacer une instruction d'affectation par une ou plusieurs boucles FOR.
La figure 2 illustre, du côté gauche, un code de programme d'origine P comprenant une instruction d'affectationch=input;inputétant une variable dépendant de l'entrée etchétant une variable locale.
Selon un mode de réalisation de l'invention, le code de programme d'origine P est transformé en un code de programme obscurci P' illustré sur le côté droit de la figure 2. L'instruction d'affectation d'originech=inputest remplacée par une boucle FORch= 0, for (i=,i<=input, i++) ch++;
La boucle FOR peut être déroulée n fois, pour n'importe quelle valeur n que l'entrée (input )de variable peut adopter lors de l'exécution. De ce fait, une boucle FOR commandée par une variable définie sur une taille de bit S génère jusqu'à 2Schemins supplémentaires avec une longueur de chemins supplémentaires de 2Sau maximum. Autrement dit, la boucle FOR introduit un nouveau chemin pour chaque valeur possible de l'entréede variable.
Le point de branchement décrit du côté droit de la figure 2 ajoute un nombre significatif de chemins possibles au programme, ce qui le rend plus difficile à analyser pour des attaques par analyse sémantique. Parallèlement, il est fonctionnellement équivalent à l'affectation de variable du code d'origine. Toutefois, il présente l'inconvénient d'être insurmontable lorsque la taille de la variable d'entrée est importante (par exemple S = 32 ou S = 64). Un algorithme ou un programme réalisable doit pouvoir être exécuté suffisamment facilement pour être pertinent du point du pratique, typiquement en un temps polynomial par rapport à la taille de l'entrée. Autrement dit, le point de branchement de la figure 2 présente l'inconvénient d'être trop complexe pour être efficace parce qu'en dépit du fait qu'il fournit une bonne protection, il ajoute aussi une complexité considérable et une latence importante par comparaison avec l'exécution du programme P d'origine.
La figure 3 illustre, du côté droit, une autre mise en œuvre du point de branchement proposé. Selon ce mode de réalisation, la maniabilité (ou la complexité) du programme obscurci P' est améliorée par comparaison avec le procédé de la figure 2.
Pour obtenir cette propriété, plusieurs boucles FOR sont enchaînées sur chaque octet de la variable d'entrée. Par conséquent, les instructions de la boucle FOR sont limitées à des variables de la taille d'un octet et génèrent jusqu'à 28kchemins supplémentaires avec une longueur de chemins supplémentaires d'au moins 28. Le fait d'enchaîner k boucles FOR de ce type conduit jusqu'à 28kchemins supplémentaires avec une longueur supplémentaire de k.28au maximum. Dans l'exemple particulier de la figure 3, quatre boucles FOR sont enchaînées pour traiter une variable d'entrée codée sur 32 bits. Le nombre de nouveaux chemins possibles est toujours égal à 232, comme dans le cas de la figure 2, mais la complexité est limitée à 4x256 itérations de boucle au maximum par comparaison avec 232itérations de boucle au maximum dans le cas de la figure 2.
Un deuxième type de point de branchement est exemplifié par des programmes de pseudo-code illustrés dans les figures 4 et 5. Il consiste à remplacer une instruction d'affectation par des instructions d'auto-modification. Les figures 4 et 5 illustrent des exemples de programmes en langage assembleur.
Le programme d'origine P est illustré sur le côté gauche de la figure 4. Il consiste à nouveau en une instruction d'affectation a =inputqui est codée dans un langage assembleur avec l'instruction L illustrée sur la figure 4.
Sur le côté droit de la figure 4, est illustré le programme obscurci proposé P' selon un mode de réalisation de l'invention. L'instruction unique L est remplacée par deux instructions L1 et L2. La deuxième instruction L2 est une opération ne dépendant pas de l'entrée, a = k (k étant une valeur constante arbitraire qui est réglée pour être égale à 0 dans l'exemple de la figure 4). Au moment de l'exécution, l'exécution de la première instruction L1 déclenche le remplacement de la deuxième instruction L2 par a =input _ val,input _ valétant la valeur d'exécution deinput. Ceci est dû au fait que la valeur de décalageoffest choisie de manière appropriée.
La figure 5 illustre l'exécution du programme obscurci P’ de la figure 4.
À l'étape 1, la valeur d'entrée (égale à 100 dans l'exemple de la figure 5) est introduite dans l'entréede variable. À l'étape 2, l'instruction L1 est exécutée de sorte que la valeur d'entrée est déplacée à l'adresse de L2+off. Cette adresse correspond à l'adresse qui est utilisée par l'instruction L2 pour copier la valeur « 0 » sur la variable a. Par conséquent, à l'étape 2, la valeur « 0 » est remplacée parinput_val. À l'étape 3, l'instruction L2 est modifiée de telle sorte que « 0 » devienne « 100 » dans cette instruction. À l'étape 4, l'instruction L2 est exécutée pour déplacer la valeur « 100 » à la variable a.
Pour résumer, le déplacement de décalage au niveau de l'instruction L1 réécrit la constante 0 en L2 à la valeur contenue à l'adresse de l'entrée. Ce faisant, une version de code différente est exécutée pour chaque valeur de l'entrée, conduisant à autant de nouveaux chemins possibles qu'il y a de valeurs d'entrée possibles.
La figure 6 illustre des pseudo-codes illustrant d'autres mises en œuvre de points de branchement selon des modes de réalisation de l'invention.
Le premier pseudo-code 1) de la figure 6 est identique au point de branchement de la boucle FOR illustré à titre d'exemple sur les figures 2 et 3.
Les autres pseudo-codes 2)-5) illustrés sur la figure 6 illustrent d'autres mises en œuvre possibles de points de branchement. La caractéristique commune de toutes ces mises en œuvre est que pour chaque point de branchement, le jeu d'instructions obscurci qui est utilisé pour remplacer l'instruction d'affectation de variable d'origine, dans le programme d'origine, doit introduire un nouveau chemin possible pour chaque valeur possible de la variable. De plus, chaque mise en œuvre proposée est essentiellement équivalente à une instruction d'affectation.
L'utilisation de différents patterns pour mettre en œuvre le même jeu d'instructions obscurci permet de résister à des attaques de patterns, basées sur la récupération syntaxique de la protection.
Tous les points de branchement exemplifiés ci-dessus selon des modes de réalisation de l'invention sont solides vis-à-vis des attaques par analyse sémantique, parce qu'ils introduisent un nouveau chemin possible pour chaque valeur possible de l'entrée de variable. Tous les points de branchement sont également maniables.
Nous décrivons à présent des politiques d'ancrage qui définissent un emplacement particulier de points de branchement dans un code de programme afin d'obtenir une efficacité et une robustesse maximales.
Selon un premier mode de réalisation de l'invention, des points de branchement sont placés sur des chemins indépendants dans le programme. Autrement dit, des points de branchement sont introduits pour obscurcir des instructions d'affectation qui s'appliquent à des chemins indépendants dans le programme.
Le nombre de chemins ajoutés par un point de branchement dépend en fait de tous les points de branchement insérés préalablement. En effet, il peut arriver qu'un point de branchement préalablement introduit limite la solidité potentielle d'un point de branchement nouvellement introduit en rendant certains de ses chemins potentiellement introduits impraticables.
Un exemple de ce problème est illustré à la figure 7, lequel illustre un code de programme d'origine P et un code de programme obscurci P' dans lequel deux instructions "scission" ou "si" sont ajoutées. Ce faisant, on s'attend à ce que quatre nouveaux chemins soient ajoutés (deux nouveaux chemins pour chaque instruction si).
Toutefois, comme on peut le voir sur le pseudo-code P' sur la droite de la figure 7, seuls trois nouveaux chemins possibles sont introduits par cet obscurcissement. En effet, il y a seulement trois chemins possibles en fonction de la valeur des variables d'entrée. Un premier chemin est exécuté lorsque la valeur d'entrée est inférieure à 10, un deuxième chemin est exécuté lorsque la valeur d'entrée est comprise entre 10 et 100 et un troisième chemin est exécuté lorsque la valeur d'entrée est supérieure à 100. Le quatrième chemin est impraticable parce que la variable d'entrée ne peut pas être en même temps en dessous de 10 et au-dessus de 100.
L'exemple de la figure 7 illustre l'importance de s'assurer que les points de branchement insérés se combinent au lieu de se chevaucher. Pour éviter ce problème, selon un mode de réalisation de l'invention, il est proposé d'ajouter des points de branchement seulement sur des chemins indépendants du code de programme. Deux points de branchement sont indépendants lorsque le nombre de nouveaux chemins qu'ils créent se multiplient. L'ajout de k points de branchement indépendants de ce type fournit ainsi un nombre exponentiel, puissance k, de nouveaux chemins.
Afin de faire en sorte que deux points de branchement soient indépendants, ils sont appliqués à deux variables x et y de telle sorte que x et y dépendent seulement de jeux distincts de valeurs d'entrée.
Dans l'exemple de la figure 7, les deux instructions « si » sont appliquées à la variableresqui ne dépend pas de jeux distincts de la valeur d'entréevar.
Selon un mode de réalisation de l'invention, un premier moyen de déterminer des chemins indépendants dans un code de programme consiste à calculer statistiquement un ensemble d'emplacements dans les programmes à travers lesquels doit passer une trace. Un chemin est un jeu d'instructions exécuté par le programme. Un chemin dépend d'une entrée de variable s'il implique au moins une instruction exécutée sur cette entrée de variable.
Ces emplacements sont appelés emplacements « obligatoires ». Ils correspondent aux différents emplacements dans le programme du jeu d'instructions associé à un chemin dépendant d'une valeur d'entrée. La détermination des emplacements obligatoires dans un programme peut être effectuée avec une analyse graphique de flux de commandes. De tels emplacements incluent par exemple le point d'entrée du programme, ou le point de retour dans le cas de programmes avec un emplacement de sortie unique, ou n'importe quelle instruction à l'intérieur de la séquence d'instructions de niveau supérieur de la fonction principale. Ensuite, les différentes entrées du programme sont réparties parmi les emplacements sélectionnés afin de produire des ancrages indépendants.
En résumé, une première manière de sélectionner des emplacements indépendants pour introduire des points de branchement est obtenue en effectuant les étapes suivantes :
- calculer l'ensemble de tous les emplacements obligatoires dans le programme P,
- pour chaque entrée de variable i, choisir un emplacement obligatoire en fonction de i et insérer un point de branchement à cet emplacement.
Selon un mode de réalisation de l'invention, une deuxième manière de déterminer des chemins indépendants dans un code de programme consiste à appliquer une analyse d'indépendance comme suit.
Nous définissons une primitive d'analyse de rétro-dépendance statiquebackward-input (( l ,v),P)qui fournit en retour l'ensemble de tous les noms de variables d'entrée qui risquent d'affecter la valeur de la variablevau niveau de la ligne de codeldans le programmeP. Nous définissons aussi une fonctionindep((l ,v),I,P) indiquant si nous sommes sûrs qu'aucune variable d'entrée dans I ne peut affecter la valeur de (l,v) dans le programme P (retour “oui”) ou si nous ne le savons pas (retour “non”).
L’ensemble d'emplacements S auxquels des points de branchement peuvent être insérés est calculé comme suit.
Tout d'abord, l’ensemble de variables I et d'emplacements S sont initialisés pour vider les ensembles.
Ensuite, une boucle est effectuée via les étapes suivantes. Une paire (l,v) est choisie dans le code de programme, de telle sorte que l'on aitindep((l ,v),I,P)=”oui”. Si une telle paire est trouvée, elle est alors ajoutée à l'ensemble d'emplacements S et l'ensemble de variables d'entrée I est augmenté avec le résultat de la primitivebackward-input (( l ,v),P). Ensuite la boucle est itérée jusqu'à ce qu'aucune paire de ce type ne puisse plus être trouvée.
Le procédé ci-dessus permet de trouver des relations indépendantes entre chaque paire (l,v) et des variables d'entrée du programme.
Selon un premier mode de réalisation de l'invention, des points de branchement sont placés à des emplacements particuliers d'un programme afin d'éviter qu'ils ne soient découverts ou enlevés facilement.
Les attaques par découpage en tranches (slicing) ont pour but d'enlever des variables n'affectant pas la sortie d'un code de programme. Les attaques par analyse de teintes identifient les variables qui ne sont pas affectées par une entrée quelconque d'un code de programme.
Afin de résister à ces types d'attaque, les points de branchement devraient être placés à des emplacements du programme qui ne peuvent pas être enlevés sans modifier considérablement l'exécution du code de programme. Au contraire, un point de branchement placé sur une instruction qui n'affecte pas une sortie d'un code de programme peut être facilement enlevé et par conséquent, son efficacité contre les attaques est faible.
Selon un mode de réalisation de l'invention, un point de branchement est placé sur une variable ayant une chaîne définition-utilisation ayant à la fois une variable d'entrée et une variable de sortie du programme.
Une chaîne définition-utilisation, ou chaîne def-use, est un outil couramment utilisé par les compilateurs. Des données sont définies lorsque des variables sont des valeurs déclarées, initialisées, affectées, ou sont reçues sous forme de paramètres. Les données sont utilisées dans des expressions, des déclarations conditionnelles, un transfert de paramètres ou dans une déclaration de retour. Une chaîne def-use pour une variable est un chemin ou une séquence d'instructions reliant une définition de la variable à l'une de ses utilisations. Une chaîne def-use entre deux variables est une séquence de deux chemins def-use reliant les deux variables.
Nous donnons un exemple d'un chemin def-use et d'une chaîne def-use pour le pseudo-code suivant :
Entrée (a);
ligne 1 x:a+1;
ligne 2 d:=a+10;
ligne 3 y:=x+2;
ligne 4 z:=y+5;
L'instruction à la ligne 1 est une définition (def) de la variable x. L’instruction à la ligne 3 est une utilisation de la variable x. Par conséquent, la séquence d'instructions aux lignes 1, 2 et 3 est un chemin def-use pour la variable x. La séquence d’instructions aux lignes 1, 2, 3 et 4 est une chaîne def-use pour les variables x et y.
Nous définissons les variables pertinentes, dans un programme, comme étant des variables qui sont définies comme ayant à la fois une chaîne def-use avec une variable d'entrée et une chaîne def-use avec une variable de sortie d'un programme.
La mise en œuvre de points de branchement sur une variable pertinente rend la protection plus résistante à la fois aux attaques par slicing et par analyse de teintes.
Selon un mode de réalisation de l'invention, une première façon de déterminer les variables pertinentes dans un programme consiste à appliquer une analyse dynamique. L'analyse de teintes dynamique et le slicing sont des procédés bien connus dans le contexte de débogage de logiciels. Bien qu'elles ne soient pas complètes, ces techniques sont sous-approchées dans la mesure où elles calculent des chaînes def-use réelles observées lors de l'exécution. Une analyse dynamique selon un mode de réalisation de l'invention comprend les étapes suivantes : une première étape consiste à lancer un certain nombre d'exécutions concrètes d'un programme pour obtenir des traces d'exécution. Ensuite, une analyse dynamique standard est calculée pour obtenir des relations def-use le long des traces obtenues. Ceci peut être effectué en utilisant des procédés d'analyse de teintes dynamiques existants et/ou des procédés de découpage en tranches dynamiques. Un exemple d'une analyse de teintes dynamique est donné dans la référence [6]. Ensuite, un premier ensemble de toutes les variables affectées par une variable d'entrée dans l'information def-use dynamique est calculé. Ensuite, un deuxième ensemble de toutes les variables affectant une sortie du programme dans l'information def-use dynamique est calculé. Ensuite, les variables pertinentes sont choisies comme étant celles appartenant à la fois au premier et au deuxième ensemble de variables.
Selon un autre mode de réalisation de l'invention, les variables pertinentes sont définies en utilisant une analyse statique « basée sur l'obligation ». L'analyse statique standard pour calculer les chaînes def-use est basée sur la structure standard d'une « analyse basée sur les possibilités ». Autrement dit, elles capturent tous les faits vrais recherchés mais elles peuvent également produire des fausses réponses positives. Une analyse statique standard est basée sur un domaine abstrait basé sur un réseau. À la fin de la propagation du domaine, chaque variable est affectée d'une valeur abstraite qui peut prendre les quatre valeurs {T,oui,non,┴}. Oui signifie que la variable dépend définitivement d'une variable d'entrée, non signifie qu'elle ne dépend absolument pas d'une variable d'entrée, T signifie que l'on ne sait pas et ┴ signifie que le code est inaccessible. L'analyse statique standard est par exemple décrite dans la référence [7].
L'analyse standard « basée sur les possibilités » considère qu'il existe une dépendance lorsque la valeur abstraite est soit oui soit T. Une analyse statique « basée sur l'obligation » selon un mode de réalisation de l'invention est basée sur une analyse standard « basée sur les possibilités » qui est modifiée en considérant qu'une dépendance existe seulement lorsque la valeur abstraite est oui.
La figure 8 illustre un appareil 800 selon des exemples de modes de réalisation de l'invention divulguée. Dans certains exemples de modes de réalisation, l'appareil 800 peut être configuré pour effectuer un obscurcissement d'un programme 804 selon la présente invention. L'appareil 800 peut comprendre un ou plusieurs processeurs 801. Le processeur 801 peut être une unité de traitement centrale (CPU), un microprocesseur, un circuit électronique, un circuit intégré (IC) ou similaire. Le processeur 801 peut être utilisé pour effectuer des calculs requis par l'appareil 800 ou l'un quelconque de ses sous-composants. Dans certains exemples de modes de réalisation, l'appareil 800 peut comprendre un module d'entrée/sortie (I/O) 802. Le module I/O 802 peut être utilisé pour fournir une sortie et pour recevoir une entrée d'un utilisateur, d'un appareil informatisé ou d'un autre appareil similaire à l'appareil 800. Dans certains exemples de modes de réalisation, l'appareil 800 peut comprendre une mémoire 803. La mémoire 103 peut être un disque dur, un disque Flash, une mémoire vive (RAM), une puce de mémoire, ou un support de stockage similaire lisible par ordinateur. La mémoire 803 peut conserver des instructions exécutables par machine aptes à amener le processeur 801 à effectuer des actions associées à l'un quelconque des sous-composants de l'appareil 800.
Un protecteur de code 805 peut être configuré pour protéger un code de programme 804 en appliquant un obscurcissement selon un mode de réalisation quelconque de l'invention. Le protecteur de code 805 peut comprendre un sélecteur d'ancrage 806 et un additionneur de point de branchement 807.
Le sélecteur d'ancrage 806 peut effectuer la sélection d'un emplacement dans le code de programme 804 qui est le plus approprié pour appliquer l'obscurcissement selon une politique d'ancrage.
L'additionneur de point de branchement 807 peut être utilisé pour appliquer un obscurcissement d'un jeu d'instructions à un emplacement sélectionné du code de programme 804 qui est déterminé par le sélecteur d'ancrage 806.
Dans certains exemples de modes de réalisation, l'appareil 800 peut être configuré pour effectuer les étapes du procédé de la figure 1. La présente invention peut être un système, un procédé et/ou un produit de programme informatique. Le produit de programme informatique peut inclure un support (ou plusieurs supports) de mémoire lisible(s) par ordinateur ayant des instructions de programme lisibles par ordinateur pour amener un processeur à effectuer des aspects de la présente invention. Le support de stockage lisible par ordinateur peut être un dispositif physique qui peut retenir et mémoriser des instructions pour l'utilisation par un dispositif d'exécution d'instructions. Le support de stockage lisible par ordinateur peut par exemple, mais sans limitation, être un dispositif de stockage électronique, un dispositif de stockage magnétique, un dispositif de stockage optique, un dispositif de stockage électromagnétique, un dispositif de stockage à semi-conducteurs ou n'importe quelle combinaison appropriée des dispositifs précédents. Une liste non exhaustive d'exemples spécifiques supplémentaires du support de stockage lisible par ordinateur inclut les dispositifs suivants : une disquette d'ordinateur portatif, un disque dur, une mémoire vive (RAM), une mémoire morte (ROM), une mémoire morte reprogrammable (EPROM ou mémoire Flash), une mémoire vive statique (SRAM), un disque compact-mémoire à lecture seule (CDROM), un disque versatile numérique (DVD), une clé de mémoire, une disquette, un dispositif à codage mécanique tel que des cartes perforées ou des structures en relief dans une gorge sur laquelle sont enregistrées des instructions, et toute combinaison appropriée de ce qui précède. Un support de stockage lisible par ordinateur tel qu'utilisé ici ne doit pas être compris comme étant des signaux transitoires per se, comme des ondes radio ou d'autres ondes électromagnétiques se propageant librement, des ondes électromagnétiques se propageant à travers un guide d'onde ou d'autres supports de transmission (des impulsions de lumière passant à travers un câble à fibre optique), ou des signaux électriques transmis par un fil. Les instructions de programme lisibles par ordinateur décrites ici peuvent être téléchargées sur des dispositifs respectifs de calcul/traitement à partir d'un support de stockage lisible par ordinateur ou sur un ordinateur externe ou sur un dispositif de stockage externe par le biais d'un réseau, par exemple l'Internet, d'un réseau local, d'un réseau étendu et/ou d'un réseau sans fil. Le réseau peut comprendre des câbles de transmission en cuivre, des fibres de transmission optiques, une transmission sans fil, des routeurs, des pare-feu, des commutateurs, des ordinateurs passerelles et/ou des serveurs frontières. Une carte d'adaptateur de réseau ou une interface de réseau dans chaque dispositif de calcul/ traitement reçoit des instructions de programme lisibles par ordinateur depuis le réseau et transfère les instructions de programme lisibles par ordinateur en vue de leur stockage dans un support de stockage lisible par ordinateur à l'intérieur du dispositif respectif de calcul/traitement. Les instructions de programme lisibles par ordinateur pour effectuer les opérations de la présente invention peuvent être des instructions par assembleur, des instructions par architecture de jeu d'instructions (ISA), des instructions machine, des instructions dépendant d'une machine, un microcode, des instructions de firmware, des données de configuration d'état, ou n'importe quel code source ou code objet écrit dans une combinaison quelconque d'un ou plusieurs langages de programmation y compris un langage de programmation orienté objet tel que Smalltalk, C++ ou similaire, et des langages de programmation procédurale conventionnels, comme par exemple le langage de programmation "C" ou des langages de programmation similaires. Les instructions de programme lisibles par ordinateur peuvent s'exécuter entièrement sur l'ordinateur de l'utilisateur, en partie sur l'ordinateur de l'utilisateur, en tant que progiciels autonomes, en partie sur l'ordinateur de l'utilisateur et en partie sur un ordinateur éloigné ou entièrement sur l'ordinateur éloigné ou le serveur. Dans ce dernier cas, l'ordinateur éloigné peut être connecté à l'ordinateur de l'utilisateur par un type de réseau quelconque y compris un réseau local (LAN) ou un réseau étendu (WAN), ou la connexion peut être effectuée avec un ordinateur externe (par exemple par l'Internet en utilisant un fournisseur de services Internet). Dans certains modes de réalisation, un circuit électronique incluant par exemple un circuit logique programmable, des circuits intégrés prédiffusés programmables (FPGA), ou des réseaux logiques programmables (PLA) peuvent exécuter les instructions de programme lisibles par ordinateur en utilisant des informations d'état des instructions de programme lisibles par ordinateur pour personnaliser le circuit électronique afin d'effectuer certains aspects de la présente invention. Des aspects de la présente invention sont décrits ici en référence à des illustrations d'organigrammes et/ou de diagrammes blocs de procédés, d’appareils (systèmes), et de produits de programmes informatiques selon des modes de réalisation de l'invention. On comprendra que chaque bloc des illustrations sous forme d'organigrammes et/ou de diagrammes blocs, et des combinaisons de blocs dans les illustrations sous forme d'organigrammes et/ou de diagrammes blocs, peuvent être mis en œuvre par des instructions de programme lisibles par ordinateur. Ces instructions de programme lisibles par ordinateur peuvent être fournies à un processeur d'un ordinateur de type général, d'un ordinateur spécifique ou de tout autre appareil de traitement de données programmable pour produire une machine, de telle sorte que les instructions qui s'exécutent par le biais du processeur de l'ordinateur ou de l'autre appareil de traitement de données programmable crée des moyens pour mettre en œuvre les fonctions/les actions spécifiées dans l'organigramme et/ou le ou les blocs du diagramme blocs. Ces instructions de programme lisibles par ordinateur peuvent également être stockées dans un support de stockage lisible par ordinateur qui peut diriger un ordinateur, un appareil de traitement de données programmable, et/ou d'autres dispositifs de manière à ce qu'ils fonctionnent de façon particulière, de telle sorte que le support de stockage lisible par ordinateur ayant des instructions mémorisées sur celui-ci comprenne un élément de fabrication incluant des instructions qui mettent en œuvre des aspects de la fonction/de l’action spécifiée dans l'organigramme et/ou le ou les blocs du diagramme blocs. Les instructions de programme lisibles par ordinateur peuvent également être chargées sur un ordinateur, un autre appareil de traitement de données programmable, ou un autre dispositif pour provoquer une série d'étapes fonctionnelles devant être effectuées sur l'ordinateur, l'autre appareil programmable ou l'autre dispositif afin de produire un processus mis en œuvre par ordinateur, de telle sorte que les instructions qui s'exécutent sur l'ordinateur, l'autre appareil programmable ou l'autre dispositif mettent en œuvre les fonctions/les actions spécifiées dans l'organigramme et/ou le ou les blocs du diagramme blocs.
Références
[1] Yongxin Zhou, Alec Main, Yuan Xiang Gu, Harold Johnson. “Information hiding in software with mixed-boolean-arithmetic transforms”. Information security applications, 8thinternational workshop, WISA 2007.
[2] Jon Stephens et al. “ Probabilistic obfuscation through covert channels”. 2018 IEEE European symposium on security and privacy, EuroS&P 2018 IEEE.
[3] B. Yadegari et al. “Symbolic execution of obfuscated code. Proceedings of the 22ndACM SIGSAC conference on computer and communications security CCS 2015.
[4] S. Banescu et al. “Code obfuscation agains symbolic execution attacks”. Proceedings of the 32ndannual conference on computer security applications, CSAC 2016.
[5] Zhi Wang et al. “ Linear obfuscation to combat symbolic execution”, ESORICS 2011.
[6] E. Schwartz et al:” All you ever wanted to know about dynamic taint analysis and forward symbolic execution”, IEEE symposium on security and privacy 2010.
[7] Aho, Lam, Sethi and Ullman: “Compilers, Principles, techniques and tools”, Pearson, Addision Wesley 2ndedition, chap 9, p 610.
Claims (10)
- Procédé mis en œuvre par ordinateur pour obscurcir un code de programme pour le protéger contre une attaque, comprenant les étapes suivantes :
- sélectionner (101), dans le code de programme, au moins une instruction d'affectation de variable affectant une valeur de variable d'entrée à une variable de sortie,
- remplacer (102) chaque instruction d'affectation de variable sélectionnée par un jeu d'instructions obscurci qui est fonctionnellement équivalent et qui crée autant de nouveaux chemins qu'il y a de valeurs de variables d'entrée.
- Procédé mis en œuvre par ordinateur selon la revendication 1, dans lequel l'étape consistant à sélectionner (101) au moins une instruction d'affectation de variable comprend l'identification d'au moins une instruction d'affectation de variable dans le code de programme.
- Procédé mis en œuvre par ordinateur selon la revendication 1, dans lequel l'étape consistant à sélectionner (101) au moins une instruction d'affectation de variable comprend la création, dans le code de programme, d'une instruction d'affectation de variable n'ayant aucune influence sur l'exécution du programme.
- Procédé mis en œuvre par ordinateur selon l'une quelconque des revendications précédentes, dans lequel le jeu d'instructions obscurci comprend au moins une boucle FOR contrôlée par la variable d'entrée via un opérateur incrémentiel.
- Procédé mis en œuvre par ordinateur selon la revendication 4, dans lequel le jeu d'instructions obscurci comprend plusieurs boucles FOR en chaîne via un opérateur incrémentiel, chacune étant contrôlée par un octet de la variable d'entrée.
- Procédé mis en œuvre par ordinateur selon l'une quelconque des revendications 1 à 3, dans lequel le jeu d'instructions obscurci comprend une première instruction et une deuxième instruction exécutées séquentiellement, la deuxième instruction affectant une valeur constante donnée à la variable de sortie et la première instruction écrivant la valeur de variable d'entrée dans une adresse décalée de la valeur constante.
- Procédé mis en œuvre par ordinateur selon l'une quelconque des revendications précédentes, comprenant l'étape consistant à sélectionner, dans le code de programme, plusieurs instructions d'affectation de variables, chacune appartenant à un chemin indépendant associé à une valeur d'entrée distincte du code de programme.
- Procédé mis en œuvre par ordinateur selon l'une quelconque des revendications précédentes, comprenant l'étape consistant à sélectionner, dans le code de programme, au moins une instruction d'affectation de variable, la variable ayant une chaîne définition-utilisation avec à la fois une variable d'entrée du code de programme et une variable de sortie du code de programme.
- Produit de programme informatique, le produit de programme informatique comprenant un support de stockage lisible par ordinateur dans lequel sont incorporées des instructions exécutables par ordinateur, les instructions exécutables par ordinateur étant exécutables par un processeur pour amener le processeur à mettre en œuvre les étapes du procédé selon l'une quelconque des revendications 1 à 7.
- Système informatique (800), comprenant :
- une mémoire (803) ayant des instructions exécutables par ordinateur et un programme dynamique d'une application ;
- un processeur (801) pour exécuter les instructions exécutables par ordinateur, l'exécution des instructions exécutables par ordinateur amenant le processeur à exécuter les étapes du procédé selon l'une quelconque des revendications 1 à 7.
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
WOPCT/2019/00084 | 2019-05-29 | ||
PCT/IB2019/001084 WO2020240246A1 (fr) | 2019-05-29 | 2019-05-29 | Procédé mis en œuvre par ordinateur pour obscurcir un code de programme |
Publications (2)
Publication Number | Publication Date |
---|---|
FR3096803A1 true FR3096803A1 (fr) | 2020-12-04 |
FR3096803B1 FR3096803B1 (fr) | 2022-08-19 |
Family
ID=68654815
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
FR2005567A Active FR3096803B1 (fr) | 2019-05-29 | 2020-05-27 | Procédé mis en œuvre par ordinateur pour obscurcir un code de programme |
Country Status (2)
Country | Link |
---|---|
FR (1) | FR3096803B1 (fr) |
WO (1) | WO2020240246A1 (fr) |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070234070A1 (en) * | 1999-07-29 | 2007-10-04 | Intertrust Technologies Corp. | Software self-defense systems and methods |
US20100180346A1 (en) * | 2007-01-18 | 2010-07-15 | Nicolson Kenneth Alexander | Obfuscation assisting aparatus |
US20190044915A1 (en) * | 2015-07-21 | 2019-02-07 | Baffle, Inc. | Systems And Processes For Executing Private Programs On Untrusted Computers |
-
2019
- 2019-05-29 WO PCT/IB2019/001084 patent/WO2020240246A1/fr active Application Filing
-
2020
- 2020-05-27 FR FR2005567A patent/FR3096803B1/fr active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070234070A1 (en) * | 1999-07-29 | 2007-10-04 | Intertrust Technologies Corp. | Software self-defense systems and methods |
US20100180346A1 (en) * | 2007-01-18 | 2010-07-15 | Nicolson Kenneth Alexander | Obfuscation assisting aparatus |
US20190044915A1 (en) * | 2015-07-21 | 2019-02-07 | Baffle, Inc. | Systems And Processes For Executing Private Programs On Untrusted Computers |
Non-Patent Citations (7)
Title |
---|
AHOLAMSETHIULLMAN: "Compilers, Principles, techniques and tools", pages: 610 |
B. YADEGARI ET AL., SYMBOLIC EXECUTION OF OBFUSCATED CODE. PROCEEDINGS OF THE 22 ACM SIGSAC CONFÉRENCE ON COMPUTER AND COMMUNICATIONS SECURITY CCS, 2015 |
E. SCHWARTZ ET AL.: "All you ever wanted to know about dynamic taint analysis and forward symbolic execution", IEEE SYMPOSIUM ON SECURITY AND PRIVACY, 2010 |
JON STEPHENS ET AL.: "Probabilistic obfuscation through covert channels", IEEE EUROPEAN SYMPOSIUM ON SECURITY AND PRIVACY, EUROS&P 2018 IEEE, 2018 |
S. BANESCU ET AL.: "Code obfuscation agains symbolic execution attacks", PROCEEDINGS OF THE 32ND ANNUAL CONFÉRENCE ON COMPUTER SECURITY APPLICATIONS, 2016 |
YONGXIN ZHOUALEC MAINYUAN XIANG GUHAROLD JOHNSON: "Information hiding in software with mixed-boolean-arithmetic transforms", INFORMATION SECURITY APPLICATIONS, 8TH INTERNATIONAL WORKSHOP, WISA, 2007 |
ZHI WANG ET AL.: "Linear obfuscation to combat symbolic execution", ESORICS, 2011 |
Also Published As
Publication number | Publication date |
---|---|
FR3096803B1 (fr) | 2022-08-19 |
WO2020240246A1 (fr) | 2020-12-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11601442B2 (en) | System and method associated with expedient detection and reconstruction of cyber events in a compact scenario representation using provenance tags and customizable policy | |
US10387647B2 (en) | Detecting script-based malware using emulation and heuristics | |
Sion et al. | Solution-aware data flow diagrams for security threat modeling | |
Snyder et al. | Most websites don't need to vibrate: A cost-benefit approach to improving browser security | |
Bastani et al. | Specification inference using context-free language reachability | |
FR3000249A3 (fr) | Systeme et procede de detection d'un code malveillant execute par une machine virtuelle | |
US20170116410A1 (en) | Software protection | |
US10834289B2 (en) | Detection of steganography on the perimeter | |
Apvrille et al. | SysML-Sec attack graphs: compact representations for complex attacks | |
FR2914081A1 (fr) | Procede de protection de documents numeriques contre des utilisations non autorisees. | |
Smith et al. | Sugarcoat: Programmatically generating privacy-preserving, web-compatible resource replacements for content blocking | |
Rasthofer et al. | Harvesting runtime data in android applications for identifying malware and enhancing code analysis | |
Bartoletti et al. | Combining behavioural types with security analysis | |
FR3096803A1 (fr) | Procédé mis en œuvre par ordinateur pour obscurcir un code de programme | |
US11650801B2 (en) | Determining when to perform and performing runtime binary slimming | |
US10372526B2 (en) | Cleanup of unpredictable test results | |
David | Formal approaches for automatic deobfuscation and reverse-engineering of protected codes | |
US20220374516A1 (en) | Real time threat knowledge graph | |
Chen | Privacy Implications of Emerging Web Technologies | |
Catalano et al. | Enhancing Code Obfuscation Techniques: Exploring the Impact of Artificial Intelligence on Malware Detection | |
Häyrynen | Performance analysis of obfuscated JavaScript | |
Juhola | Security testing process for React Native applications | |
Sanders et al. | Developing a Zen Click Fraud Detection Framework Using Smart Contracts | |
Bartoletti et al. | Journal of Logical and Algebraic Methods in Programming | |
FR2911022A1 (fr) | Procede permettant d'imposer une politique de securite a une application telechargeable accedant a des ressources du reseau |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PLSC | Publication of the preliminary search report |
Effective date: 20210409 |
|
PLFP | Fee payment |
Year of fee payment: 2 |
|
PLFP | Fee payment |
Year of fee payment: 3 |
|
PLFP | Fee payment |
Year of fee payment: 4 |