2010-08-20 2 views
2

문서화되지 않은 인터페이스를 구현하는 COM 개체에 대한 포인터가 있습니다. 난 정말, 정말 같은 인터페이스를 사용할 수있는 것. 내가 가지고있는 것은 모두 IID입니다. 마스터 소프트웨어 분석가 인 Geoff Chappell은 자신의 사이트에서 이러한 문서화되지 않은 COM 인터페이스를 문서화했습니다. 예를 들어 IListView을 참조하십시오. 어쨌든 그는 심지어 함수 이름과 서명을 얻을 수있었습니다. 어떻게 그런 일이 가능할까요? 그들이 추측하고 있습니까?문서화되지 않은 COM 인터페이스 Decipeher

누군가 내가 이런 식으로 갈 방법에 관해 올바른 방향으로 나를 가리킬 수 있습니까? 나는 문서화되지 않은 것을 사용하는 위험을 안다.

정교하게 말하면, 제가 관심있어하는 대상은 ExplorerFrame.dll의 문서화되지 않은 ItemsView입니다. CoCreateInstance에 API 훅을 설정함으로써, 개체가 문서화되지 않은 IID를 주 인터페이스로하여 생성된다는 것을 알 수 있습니다. 나는 이것이 컨트롤을 조작하는 인터페이스라고 가정하고 있습니다. 그러므로 멤버를 알아내는 것에 관심이 있습니다.

+0

문서화되지 않은 경우 어떻게 생각하세요? 형식 라이브러리 찾기, OleView.exe 사용 –

+0

편집 된 질문; ExplorerFrame.dll에 typelib이있는 것처럼 보이지 않습니다. OleView에서 Itemsview를 확인해도 내가 볼 수있는 유용한 것은 나오지 않습니다. –

답변

0

포인터가 IDispatch (상당히 그렇습니다)를 의미한다면 QueryInterface와 GetIDsOfNames를 사용할 수 있습니다. 가능성이있는 인터페이스를 추측하고 QI를 호출하면 작동하는 것을 볼 수 있습니다.

+0

슬프게도, IDispatch를 구현하지 않습니다. Urgh, 정말 유용한 기능처럼 들리네. –

+0

시행 착오를해야 할 수도 있습니다. 그것이 무엇인지에 대한 추측을한다면, 그것을위한 질문 (QI)을하고, 그렇다고 대답하는지 확인하십시오. – seand

+0

QueryInterface (IID_IDispatch)는 E_NOINTERFACE를 반환합니다. 하지만 인터페이스가 무엇인지는 이미 알고 있습니다. 내가 모르는 것은 그것이 정의하는 방법이나 그들의 매개 변수가 무엇인지 알지 못한다. 나는 단지 무작위 매개 변수로 그들을 호출하고 충돌과 무엇이 아닌지를 볼 수 있다고 생각하지만, 나는 더 문명화 된 방법이 있기를 바라고 있습니다. –

5

알다시피, 당신은 저에게 편지를 쓰고 물을 수 있습니다! 이름과 프로토 타입이 Microsoft의 공용 기호 파일에서 온 것이라고 명시 적으로 기술 할 때가 있었지만 오래 전에 이것을 구술로 버렸습니다. 내가 정보를 어떻게 얻었는지 항상 설명하고 있다면 어떤 종류의 리버스 엔지니어가 될 수 있겠습니까! 나는 리버스 엔지니어 인 독자들에게 모욕적 인 태도를 취하고 정보를 원하는 사람들을 지루하게 만들 위험이있다.

공용 심볼 파일이없는 경우 다음에 가장 좋은 것은 typelib입니다. 물론 모든 인터페이스가 형식 라이브러리에 표시되는 것은 아니며 IDispatch를 구현하는 모든 인터페이스가 아닙니다.

실행 파일과 공용 심볼 파일이 있으면 IID를 얻고 메소드를 나열하는 것이 거의 거의 리버스 엔지니어링이 가장 간단합니다. 신뢰할 수있는 자동화를 위해서는 다소 복잡 할 수 있습니다.하지만 그 점을 잘못 입증하고 싶습니다.

