Ответы пользователя по тегу C++
  • Возможно ли узнать сигнатуру виртуального метода из рантайма?

    xomachine
    @xomachine Автор вопроса
    Сам спросил, сам нашёл решение (пусть и не универсальное)
    Можно с высокой долей вероятности успешно вычислить сигнатуру метода по глубине стека, на которую обращаются инструкции. Для этого потребуется дизассемблировать метод и отследить регистры связанные со стеком.
    Рабочий прототип отслеживающей процедуры для моего случая можно найти тут. Прототип написан на Nim с использованием libopcode и libbfd из пакета binutils, который входит в большинство дистрибутивов линукс.

    На скриншоте результат подобного угадывания количества аргументов методов (CAdapterSteamClient017, справа) и (слева) кусок исходника, соответствующий данному классу. (надеюсь, Valve меня не забанят за публикацию скриншота с маленьким куском исходников)
    Как видно из скриншота, предсказанное количество аргументов соответствует реальному.
    5a4e980def378215372175.png
    Ответ написан
    Комментировать