ホームページ > バックエンド開発 > Python チュートリアル > ソースコードを変更して Python 関数をハッキングする

ソースコードを変更して Python 関数をハッキングする

Susan Sarandon
リリース: 2025-01-02 19:54:39
オリジナル
437 人が閲覧しました

Hacking Python functions by changing their source code

次の 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 サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート