PyConFr 2014

Lyon, October 25-28

PyConFR 2014

dimanche 10:00:00–10:30:00

Obscurcissement de bytecode Python

Nicolas Szlifierski

Audience level:
Intermediate

Description

Il est simple de récupérer le code source d'un programme Python depuis son bytecode, mais ce n'est pas toujours souhaitable. Nous verrons qu'en utilisant un interpréteur généré spécifiquement pour une application, nous pouvons rendre le bytecode d'une application obscurci et non exécutable par l'interpréteur standard sans modifier significativement le temps d'exécution.

Abstract

Lorsqu'on livre une application Python, il est simple d'en récupérer le code source depuis le bytecode, ce qui n'est pas toujours souhaitable. L'obscurcissement (en anglais, obfuscation) permet de pallier cette limitation. Nous pouvons modifier l'interpréteur Python afin qu'il puisse exécuter le bytecode de l'application obscurcie via différentes techniques :

  • Permutation des opcodes : On peut permuter les représentations entières des opcodes, afin que les actions effectuées par ceux ci ne correspondent plus à la représentation de l'interpréteur standard.

  • Ajout de nouveaux opcodes : Les opcodes étant codé sur 8 bits, il reste plus d'une centaine de codes libres, ce qui nous laisse la possibilité d'en ajouter de nouveaux. On peut ainsi remplacer les suites d'opcodes récurrentes dans l'application par un seul nouvel opcode qui effectuera les mêmes opérations.

  • Bytecode auto-modifiant : Pendant l'exécution de l'application, on peut modifier le bytecode chargé en mémoire ; ainsi le bytecode exécuté ne sera pas celui contenu dans le fichier.

On obtient un interpréteur spécifique à l'application, capable d'exécuter le bytecode obscurci sans pertes de performances, et la rétro-ingénierie est impossible sans un travail sur la compréhension de l'interpréteur modifié.

Voir le support de présentation

Sponsors