отлавливаем конструктор базового класса (с++)

Discussion in 'Реверсинг' started by sn0w, 6 Sep 2023.

  1. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,296
    Reputations:
    327
    - если класс полиморфен - т.е. имеет хоть один виртуальный метод.
    короче, кратко. типичная последовательность действий в конструкторе:
    1) вызвать конструктор базового класса
    2) записать указатель VFT в самое начало блока выделенных данных
    3) вызвать конструктора всех мемберов класса
    4) если есть in-class инициализаторы (это когда внутри класса: class A{public: int m_A = 123; ....
    то применить их
    5) выполнить тело конструктора
    6) вернуться
    (пункты 1-4 относятся к области Constructor Member Initializer List и выполняются явно или неявно - но полюбому)

    когда мы динамически с помощью оператора new создаём экземпляр класса,
    то происходит следующее:
    сперва с помощью malloc выделяется память c sizeof этого класса (это кстати важно, чтобы дифференцировать разные классы)
    а затем уже вызывается сам конструктор. ему неявно передаётся этот поинтер. онже `this'.

    ну а теперь по схеме, если у нас уже хренкакой по иерархии потомок, конструктора вызывают друг друга вплоть до конструктора базового класса.
    а вот он первым осуществит запись указателя VFT в самое начало выделенного блока памяти.
    так что сразу после маллока, ставим бряк на запись вначало выделенного блока, и первый кто попадётся - будет конструктор базового класса.
    вот.

    конечно же проще всего постепить внутрь по коллам, но просто я иногда так это решаю,
    поскольку всё может быть настолько охрененно заинлайнено, что никаких коллов и не найдешь.
     
    #1 sn0w, 6 Sep 2023
    Last edited: 6 Sep 2023
    CyberTro1n likes this.