Maison >développement back-end >Tutoriel Python >Pirater les fonctions Python en modifiant leur code source

Pirater les fonctions Python en modifiant leur code source

Susan Sarandon
Susan Sarandonoriginal
2025-01-02 19:54:39458parcourir

Hacking Python functions by changing their source code

Bienvenue dans le prochain tutoriel piko !

Changer le comportement d'une fonction en modifiant manuellement son implémentation est évident, mais pouvons-nous d'une manière ou d'une autre perturber les implémentations des fonctions au moment de l'exécution de l'application ? Organisons ce processus en 3 étapes :

  • obtention du code source de la fonction au moment de l'exécution
  • conversion d'une chaîne avec le code source en un objet appelable
  • modifier le code source de la fonction avant de l'appeler

Obtention du code source de la fonction au moment de l'exécution

Apprenons d'abord comment obtenir un code source de la fonction :

# Import inspect module
import inspect
# Define some callback function
def function():
    print('Do something')

source_code = inspect.getsource(function)
print(source_code)

Sortie :

def callback():
    print('Do something')

Conversion d'une chaîne avec le code source en un objet appelable

Voyons maintenant comment convertir du code Python arbitraire fourni dans une chaîne en un objet Python appelable :

# Source code that we want to execute
source_code = 'print("Hello from the inside of the string!")'
# Wrap the source code into a function definition, so that it can be accessed by name
function_name = 'print_hello'
function_definition = f'def {function_name}():\n    {source_code}'

namespace = {}

# Execute code with a function definition within the given namespace, so that the function definition is created
exec(function_definition, namespace)
# Retrieve function from the namespace and save to a callable variable
print_hello = namespace[function_name]
# Call the function
print_hello()

Sortie :

Hello from the inside of the string!

Modifier le code source de la fonction avant de l'appeler

Implémentons maintenant une fonction qui prend en entrée un pointeur de fonction et renvoie un objet appelable avec le code source modifié :

import inspect

def get_hacked_function(function):
    # Get the source code of the given function
    original_function_source_code = inspect.getsource(function)
    # Append a new line to the function source code
    modified_function_source_code = f'{original_function_source_code}    print("You didn\'t expect me here!")'
    # Call the function within the namespace
    namespace = {}
    exec(modified_function_source_code, namespace)
    # Parse function name by taking everything what's between "def " and "(" at the first line
    function_name = original_function_source_code.split('(')[0].split()[1]
    # Retrieve modified function
    modified_function = namespace[function_name]
    # Return modified function
    return modified_function

Il est temps de le tester !

# This is the function passed as an input
def original_function():
    print("Hello")
# Call our hacking function
hacked_function = get_hacked_function(original_function)
# Call the modified function
hacked_function() 

Sortie :

Hello
You didn't expect me here!

Remarque pour les débutants : veuillez garder à l'esprit que de telles expériences sont réalisées principalement à des fins éducatives. L'utilisation de la fonction exec() peut introduire de graves problèmes de sécurité, il n'est donc pas recommandé de l'utiliser dans un environnement de production. Si vous devez modifier le comportement d'une fonction dont vous n'avez pas accès au code source, envisagez plutôt d'utiliser des décorateurs de fonctions. Soyez toujours prudent et assurez-vous de bien comprendre les implications en matière de sécurité avant d'utiliser exec().

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Python Jour 1Article suivant:Python Jour 1