다음 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!