Перехват не-виртуальной функции-члена класса

0

Мне удалось привязать все, что я хотел (функции API, виртуальные методы, "стандартные" функции), но мне интересно, как подключить функцию (метод), не являющуюся виртуальным классом. Чтобы подключить виртуальный метод, вам просто нужно получить VTable и исправить его (или скопировать, изменить и изменить VPointer). Однако, когда метод НЕ является виртуальным, VTable не существует.

Прежде всего, как я могу получить адрес метода, который я хочу связать с его именем? Я не могу использовать GetProcAddress() поскольку функция не экспортируется. Кажется, что единственный способ поиска байтового шаблона в памяти, соответствующей функции. Затем, как только я получил адрес, как мне его перехватить? Использование базового метода (JMP)? Что делать, если я хочу подключить только один экземпляр? Я думаю, что я проверю свою функцию подключения: если это правильный экземпляр, тогда сделайте то, что нужно сделать, иначе просто выполните его, не делая ничего другого.

На самом деле я ищу лучшие решения, потому что думаю, что те, что были выше, будут работать, но они не очень "опрятные", не так ли?

Спасибо.

  • 0
    Я немного знаю о WinAPI но вы можете взять адрес функции-члена, используя синтаксис &ClassName::member_name .
  • 0
    Допустим, ClassName не является частью библиотеки, которую я могу #include в моей DLL (которую я хочу добавить), но вместо этого это класс, определенный в программе, которую я хочу подключить: я не могу написать &ClassName:member_name в моей DLL, я получу ошибку компиляции.
Теги:
hook

1 ответ

1
Лучший ответ

В большинстве случаев просто невозможно отменить статически разрешенную функцию. Вы когда-нибудь слышали об этой оптимизации, называемой inlining? Даже когда этого не происходит, COMDAT-фальцовка может сделать выделение вашей интересующей функции совершенно невозможной.

Настоятельно рекомендуется читать: Раймонд Чен: "Почему отладчик показывает мне неправильную функцию?"

  • 0
    Что вы подразумеваете под «статически разрешаемой функцией»? Да я забыл про встраивание ... ты прав, это может быть проблематично. Что касается COMDAT-свёртывания, скажем, на функцию ссылаются в программе, поэтому она не была удалена компоновщиком (я бы не перехватил функцию, которая не используется?). Тогда как бы вы продолжили подключать эту функцию, если она не была встроена?
  • 1
    @GuiTeK: Статически разрешаемое означает, что компилятор решает (решает), что именно вызывается во время компиляции. Это включает в себя все вызовы именованной не виртуальной функции. Виртуальные функции и вызовы через указатели функций могут быть статически или динамически разрешены, в зависимости от того, может ли компилятор определить точный тип.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню