Использование OCX без регистрации

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

Использование OCX без регистрации

Сообщение jangle » 29.05.2014 (Чт) 23:41

Возможно ли? Пишу портабельную прогу. Все нативные DLL запускаются из памяти, только OCX остались снаружи.
Можно с ними также как с нативными DLL, обработал импорт и вызвал функцию, без сохранения на диск конечно.

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

Re: Использование OCX без регистрации

Сообщение Хакер » 30.05.2014 (Пт) 5:21

Можно, но сложно. Про манифест, который за счёт позволяет использовать ActiveX-библиотеки без регистрации, ты, надеюсь, слышал? Дальше придётся делать магию.

И вообще, всё зависит от того, намерен ли ты ActiveX-контролы создавать родным для VB способом или готов пойти на создание вручную. Во втором случае всё упрощается.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Jack Ferre
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 17.02.2014 (Пн) 14:31
Откуда: Казахстан, Костанай

Re: Использование OCX без регистрации

Сообщение Jack Ferre » 01.06.2014 (Вс) 0:06

2 jangle
Не поделитесь файликом модуля, с помощью которого можно вызывать функции из длл?

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

Re: Использование OCX без регистрации

Сообщение jangle » 02.06.2014 (Пн) 13:44

Jack Ferre писал(а):2 jangle
Не поделитесь файликом модуля, с помощью которого можно вызывать функции из длл?


вызов функций DLL загруженной в буфер памяти? Исходник не на VB.

Jack Ferre
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 17.02.2014 (Пн) 14:31
Откуда: Казахстан, Костанай

Re: Использование OCX без регистрации

Сообщение Jack Ferre » 02.06.2014 (Пн) 17:55

Если проект на VB, предполагаю, что рядом с exe лежит dll. В таком случае не понимаю смысл пихать в ресурсы dll-ки, если их потом оттуда вытаскивает другая (или вы их скрываете 8) ?).

Я пытался перевести с C++ модуль для загрузки библиотеки из памяти, но как-то не пошло :oops: .
В модуле 3 паблик функции:
HMEMORYMODULE MemoryLoadLibrary(const void *);
FARPROC MemoryGetProcAddress(HMEMORYMODULE, const char *);
void MemoryFreeLibrary(HMEMORYMODULE);


Указатель, полученный с помощью MemoryGetProcAddress + MagicPointers от Хакера даст возможность вызывать функции из буфера в памяти без внешних dll.
Имея такую возможность, я бы смог
Хакер писал(а):делать магию
Вложения
LibMemory.rar
Рабочий исходник на С++ и проект на VB (жалкая попытка перевести)
(11.65 Кб) Скачиваний: 229

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

Re: Использование OCX без регистрации

Сообщение jangle » 02.06.2014 (Пн) 20:38

Jack Ferre писал(а):В таком случае не понимаю смысл пихать в ресурсы dll-ки, если их потом оттуда вытаскивает другая (или вы их скрываете 8) ?).


Не в ресурсы. Непосредственно в бинарный код приложения. Зачем? Хорошие художники копируют, великие художники крадут(с)

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

Re: Использование OCX без регистрации

Сообщение The trick » 02.06.2014 (Пн) 20:54

