Rumah >pembangunan bahagian belakang >Tutorial Python >Menggodam fungsi Python dengan menukar kod sumbernya

Menggodam fungsi Python dengan menukar kod sumbernya

Susan Sarandon
Susan Sarandonasal
2025-01-02 19:54:39431semak imbas

Hacking Python functions by changing their source code

Selamat datang ke pikoTutorial seterusnya!

Menukar gelagat fungsi dengan mengubah suai pelaksanaannya secara manual adalah jelas, tetapi bolehkah kita entah bagaimana mengacaukan pelaksanaan fungsi pada masa jalan aplikasi? Mari atur proses ini dalam 3 langkah:

  • mendapatkan kod sumber fungsi pada masa jalan
  • menukar rentetan dengan kod sumber kepada objek boleh panggil
  • ubah suai kod sumber fungsi sebelum memanggilnya

Mendapatkan kod sumber fungsi semasa runtime

Mari kita pelajari dahulu cara mendapatkan kod sumber fungsi:

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

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

Output:

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

Menukar rentetan dengan kod sumber kepada objek boleh panggil

Sekarang mari lihat cara menukar beberapa kod Python sewenang-wenang yang disediakan dalam rentetan kepada objek Python boleh dipanggil:

# 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()

Output:

Hello from the inside of the string!

Mengubah suai kod sumber fungsi sebelum memanggilnya

Sekarang mari kita laksanakan fungsi yang mengambil sebagai input penuding fungsi dan mengembalikan objek boleh dipanggil dengan kod sumber yang diubah suai:

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

Sudah tiba masanya untuk mengujinya!

# 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() 

Output:

Hello
You didn't expect me here!

Nota untuk pemula: sila ingat bahawa eksperimen sedemikian dilakukan terutamanya untuk tujuan pendidikan. Menggunakan fungsi exec() boleh memperkenalkan isu keselamatan yang serius, jadi tidak disyorkan untuk menggunakannya dalam persekitaran pengeluaran. Jika anda perlu mengubah suai gelagat fungsi yang kod sumbernya anda tidak mempunyai akses, pertimbangkan untuk menggunakan penghias fungsi. Sentiasa berhati-hati dan pastikan anda memahami sepenuhnya implikasi keselamatan sebelum menggunakan exec().

Atas ialah kandungan terperinci Menggodam fungsi Python dengan menukar kod sumbernya. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Hari Python 1Artikel seterusnya:Hari Python 1