Не особо шарю в COM, поэтому хочу спросить про такую вещь. Есть приложение, в контексте которого исполняется мой кодец, это приложение создало COM-объект для доступа к некоему ресурсу, в приложении прошла авторизация через этот COM-объект, и COM-объект (видимо внутри себя) хранит информацию об авторизации. Необходимо найти адрес, где существует этот конкретный экземпляр COM-объекта. Пробовал реализовывать через цепочку GetRunningObjectTable, IRunningObjectTable->EnumRunning, ... IRunningObjectTable->GetObject, объект находится, но проблема в том, что GetObject возвращает IUnknown от объекта и, когда я запрашиваю необходимый интерфейс, мне (судя по всему) возвращается новый объект, не содержащий в себе информации об авторизации пользователя. Либо я нахожу не тот COM-объект, о котором думаю, хотя GUID этих объектов совпадают. Есть какие-то еще варианты?
Наверное самый тупой из всех способов - взять адреса методов из нового экземпляра и сканированием памяти по ним найти нужный.
Можно похучить CoCreateObject/CoCreateObjectEx, но это естественно до создания экземпляра объекта надо делать. Через ObjectTable емнип находятся не все объекты и не всегда.
Вероятно не тот объект. Самый простой вариант узнать тот же самый объект - запросить любой интерфейс, отличный от IUnknown и сравнить. Объект также может быть зарегистрирован через CoRegisterClassObject. Можно в этом направление посмотреть. --- Сообщение объединено, 11 апр 2020 --- Найти объект можно несколькими способами - зависит от задачи. Если это какое-то специфичное приложение, то проще узнать где хранится ссылка и просто оттуда получать его. Если, как ты говоришь, у тебя есть доступ к vTable, то можно поставить бряки/похучить методы и ждать пока метод не будет вызван. Дале уже по первому аргументу найти адрес объекта. Но проще просто в отладчике один раз найти, если приложение фиксированное.
Не совсем понял, о чем речь, можно поподробнее? --- Сообщение объединено, 16 апр 2020 --- Да, наверное можно так попробовать, спасибо за идею, не знаю, почему я об этом не подумал.
добавил бы, что ежели объект однотипный по ту сторону интерфейса запиливается, то и по размеру аллокациев в куче, аля как виндбг умеет: 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 самого базового класса , вот тащемта можно его сразу хукать и мониторить всех потом.