Можно "обмануть" VB6 и подсунуть ему DLL в памяти, перехватив нужные функции (CLSIDFromProgID чтобы возвратить CLSID, в CoGetClassObject вызывать DLLGetClassObject, также перехват OleRegGetMiscStatus (если хочешь использовать события, то нужно также перехватить RegQueryValue и LoadRegTypeLib (вот проблема будет в ручном парсинге библиотеки типов)).
UA6527P

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

Re: Использование OCX без регистрации

Сообщение Хакер » 02.06.2014 (Пн) 21:42

Кривоус Анатолий писал(а):(вот проблема будет в ручном парсинге библиотеки типов)

А зачем? Что мешает нормально положить TLB себе в ресурсы?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Re: Использование OCX без регистрации

Сообщение The trick » 02.06.2014 (Пн) 22:45

Хакер писал(а):А зачем? Что мешает нормально положить TLB себе в ресурсы?

Да, действительно. Как-то я сразу не сообразил :oops: .
Тогда это вполне реально сделать.
Я делал модуль, в котором можно использовать ActiveX контролы напрямую из библиотеки, хотя в правильности метода я не уверен. В коде прописывается что-то типа
Код: Выделить всё
Set Ctl = ControlAdd(Path, CLSID, ProgID, Name, Container)

Чтобы не было вопросов - ProgID передается в функцию если например в нужной библиотеке нет tlb, тогда, чтобы потом использовать стандартный Controls.Add формы можно было писать этот псевдо-ProgID.
UA6527P

VisualFreeBasic
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 14.02.2021 (Вс) 20:28

Re: Использование OCX без регистрации

Сообщение VisualFreeBasic » 16.02.2021 (Вт) 19:52

use api :MemoryGetProcAddress,CoGetClassObject or ole.tlb (classfactroty

VisualFreeBasic
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 14.02.2021 (Вс) 20:28

Re: Использование OCX без регистрации

Сообщение VisualFreeBasic » 16.02.2021 (Вт) 20:01

Код: Выделить всё
FORM1:
Dim ExcelApp As Object
Private Sub Command1_Click()
    Set ExcelApp = CreateObject("excel.application")
    Advise ExcelApp
    ExcelApp.Visible = True
    ExcelApp.WorkBooks.Add
End Sub


BASE FILE:
Код: Выделить всё
Option Explicit

Type CSink
    Interfaces As Long
    RefCount As Long
    EventIID As UUID
End Type

Private IID_IUnknown As UUID
Private IID_IDispatch As UUID

Dim vtable(0 To 6) As Long

Private Function EventSink_QueryInterface(This As CSink, RIID As UUID, lObj As Long) As Long
    On Error GoTo ErrLine
    If IsEqualGUID(RIID, IID_IUnknown) Then
        lObj = VarPtr(This)
        This.RefCount = This.RefCount + 1
    ElseIf IsEqualGUID(RIID, IID_IDispatch) Then
        lObj = VarPtr(This)
        This.RefCount = This.RefCount + 1
    ElseIf IsEqualGUID(RIID, This.EventIID) Then
        lObj = VarPtr(This)
        This.RefCount = This.RefCount + 1
    Else
        lObj = 0
        EventSink_QueryInterface = E_NOINTERFACE
    End If
ErrLine:
End Function

Private Function EventSink_AddRef(This As CSink) As Long
    This.RefCount = This.RefCount + 1
    EventSink_AddRef = This.RefCount
End Function

Private Function EventSink_Release(This As CSink) As Long
    This.RefCount = This.RefCount - 1
    EventSink_Release = This.RefCount
    If This.RefCount = 0 Then GlobalFree VarPtr(This)
End Function

Private Function EventSink_GetTypeInfoCount(This As CSink, pctinfo As Long) As Long
    pctinfo = 0                                                                 ' Not implemented
    EventSink_GetTypeInfoCount = E_NOTIMPL
End Function

Private Function EventSink_GetTypeInfo(This As CSink, ByVal iTInfo As Long, ByVal lcid As Long, ppTInfo As Long) As Long
    ppTInfo = 0
    EventSink_GetTypeInfo = E_NOTIMPL
End Function

Private Function EventSink_GetIDsOfNames(This As CSink, RIID As UUID, rgszNames As Long, ByVal cNames As Long, ByVal lcid As Long, rgDispId As Long) As Long
    EventSink_GetIDsOfNames = E_NOTIMPL
End Function

Private Function EventSink_Invoke(This As CSink, ByVal dispIdMember As Long, RIID As olelib.UUID, ByVal lcid As Long, ByVal wFlags As Integer, ByVal pDispParams As Long, ByVal pVarResult As Long, pExcepInfo As olelib.EXCEPINFO, puArgErr As Long) As Long
    Dim a() As Variant
   
    OnEvent dispIdMember
    EventSink_Invoke = S_OK                                                     ' This method never fails
End Function

Private Function AddrOf(ByVal Add As Long) As Long
    AddrOf = Add
End Function
Private Function OnEvent(ByVal dispIdMember As Long) As Long
    Form1.List1.AddItem "事件ID:" & dispIdMember
End Function
Public Function CreateSink(EventIID As UUID) As Object
    Dim lEventSinkPtr As Long, lOldProt As Long
    vtable(0) = AddrOf(AddressOf EventSink_QueryInterface)
    vtable(1) = AddrOf(AddressOf EventSink_AddRef)
    vtable(2) = AddrOf(AddressOf EventSink_Release)
    vtable(3) = AddrOf(AddressOf EventSink_GetTypeInfoCount)
    vtable(4) = AddrOf(AddressOf EventSink_GetTypeInfo)
    vtable(5) = AddrOf(AddressOf EventSink_GetIDsOfNames)
    vtable(6) = AddrOf(AddressOf EventSink_Invoke)
    Dim EventSink As CSink
    With EventSink
        .Interfaces = VarPtr(vtable(0))
        .RefCount = 1
        .EventIID = EventIID
    End With
    lEventSinkPtr = GlobalAlloc(GPTR, LenB(EventSink))
    If lEventSinkPtr Then
        MoveMemory ByVal lEventSinkPtr, EventSink, LenB(EventSink)
        MoveMemory CreateSink, lEventSinkPtr, 4
        CLSIDFromString IIDSTR_IUnknown, IID_IUnknown
        CLSIDFromString IIDSTR_IDispatch, IID_IDispatch
    Else
        Err.Raise 7, "CreateEventSink"
    End If
End Function

Sub Advise(EventObject As Object, Optional SourceIID As String)
    On Error GoTo ErrLine
    Dim oCPC As IConnectionPointContainer
    Dim oEnm As IEnumConnectionPoints
    Dim oCP As IConnectionPoint
    Dim oUnk As olelib.IUnknown
    Dim tIID As UUID
    Dim lCookie As Long
    Set oCPC = EventObject
    If LenB(SourceIID) = 0 Then
        Set oEnm = oCPC.EnumConnectionPoints
        oEnm.Next 1, oCP
        oCP.GetConnectionInterface tIID
    Else
        CLSIDFromString SourceIID, tIID
        Set oCP = oCPC.FindConnectionPoint(tIID)
    End If
    Set oUnk = CreateSink(tIID)
    lCookie = oCP.Advise(oUnk)
    Exit Sub
Disconnect:
    oCP.Unadvise lCookie
ErrLine:
End Sub



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

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

Сейчас этот форум просматривают: Yandex-бот и гости: 44

    TopList  
cron