2008-12-22 4 views
17

내 보낸 (C 스타일?) 함수의 서명 (매개 변수 개수/형식, 반환 형식)을 DLL에서 가져올 수 있습니까? DLL Export Viewer으로 함수 이름, 주소, 서수 등의 목록을 볼 수 있지만 서명을 볼 수는 없습니다. dll 파일 만 있고 .h 또는 .def 파일이 없습니다.DLL에서 내 보낸 함수의 서명 가져 오기

업데이트 :API Monitor이라는 도구를 사용하면 언급 된 dll을 사용하는 프로세스에 연결할 수 있으며 함수 호출을 볼 수 있습니다. 이것은 매개 변수, 반환 값 및 정수 값 (포인터?)의 수를 볼 수있게하지만, 많은 도움이되지 못합니다. 나는 아마도 포인터가 호출 시간에 가리키는 구조의 유형을 결정하는 방법을 찾아야한다.

답변

3

C++에서 함수 서명은 컴파일러 종속적 인 방식으로 이름에 "mangled"입니다. 이것은 C에서 발생하지 않습니다. 따라서 DLL에 C 함수가 있다면, 당신은 엉킴없는 이름을 보게 될 것입니다. C++이라면, 맹 글링 된 것들이 보일 것입니다.

링커가 서로 다른 서명으로 오버로드 된 함수를 해결할 수 있도록 C++에서 변경된 이름이 필요합니다.

"C"DLL에서 기능을 가져 오는 방법이 없다고 생각합니다. 그들은 단순히 존재하지 않습니다.

3

C 함수의 경우이 정보는 DLL에 저장되지 않습니다. 제가 제안 할 수있는 유일한 방법은 함수를 분해하고 스택에서 변수와 상호 작용하는 방식을 살펴본 다음 서명을 결정하려고합니다.

행운을 빈다.

17

DLL은 내보낼 함수의 서명을 저장하지 않습니다. 다른 대답은 C++을 언급했으며, C++ 함수가 으로 C++으로 내보내지면 이름이 실제로 엉망이됩니다. 올바른 컴파일러의 mangling scheme을 사용하여이를 디맹 글링하십시오. 그러면 서명이 생깁니다. 그러나 대부분의 DLL은 C++ 이름을 사용하여 C++ 함수를 내 보내지 않습니다. 대신 DLL에서 내보내는 함수는 C 스타일 이름을 사용하여 내보내므로 DLL이 C++로 작성된 경우에도 내 보낸 함수에는 서명 정보가 없습니다.

헤더가 없습니까? 대부분의 공급 업체는 SDK에 그런 종류의 것을 포함합니다. 당신이 그것을 얻지 않았다면, 그때 판매 인에게 불평하십시오. 당신이 하나를 얻으려고하지 않는다면, 아마 당신은 당신의 임무를 잘못된 길로 가게 할 것입니다; 직접 DLL을 사용하기로되어 있습니까?

헤더 파일이 없으면 합법적으로 실제로 프로그램에서 DLL을 사용할 수 있는지 여부를 스스로 물을 수도 있습니다. 시스템에서 발견 된 임의의 DLL 일 경우 코드를 작성할 수 있더라도 프로그램을 출시 할 때 코드를 재배포 할 수 없습니다.

+0

당신은 절대적으로 당신의 시점에 있습니다 :) – huseyint

관련 문제