2010-05-23 3 views
9

일반 Win32 DLL/Exe를 구문 분석하고 콘솔 또는 GUI (예 : Win Forms)에 표시하기 위해 모든 가져 오기 및 내보내기를 가져와야합니다. C# .NET에서 Win32 DLL/Exe를 구문 분석 할 수 있습니까? 내보내기/가져 오기 테이블을 읽고 관리되는 형식을 가져옵니다. 관리되지 않는 PE이므로 .NET에서는 관리되지 않는 PE 파일을 관리되는 .NET 어셈블리로 변환 할 수 없으며 COM 관리되는 어셈블리 만 생성합니다..NET에서 일반 Win32 PE 파일 (Exe/DLL) 구문 분석

어떻게 이러한 테이블을 구문 분석하고 모든 관리 방법으로 서명 (서명)을 취할 수 있습니까? (예 : char *를 인수로 사용하는 경우 IntPtr로 표시되어야 함).

+0

우스만은, 그런는 "C# .NET을"로 생각하지있다. –

+0

왜이 커뮤니티는 위키입니까? –

+0

@ 존 : C#은 .NET ..에 속합니다? 나는 이상한 말을 해왔다. ..? – Usman

답변

2

Microsoft Portable Executable Specification Document을 사용하여 PE 파일을 구문 분석 할 수 있습니다. 그러나 Logan이 지적한대로 서명은 이 아니며이 PE 파일에 포함되어 있습니다. 내 보낸 함수의 이름 만 포함됩니다.

업데이트 : dll이 최신 버전의 Microsoft C++ 컴파일러에서 작성한 C++ dll 인 경우이 함수를 호출하여 대부분의 서명을 얻기 위해 변형 된 이름을 알 수 있습니다. UnDecorateSymbolName from Debugging Tools for Windows. 그러나 반환 값은 변환 된 이름에 포함되지 않습니다.

+0

이름이 장식되어 있습니다. 당신이 그들을 꾸며 내지 않을 때 당신은 정확한 서명을 얻습니다. 그래서 이런 방식으로 당신은 서명의 거의 90 %를 얻습니다. – Usman

+0

대다수의 Windows DLL에는 C 스타일 인터페이스와 매개 변수 정보가없는 자유로운 이름이 있습니다. 당신이 염두에두고 특정 dll을 가지고 있다면, 내가 말했듯이 당신은 dumpbin와 그 사람을 확인할 수 있습니다. –

+0

변경된 C++ 이름을 사용하여 업데이트 된 답변보기. –

2

질문의 두 번째 부분 인 메소드 서명을 얻는 것은 일반적으로 불가능합니다. 그 정보는 대개 PE 자체에 저장되지 않습니다. 맹 글링 된 이름은 해당 정보를 인코딩하기 때문에 C++ 함수의 경우 가능하지만 대부분의 DLL은 C++ 인터페이스를 노출하지 않기 때문에 가능할 수 있습니다. COM 인터페이스의 경우이 정보는 형식 라이브러리에 저장되며 종종 PE에 리소스로 포함됩니다. 당신이 염두에두고있는 특정 dll에 대해 이것이 가능한지 확인하기 위해 dumpbin과 undec을 사용하여 함수가 C++ mangled 이름인지 확인할 수 있습니다. 그렇지 않으면 적절한 P/Invoke 서명을 만들기 위해 헤더 파일과 같은 다른 정보 소스가 필요합니다 (이 경우 PE 파일을 구문 분석 할 필요가 없을 것입니다).