2011-02-03 2 views
11

런타임시 (LD_PRELOAD), Linux에서 fopen()과 같은 C 함수를 인터셉트/후크하는 방법은 무엇입니까? 나는 파이썬에서 이것을하고 싶다. (따라서, 나는 이미 프로그램이 CPython VM을 실행하고 있다고 가정하고있다.) 또한 파이썬 코드로 경로를 바꾸고 싶다. 나는 공유 라이브러리 함수를 후킹하는 것으로 충분하다. 또한 프로그램을 실행하는 방식을 변경하지 않고도이 작업을 수행하고 싶습니다.리눅스에서 Python의 C 함수를 동적으로 삽입하는 방법 (LD_PRELOAD없이)?

하나의 아이디어, 또는 dlsym()로 또는 PLT에있는 코드를 재 작성하고, ctypes -generated C-호출 기능을 타겟팅 내 자신의 도구를 ptrace()에 따라 출시하는 것입니다,하지만 난 여기에 먼저 물어 거라고 생각했다. 감사.

+0

* LD_PRELOAD를 사용하면 어떨까요? –

+0

하위 수준의 작업을 수행하려면 기본 모듈을 작성해야합니다. Python에서 PLT에 액세스하여 수정하는 경우 (가능할 수도 있음) Python VM을 시작하는 코드가 필요합니다. –

+1

@Matt Joiner : 질문을하는 방식에 따라, 나는 당신이 말한 것을 싫어합니다. 어떤 경우에는 당신이 더 구체적 일 수 있다면 생산적/건설적 일 것입니다. 그러나 당신이 정말로 묻고있는 경우에, 이것은 당신이 기능 중개를 비 동적으로하는 방법입니다 : http://stackoverflow.com/questions/426230/what-is-the-ld-preload-trick (그리고, 전에 많은 시간이 적용된) – Yang

답변

2

google-perftools는 src/windows/preamble_patcher*에서 자신의 우회로 구현을 사용합니다. 이것은 현재 Windows 전용이지만, 심볼 주소를 찾기 위해 win32 함수를 사용한다는 사실을 제외하고는 x86 시스템에서 작동하지 않을 이유가 없습니다. 리눅스 버전이 모두

코드의 빠른 검사와 내가 사용이 Win32에서 기능을 참조하십시오 :

  • GetModuleHandle 함수/GetProcAddress를 : 함수 주소를 얻는다. dlsym이 이것을 할 수 있습니다.
  • VirtualProtect : 어셈블리 수정을 허용합니다. mprotect.
  • GetCurrentProcess는 :
  • FlushInstructionCache (코멘트에 따라 분명히 NOP)

그것은 너무 열심히하지 않는 것이 컴파일 파이썬에 링크하려면를 GETPID,하지만 난에 메시지를 보낼 것 perftools devs 그리고 그들이 생각하는 것을 보아라.

+0

어떤 어셈블리가 수정되는지주의하십시오. –

+0

언급 한 소스 파일에 링크하십시오. –

+0

http://code.google.com/codesearch#BGeH2W13jNw/trunk/src/windows/preamble_patcher.cc&q=preamble_patcher%20package:http://gperftools%5C.googlecode%5C.com, win32 함수 호출은 몇 가지 지침을 남깁니다. 모든 함수 호출의 시작 부분에서 원하는 기능으로 점프로 변경할 수 있습니다. – aaron

2

ltrace 개발자 중 한 명에게이 방법이 있습니다. 동적으로로드 된 라이브러리를 잡으려면 전체 패치가 포함 된 this post을 참조하십시오. 파이썬에서 호출하기 위해서는 아마 C 모듈을 만들어야 할 것이다.

+0

환상적인 링크, 감사합니다. –