Как получить имя функции из порядкового номера в dll COM - PullRequest
1 голос
/ 16 марта 2009

Я пытаюсь получить реальные имена функций из их порядковых номеров из COM-библиотеки. Я попытался использовать dumpbin.exe, но он возвращает только [NONAME] для каждого порядкового номера (кроме первых нескольких).

    ordinal hint RVA      name

         21    0 00002439 DllCanUnloadNow
         25    1 00007F41 DllGetClassObject
        116    2 0000539C DllMain
        138    3 00008633 DllRegisterServer
        176    4 00008640 DllUnregisterServer
          1      0009152E [NONAME]
          2      00154CA7 [NONAME]
          3      00154C0B [NONAME]
          4      000140C9 [NONAME]
        ...

Каталог, содержащий файл .dll, не содержит никаких других файлов (* .tlb, * .lib, * .def).

Может кто-нибудь сказать мне, как получить список из них? Или хотя бы имя определенного порядкового номера, использующего реестр или что-то еще?

[РЕДАКТИРОВАТЬ: Дополнительная информация] Я не могу найти файл .def для COM DLL, поэтому я не могу использовать его для получения имени. Я не заинтересован в создании экземпляра класса COM, я только хочу знать, какая функция связана с указанным порядковым номером.

Моя первоначальная проблема в том, что я нашел исключение при использовании WinDbg, которое происходит в ChartFXClientServerCore! Ordinal5507 (+ 0x97b7), поэтому я хотел бы увидеть конкретную функцию, чтобы попытаться изолировать проблему.

Ответы [ 2 ]

2 голосов
/ 16 марта 2009

Вы можете использовать инструмент OleView (OLE / COM Object Viewer), который поставляется (среди прочих) с Windows SDK, http://www.microsoft.com/downloads/details.aspx?FamilyId=F26B1AA4-741A-433A-9BE5-FA919850BDBF&displaylang=en. В этом инструменте перейдите в File-> View TypeLib и затем перейдите к DLL.

РЕДАКТИРОВАТЬ: В ответ на вопрос о взаимосвязи между порядковыми номерами DLL и именами методов, предоставляемыми библиотекой типов: Методы, предоставляемые через COM, не так часто открываются через файл DEF или __declspec (DllImport). Обычно вы обращаетесь к методам COM через их производный от IUnknown интерфейс после создания соответствующего класса с помощью CoCreateInstance () или аналогичного.

Программист DLL может также выбрать выставить некоторые из методов COM в файле DEF, но AFAIK единственный способ выяснить сопоставление - это посмотреть на выходные данные dumpbin / exports, отмените декорацию возвращенных имен (с помощью undname.exe) и визуально найдите соответствие в библиотеке типов.

1 голос
/ 18 июля 2009

Если ваш COM-компонент не помечен как безопасный для сценариев, вполне вероятно, что OLEView не будет иметь никакой реальной информации (т.е. его нельзя вызывать из скрипта, поэтому вся информация (typelib) о том, как его вызывать, компилируется через idl).

Что-то вроде mIDA может получить большую часть этой информации. Вы также можете выполнить поиск openrce для IDL NDR RPC, также на woodmann , попробуйте программу просмотра символов. ( RIP fravia ).

...