구현을위한 가상 함수 테이블을 가지고 있기 때문에 인터페이스를 알 수 있습니다. 대부분 당신이 클래스를 리버스 엔지니어링하기 때문에 이것을 발견했습니다.이 경우 생성자 또는 소멸자에서 작업하여 모든 인터페이스에 대한 가상 함수 테이블을 찾습니다. 가상 함수 표는 함수에 대한 포인터의 배열입니다. 공용 심볼 파일은 이러한 함수의 데코 레이팅 된 이름을 제공합니다. 유능한 리버스 엔지니어가이 기호를 대부분 시력으로 장식 할 수 있으며 Visual C++는 UNDNAME 도구를 제공합니다 (그리고 디버거 또는 디스어셈블러가 작업을 수행 할 수 있습니다). IID를 찾으려면 일반적으로 클래스의 시작 부분에서 인터페이스 가상 함수 테이블의 알려진 오프셋과 일치하는 QueryInterface 메서드를 검사해야합니다.

IID, 오프셋 및 프로토 타입의 기본 목록을 작성하는 전체 연습은 좋은 하루에 10 분이 걸릴 수 있으며, 게으르다. 물론 이러한 문서화되지 않은 인터페이스가 많으면 구현 및 IID가 여러 버전에서 동일하다는 것을 확인하여 좋은 하루를 빠르게 나쁜 것으로 바꿀 수 있습니다.

그건 그렇고, 내가 추측하거나 가설을 세우면 나는 그렇게 말하려고 노력한다. 예를 들어, 설명서의 끝 부분에 문서화되지 않은 IListView 인터페이스가 있음을 알았습니다. 저는 창 메시지에 대해 말합니다. "아마도 이름이 비슷합니다"라고 말하면서 내가 제공 한 이름이 나에게서 나왔음을 알 수 있습니다.

+1

Hi Geoff. 답장을 보내 주셔서 감사합니다. 귀하의 제안에 따라 Microsoft의 심볼 서버에서 ExplorerFrame 용 PDB를 다운로드했습니다. 솔직히 MS가 이런 종류의 정보를 이용할 수있게 만들었다는 것을 알지 못했습니다! 그러나, 나는 그것을 이해하는 데 약간의 어려움을 겪고있다. PDB를 사용하여 작업 할 수있는 많은 도구를 찾을 수없는 것 같습니다 ...이 파일에서 필요한 정보를 추출하는 방법에 대해 좀 더 자세히 설명 할 수 있습니까? –

2

PDB 파일의 최종 해석기는 MSPDBxx.DLL입니다. PDB 파일을 해석하기위한 기본 도구는 디버거이며 현재 DUMPBIN 디스어셈블러 인 Microsoft Visual C++ 링커도 확장되어 있습니다. 이것들은 PDB 파일의 모든 것을 보여주지는 않지만, 모든 심볼을 나열하고, 코드와 데이터에 라벨을 붙이고, 파일에있는 모든 타입 정보 (일반적으로 공개 심볼 파일에없는)를 요약하는 것과 같은 모든 기본적인 작업을 수행합니다. .

일반적으로 유능하고 잘 수행 된 리버스 엔지니어는 표준 도구에 표시되지 않은 정보를보고 이러한 파일을 읽을 수 있습니다. 가장 주목할만한 예는 섹션 기여 정보입니다. 공개 기여 파일이 소스 코드와 일치하는 코드와 유사합니다.

디버거를 기호 파일로 가리키는 방법은 잘 설명되어 있습니다. DUMPBIN으로 목록을 만들기위한 나의 연습은 바이너리와 해당 PDB 파일을 현재 디렉토리에 복사하는 것입니다. PDB 파일의 파일 이름이 바이너리의 디버그 디렉토리에있는 파일 이름과 일치하는 한 DUMPBIN은 자동으로 PDB 파일과 함께 작동합니다. 정말 쉽지는 않을 것입니다.

Microsoft 이외의 디스어셈블러와 디 컴파일러는 적어도 대상 바이너리에서 사용할 수있는 PDB 파일을 사용할 수있는 능력이 있다고 상상합니다.

관련 문제