COM DLL из памяти

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

COM DLL из памяти

Сообщение jangle » 02.06.2016 (Чт) 21:14

Функции из Native DLL можно вызывать из памяти без сохранения DLL на диск. А можно ли таким образом вызывать методы из COM DLL?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: COM DLL из памяти

Сообщение Хакер » 02.06.2016 (Чт) 21:32

Если учесть, в отношении первого утверждения действует слово «можно» (тогда как на самом деле нельзя, а то, что есть — дичайшая эмуляция), то и второе можно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: COM DLL из памяти

Сообщение jangle » 02.06.2016 (Чт) 21:54

и каким образом? Допустим DLL отображена в память, ее импорт загружен. Указатели на DllCanUnloadNow и DllGetClassObject получены. Что дальше делать?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: COM DLL из памяти

Сообщение Хакер » 02.06.2016 (Чт) 21:57

DllGetClassObject имеет отношение не к COM, а к надстройке над COM — к технологии ActiveX.

Дальше что?

Вызвать DllGetClassObject, получить class-object для интересующего ActiveX-класса. Class-object — это COM-объект, олицетворяющий ActiveX-класс (не экземпляр класса, а именно сам класс).

У полученного от DllGetClassObject объекта запросить интерфейс IClassFactory. У него вызвать метод CreateInstance — и породить таким образом новый экземпляр интересующего класса. С полученным экземпляром можно работать так же, как если бы он был создан вызовом CreateObject или с использованием оператора New.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: COM DLL из памяти

Сообщение jangle » 02.06.2016 (Чт) 22:02

Интерес больше спортивный. Сделать портабельное приложение в виде одного EXE из проекта с несколькими ActiveX компонентами. Чтобы работало все без распаковки во временную папку.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: COM DLL из памяти

Сообщение The trick » 02.06.2016 (Чт) 23:10

Если PE-образ правильно загружен в память (настроены релоки, добавлена запись в PEB->Ldr, вызвана EntryPoint + еще соблюдены дополнительные шаги зависящие от самого PE образа(к примеру IMAGE_DIRECTORY_ENTRY_TLS и т.п.)) то можешь посмотреть этот модуль. Замени LoadLibrary на свою функцию загрузки.
UA6527P

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: COM DLL из памяти

Сообщение jangle » 03.06.2016 (Пт) 10:22

The trick писал(а):Замени LoadLibrary на свою функцию загрузки.


там в коде еще LoadTypeLibEx используется. Будет ли работать, ведь физически COM DLL нет на диске.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: COM DLL из памяти

Сообщение The trick » 03.06.2016 (Пт) 11:04

jangle писал(а):там в коде еще LoadTypeLibEx используется. Будет ли работать, ведь физически COM DLL нет на диске.

Юзай CreateObjectEx там сырой CLSID передавай, ты же знаешь его на момент компиляции.
UA6527P

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: COM DLL из памяти

Сообщение jangle » 03.06.2016 (Пт) 11:30

кстати тупой касперский ругается на твой код http://forum.sources.ru/index.php?showtopic=390886
думет что это вирус

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: COM DLL из памяти

Сообщение The trick » 03.06.2016 (Пт) 11:36

jangle писал(а):кстати тупой касперский ругается на твой код http://forum.sources.ru/index.php?showtopic=390886
думет что это вирус

Правильно, потому что там используется сплайсинг для подмены на свои обработчики. Это "грязный" хак, лучше его не использовать.
Не юзай этот код - он плохой и может не работать на каких-либо версиях винды. Для той задачи существует легальное решение RegFree.
UA6527P

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: COM DLL из памяти

Сообщение jangle » 03.06.2016 (Пт) 11:48

Неправильно. Кашперы дошли до того, что тупо добавляют сигнатуры vB6 компилятора в базы. Кривые руки и лень это.
Одно время их антивирус ругался на пустые проекты с одной формой, скомпилированные в P-CODE.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28

    TopList