Досталась мне библиотека для Linux (.so) в которой применяют "подобие COM'a". Я сам не сталкивался с Linux'ом, и не могу точно определить что это, но посмотрев на результат работы IDA: сплошные IDatabaseBuffer, IDatabaseResult - ну т.е. это явно что-то завязанное на интерфейсы. Я вообще посмотерл статью "Исследование InstallShield 6+", там рассказывается про COM (под винду конечно), запомнился кусок из параграфа "COM-интерфейс – радость для кракера?": Код (Text): .text:00411B13 push offset asetup ; "setup.inx"... .text:00411B18 mov eax, [ebp+ppv] .text:00411B1B mov ecx, [eax] .text:00411B1D mov edx, [ebp+ppv] .text:00411B20 push edx ; обратите внимание – перед call стоят ДВА(!) push, а ведь в коде был передан ; только один параметр – имя файла! Второй параметр – это “this”. .text:00411B21 call dword ptr [ecx+0Ch] ; метод Open вызван как регистровый call касательно какого-то хитрого адреса... А теперь приведу кусок из своей библиотеки: Код (Text): .text:0028BD42 ; WLIB::TReportCreator::HndlDatabaseResults(IDatabaseBuffer *) .... .text:0028BD5E push edx .text:0028BD5F push esi .text:0028BD60 call dword ptr [eax+38h] // IDatabaseBuffer->xxxx? .... .text:0028BD6E push edx .text:0028BD6F push esi .text:0028BD70 call dword ptr [eax+38h] // IDatabaseBuffer->xxxx? .... И ситуация с этими call напоминает мне "регистровый call касательно какого-то хитрого адреса". Так ли это вообще? Если это так, то как мне вытащить по смещению (38h), что именно вызывается из IDatabaseBuffer? Сам TDatabaseBuffer тоже присутсвует в файле. Интересуют любые мысли. Спасибо.
Никаких идей? Вообще я посмотрел интернет на тему COM'a и Linux, но меня это вбило в ещё больший ступор, в линуксе нет никаких похожих вещей на COM, хотя посмотрев на свою библиотеку, я обнаружил в ней очень занимательные строки: stdole2.tlb DllRegisterServer DllUnregisterServer DllGetClassObject DllCanUnloadNow Я вполне уверен (другого быть не может), что все эти call'ы (eax + ...) являются вызовами для интерфейса, но как определить что это именно за вызов без понятия. Хотя сам "TClassForInterface" присутствует в файле и все его названия функций известны. Все жду любых самых неожиданных и жутких предложений, вплоть до установки линукса
Уверен? SharedObject применим в винде тоже. Этого точне в линуксе быть не может. 2 варианта -Библиотека для апача -либа под сигнус (там все может быть, вплоть до fork() )
Спасибо за ответ. Точно под линукс. Red Hat Enterprise Linux 4 x86. Не для апача. Сигнус - это Cygwin что-ли? -- Нет. Сама библиотека идет под три платформы: Windows, Linux и MacOS. Изначально я так догадываюсь, что она пишется под винду (под виндой библиотека на msvc++), и делают из неё кроссплатформенную каким-то образом. Для виндовской библиотеки точно используется COM, но сама библиотека пуста нет Typelib, нет никаких сведений которые помогли бы в анализе. Собственно говоря в маковской версии (.dylib) тоже встречается DllGetClassObject, DllCanUnload. Но я не представляю, как можно писать библиотеку на COM-интерфейсах и делать её кросс-платформенной. Возможно что эти строки (Dll...), присущие виндовскому COM - просто сохраняются внутри, оставаясь неиспользованными, уж не знаю на какой случай. Удалось достать кусок заголовочного файла (.h) под "интерфейс", для релиза под Linux, если это поможет что-то опознать: Код (Text): .............. Меня заинтересовала строка: COM_NO_WINDOWS_H, но что это?
есть CORBA, и куча её реализаций. Например, ORBit. Это не COM, конечно, но я бы не сказал, что совсем непохоже.
wtix Я че интерес-то проявил: Щас как раз приступаю к написанию статьи по теме "Process interroconnection. Daemon like a trained entity. Creating and training simple Component-Based crossplatform entity." Почти собрал нужный материал... А тут DLLCanUnloadNow под Linux 8-)
Если кому интересно, что же это такое было: весь интерфейсный движок построен на модифицированном (ну сам смысл остается один и тот же) XPCOM - http://en.wikipedia.org/wiki/XPCOM А по поводу моих вирутальных call'ов - так я сам идиот не усмотрел что есть vtable, по смещению в которой я мог определить что за вызов такой. Ну и видимо что бы больше сказать надо смотреть саму внутреннюю реализацию XPCOM; но вообще он очень похож на обычный виндовский COM.