Внедрение ActiveX-DLL и подключение к ресурсам EXE

Тема в разделе "VB", создана пользователем Thetrik, 5 июл 2021.

  1. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    860
    Доброго времени суток!

    Данный пример содержит модуль инжекта ActiveX DLL в нужный поток процесса, а также показывает как подсоединится к работающему EXE и получить доступ к его VB.Global объекту. Это позволяет к примеру вызывать методы открытых форм/контролов/App и т.д.

    Модуль инжекта позволяет создавать объекты в других потоках и получать отмаршаленую ссылку - методы можно вызывать прямо из IDE. В примере запускается EXE и вызываются методы его формы:

    Код (Text):
    1.     If CreateProcess(StrPtr(App.Path & "\..\dummy\dummy.exe"), 0, ByVal 0&, ByVal 0&, 0, 0, ByVal 0&, 0, tSI, tPI) = 0 Then
    2.         MsgBox "CreateProcess failed"
    3.         Exit Sub
    4.     End If
    5.  
    6.    . . .
    7.  
    8.     Set cVBGetGlobal = CreateVBObjectInThread(tPI.dwThreadId, App.Path & "\..\dll\GetVBGlobal.dll", "CExtractor")
    9.     Set cForms = cVBGetGlobal.Forms
    10.  
    11.     Set frmMain = cForms(0)
    12.  
    13.     ' // Change back color of picturebox
    14.     frmMain.Controls("picTest").BackColor = vbRed
    15.  
    16.     ' // Draw line on picturebox
    17.     frmMain.Controls("picTest").Line (0, 0)-Step(100, 50), vbGreen, BF
    18.     frmMain.Caption = "Test"
    Сам код доступа к объекту VB.Global находится в ActiveX DLL, которая внедряется в процесс с помощью модуля инжекта. Вообще доработав логику можно еще дополнительно поизвлекать переменные и в модулях.

    Инжект работает следующим образом:
    • В память процесса для каждого нового потока записывается шеллкод. Каждый шеллкод имеет 2 типа данных: данные процесса (общие для всех потоков), данные потока;
    • Шеллкод запускается стандартно через CreateRemoteThread;
    • Если шеллкод запущен впервые в процессе то регистрируется новый класс окна для общения с основным кодом;
    • Ставиться хук WH_GETMESSAGE в нужном потоке и посылается сообщение-триггер;
    • Поток замораживается в ожидании обработки хука;
    • В процедуре хука, сразу снимается хук, инициализируется COM (CoInitialize) и создается окно для коммуникации;
    • Данное окно "живет" в нужном потоке и основное приложение может отправлять ему сообщения;
    • Для создания объекта отправляется сообщение WM_CREATEOBJECT;
    • Обработчик получая это сообщение, создает объект из DLL и делает маршалинг для передачи ссылки в другой процесс (CoMarshalInterface);
    • Основной процесс воссоздает данные маршалинга и вызывает CoUnmarshalInterface, получая ссылку на объект.

    Ссылка.
     
    __sheva740 нравится это.
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    А какие юзкейсы у этого? Типа из одного VB6 приложения манипулировать контекстом другого VB6 приложения?
     
  3. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    860
    Да, причем любого, без исходников. Ну и это как пример, внедрять можно абсолютно любую AX-либу, дергать объекты и вызывать их методы. Если объекты поддерживают IDispatch то можно хоть из скриптов их юзать.