Найти инициализированный COM-объект в памяти?

Тема в разделе "WASM.WIN32", создана пользователем Rel, 9 апр 2020.

  1. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    Не особо шарю в COM, поэтому хочу спросить про такую вещь. Есть приложение, в контексте которого исполняется мой кодец, это приложение создало COM-объект для доступа к некоему ресурсу, в приложении прошла авторизация через этот COM-объект, и COM-объект (видимо внутри себя) хранит информацию об авторизации. Необходимо найти адрес, где существует этот конкретный экземпляр COM-объекта.

    Пробовал реализовывать через цепочку GetRunningObjectTable, IRunningObjectTable->EnumRunning, ... IRunningObjectTable->GetObject, объект находится, но проблема в том, что GetObject возвращает IUnknown от объекта и, когда я запрашиваю необходимый интерфейс, мне (судя по всему) возвращается новый объект, не содержащий в себе информации об авторизации пользователя. Либо я нахожу не тот COM-объект, о котором думаю, хотя GUID этих объектов совпадают. Есть какие-то еще варианты?
     
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    Наверное самый тупой из всех способов - взять адреса методов из нового экземпляра и сканированием памяти по ним найти нужный.
     
  3. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Можно похучить CoCreateObject/CoCreateObjectEx, но это естественно до создания экземпляра объекта надо делать.
    Через ObjectTable емнип находятся не все объекты и не всегда.
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    К сожалению мой кодец попадает в процесс уже после того, как объект был создан.
     
  5. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Вероятно не тот объект. Самый простой вариант узнать тот же самый объект - запросить любой интерфейс, отличный от IUnknown и сравнить.
    Объект также может быть зарегистрирован через CoRegisterClassObject. Можно в этом направление посмотреть.
    --- Сообщение объединено, 11 апр 2020 ---
    Найти объект можно несколькими способами - зависит от задачи. Если это какое-то специфичное приложение, то проще узнать где хранится ссылка и просто оттуда получать его. Если, как ты говоришь, у тебя есть доступ к vTable, то можно поставить бряки/похучить методы и ждать пока метод не будет вызван. Дале уже по первому аргументу найти адрес объекта. Но проще просто в отладчике один раз найти, если приложение фиксированное.
     
  6. khureshi

    khureshi New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2017
    Сообщения:
    4
    слышал, что для таких целей можно попробовать использовать comproxy object.
     
  7. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    Не совсем понял, о чем речь, можно поподробнее?
    --- Сообщение объединено, 16 апр 2020 ---
    Да, наверное можно так попробовать, спасибо за идею, не знаю, почему я об этом не подумал.
     
  8. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    958
    добавил бы, что ежели объект однотипный по ту сторону интерфейса запиливается, то и по размеру аллокациев в куче,
    аля как виндбг умеет:
    0:000> !heap -flt s 0n35
    _HEAP @ a70000
    HEAP_ENTRY Size Prev Flags UserPtr UserSize - state
    00a73ea8 0006 0000 [00] 00a73eb0 00023 - (busy)
    00a73ed8 0006 0006 [00] 00a73ee0 00023 - (busy)
    00a73f08 0006 0006 [00] 00a73f10 00023 - (busy)
    00a74c40 0006 0006 [00] 00a74c48 00023 - (busy)
    --- Сообщение объединено, 7 май 2020 ---
    а, исчё, по this, сразу после аллокации, первым запишет vfпоинтер CTOR самого базового класса , вот тащемта можно его сразу хукать и мониторить всех потом.
     
    Последнее редактирование: 6 май 2020