2009-01-07 2 views
5

이것은 이상한 질문처럼 보일 수 있지만 메모리 '서명'에서 .dll 함수를 어떻게 실행할 수 있는지 알고 싶습니다. 나는 그것이 실제로 어떻게 작동하는지에 관해 많은 것을 이해하지 못한다. 그러나 나는 그것을 틀리게 필요로했다. 메모리 서명 및 주소를 알고있는 경우 .dll 내에서 unexported 함수를 실행하는 방법입니다. 예를 들어, 나는이 있습니다파이썬으로 unexported .dll 함수를 실행 중

respawn_f "_ZN9CCSPlayer12RoundRespawnEv" 
respawn_sig "568BF18B06FF90B80400008B86E80D00" 
respawn_mask "xxxxx?xxx??xxxx?" 

그리고 당신이 .DLL 내에서 기능을 실행하려면이 옵션을 사용할 수있는 몇 가지 꽤 멋진 C++ 코드를 사용하여. 그래서 http://wiki.alliedmods.net/Signature_Scanning

이하는 ctypes하거나 내부 파이썬을 할 수있는 다른 방법을 사용하여 가능하다 : 여기

그것에 잘 설명한 기사를 무엇입니까?

답변

2

C++을 사용하여 이미 실행할 수있는 경우 SWIG를 사용하여 작성한 C++ 코드의 파이썬 래퍼를 생성하여 파이썬에서 호출 가능하도록 만들 수 있습니다. 나는 꿀꺽 꿀꺽를 사용하여 발견 한

http://www.swig.org/

몇 가지주의 사항 :

꿀꺽 꿀꺽은 문자열 값을 기준으로 유형을 찾습니다. 예를 들어 Python (int)의 정수 유형은 이 cpp 유형이 "int"인지 확인합니다. 그렇지 않으면 swig가 유형 불일치에 대해 에 불평합니다. 자동 변환은 없습니다.

Swig는 소스 코드를 그대로 복사하므로 동일한 네임 스페이스 에있는 객체조차도 cxx 파일이 올바르게 컴파일되도록 정규화해야합니다.

희망이 있습니다.

0

당신은 수출되지 않은 함수를 호출하려고했다. 내가 아는 한 그것은 파이썬에서 불가능합니다. 그러나 문제는 그 이름이 엉망이 된 것일뿐입니다.

ctypes를 사용하여 임의의 내보내기를 호출 할 수 있습니다. 이름이 엉망이고 유효한 파이썬 식별자가 아니기 때문에 getattr()을 사용할 수 있습니다.

올바른 정보를 얻는 또 다른 방법은 서 명으로 내보내기를 찾는 것입니다. 서 명으로 내보내기를 찾으려면 이름을 전혀 내 보내지 않으면됩니다. 서수를 얻는 한 가지 방법은 많은 Windows 컴파일 언어에 포함 된 dumpbin.exe를 사용하는 것입니다. 실제로 링커의 프론트 엔드이므로 MS LinK.exe를 사용하는 경우 적절한 명령 행 스위치와 함께 사용할 수도 있습니다. ,

수입하는 ctypes FUNC = getattr (ctypes.windll.msvcrt :

당신은 같은 것을 사용할 수 있습니다, (그것의 주소에 바인딩 "함수 포인터"객체이다) 함수 참조를 얻으려면 "@@ myfunc") retval = func (없음)

당연히 'msvcrt'를 호출하려는 dll로 바꾸십시오.

여기에 나와 있지 않은 내용은 호출 서명을 파생시키기 위해 이름을 분리하고 필요한 인수를 얻는 방법입니다. 그렇게하려면 데 랭글러가 필요하며 DLL을 생성하는 데 사용되는 C++ 컴파일러의 및 버전 브랜드에만 해당됩니다.

함수가 stdcall인지 확인하는 데 일정량의 오류가 있습니다. 그래서 때로는 올바른 결과를 얻을 때까지 사물을 조작 할 수 있습니다. 하지만이 기능이 cdecl이라면 자동으로 확인할 방법이 없습니다. 마찬가지로 적절한 경우 추가 매개 변수를 포함해야합니다.

관련 문제