次の pikoTutorial へようこそ!
実装を手動で変更して関数の動作を変更するのは明らかですが、アプリケーションの実行時に関数の実装を何らかの方法でいじることはできるでしょうか?このプロセスを 3 つのステップに整理してみましょう:
まず、関数のソース コードを取得する方法を学びましょう:
# Import inspect module import inspect # Define some callback function def function(): print('Do something') source_code = inspect.getsource(function) print(source_code)
出力:
def callback(): print('Do something')
次に、文字列で提供された任意の Python コードを呼び出し可能な Python オブジェクトに変換する方法を見てみましょう。
# 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()
出力:
Hello from the inside of the string!
次に、関数ポインターを入力として受け取り、変更されたソース コードを含む呼び出し可能なオブジェクトを返す関数を実装しましょう。
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
テストの時間です!
# 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()
出力:
Hello You didn't expect me here!
初心者向けの注意: このような実験は主に教育目的で行われていることに留意してください。 exec() 関数を使用すると、重大なセキュリティ問題が発生する可能性があるため、運用環境での使用はお勧めできません。ソース コードにアクセスできない関数の動作を変更する必要がある場合は、代わりに関数デコレーターの使用を検討してください。 exec() を使用する前に常に注意し、セキュリティへの影響を十分に理解してください。
以上がソースコードを変更して Python 関数をハッキングするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。