COM (Component Object Model) +Linux и анализ в IDA

Тема в разделе "WASM.BEGINNERS", создана пользователем wtix, 2 дек 2007.

  1. wtix

    wtix New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2007
    Сообщения:
    5
    Досталась мне библиотека для Linux (.so) в которой применяют "подобие COM'a". Я сам не сталкивался с Linux'ом, и не могу точно определить что это, но посмотрев на результат работы IDA: сплошные IDatabaseBuffer, IDatabaseResult - ну т.е. это явно что-то завязанное на интерфейсы.

    Я вообще посмотерл статью "Исследование InstallShield 6+", там рассказывается про COM (под винду конечно), запомнился кусок из параграфа "COM-интерфейс – радость для кракера?":
    Код (Text):
    1.       .text:00411B13                 push    offset asetup ; "setup.inx"...
    2.       .text:00411B18                 mov     eax, [ebp+ppv]
    3.       .text:00411B1B                 mov     ecx, [eax]
    4.       .text:00411B1D                 mov     edx, [ebp+ppv]
    5.       .text:00411B20                 push    edx
    6.       ; обратите внимание – перед call стоят ДВА(!) push, а ведь в коде был передан
    7.       ; только один параметр – имя файла! Второй параметр – это “this”.
    8.       .text:00411B21                 call    dword ptr [ecx+0Ch]
    9.       ; метод Open вызван как регистровый call касательно какого-то хитрого адреса...
    А теперь приведу кусок из своей библиотеки:

    Код (Text):
    1. .text:0028BD42 ; WLIB::TReportCreator::HndlDatabaseResults(IDatabaseBuffer *)
    2.                  ....
    3.  
    4. .text:0028BD5E                 push    edx
    5. .text:0028BD5F                 push    esi
    6. .text:0028BD60                 call    dword ptr [eax+38h]  // IDatabaseBuffer->xxxx?
    7.                  ....
    8. .text:0028BD6E                 push    edx
    9. .text:0028BD6F                 push    esi
    10. .text:0028BD70                 call    dword ptr [eax+38h]  // IDatabaseBuffer->xxxx?
    11.                  ....
    И ситуация с этими call напоминает мне "регистровый call касательно какого-то хитрого адреса". Так ли это вообще?

    Если это так, то как мне вытащить по смещению (38h), что именно вызывается из IDatabaseBuffer? Сам TDatabaseBuffer тоже присутсвует в файле.


    Интересуют любые мысли. Спасибо.
     
  2. wtix

    wtix New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2007
    Сообщения:
    5
    Никаких идей?

    Вообще я посмотрел интернет на тему COM'a и Linux, но меня это вбило в ещё больший ступор, в линуксе нет никаких похожих вещей на COM, хотя посмотрев на свою библиотеку, я обнаружил в ней очень занимательные строки:
    stdole2.tlb
    DllRegisterServer
    DllUnregisterServer
    DllGetClassObject
    DllCanUnloadNow

    Я вполне уверен (другого быть не может), что все эти call'ы (eax + ...) являются вызовами для интерфейса, но как определить что это именно за вызов без понятия. Хотя сам "TClassForInterface" присутствует в файле и все его названия функций известны.

    Все жду любых самых неожиданных и жутких предложений, вплоть до установки линукса :)
     
  3. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Уверен?
    SharedObject применим в винде тоже.
    Этого точне в линуксе быть не может.
    2 варианта
    -Библиотека для апача
    -либа под сигнус (там все может быть, вплоть до fork() )
     
  4. wtix

    wtix New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2007
    Сообщения:
    5
    Спасибо за ответ.

    Точно под линукс. Red Hat Enterprise Linux 4 x86.
    Не для апача.
    Сигнус - это Cygwin что-ли? -- Нет.

    Сама библиотека идет под три платформы: Windows, Linux и MacOS. Изначально я так догадываюсь, что она пишется под винду (под виндой библиотека на msvc++), и делают из неё кроссплатформенную каким-то образом. Для виндовской библиотеки точно используется COM, но сама библиотека пуста нет Typelib, нет никаких сведений которые помогли бы в анализе.
    Собственно говоря в маковской версии (.dylib) тоже встречается DllGetClassObject, DllCanUnload. Но я не представляю, как можно писать библиотеку на COM-интерфейсах и делать её кросс-платформенной. Возможно что эти строки (Dll...), присущие виндовскому COM - просто сохраняются внутри, оставаясь неиспользованными, уж не знаю на какой случай.

    Удалось достать кусок заголовочного файла (.h) под "интерфейс", для релиза под Linux, если это поможет что-то опознать:
    Код (Text):
    1. ..............
    Меня заинтересовала строка: COM_NO_WINDOWS_H, но что это?
     
  5. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Если библиотека не большая (мега 3), то Аттач в студию. Изучать буду!
     
  6. wtix

    wtix New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2007
    Сообщения:
    5
    Я отправил ссылку через личные сообщения.
     
  7. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    есть CORBA, и куча её реализаций. Например, ORBit. Это не COM, конечно, но я бы не сказал, что совсем непохоже. ;)
     
  8. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    wtix
    Я че интерес-то проявил: Щас как раз приступаю к написанию статьи по теме
    "Process interroconnection. Daemon like a trained entity. Creating and training simple Component-Based crossplatform entity." Почти собрал нужный материал...
    А тут DLLCanUnloadNow под Linux 8-)
     
  9. wtix

    wtix New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2007
    Сообщения:
    5
    Если кому интересно, что же это такое было: весь интерфейсный движок построен на модифицированном (ну сам смысл остается один и тот же) XPCOM - http://en.wikipedia.org/wiki/XPCOM
    А по поводу моих вирутальных call'ов - так я сам идиот не усмотрел что есть vtable, по смещению в которой я мог определить что за вызов такой. Ну и видимо что бы больше сказать надо смотреть саму внутреннюю реализацию XPCOM; но вообще он очень похож на обычный виндовский COM.