Вызов неэкспортированных функций в Win32 C ++ - PullRequest
2 голосов
/ 28 августа 2009

Как мне поступить с вызовом неэкспортированной функции в Win32 C ++?

Ответы [ 3 ]

6 голосов
/ 28 августа 2009

Вызвать неэкспортированные функции, которые определены в том же модуле (DLL / EXE), что и ваш код, легко: просто вызовите их, как любую другую функцию C ++. Очевидно, это не то, о чем вы спрашиваете. Если вы хотите вызывать неэкспортированные функции в другом модуле, вам нужно как-то узнать их адреса.

Один из способов сделать это - заставить первый модуль вызывать экспортированную функцию во втором модуле, который возвращает указатель на функцию. (Или: структура, содержащая указатели на функции, указатель на экземпляр класса и т. Д.) Шаблон фабрики Think.

Другой способ - экспортировать функцию регистрации из первого модуля и вызывать код инициализации второго модуля, передавая ей указатели на неэкспортированные функции вместе с некоторой идентифицирующей информацией. (Лучше также иметь соответствующую функцию отмены регистрации, которая вызывается перед выгрузкой второго модуля.)

Еще один способ - разбираться с символами отладки, используя dbghelp.dll. Это не было бы рекомендовано для реального приложения, потому что это потребовало бы распределения символов отладки и было бы чрезвычайно медленным, не говоря уже о чрезмерно сложном.

3 голосов
/ 28 августа 2009

Помимо ответа bk1e, есть еще один метод (также не рекомендуется).

  1. Получите относительный адрес этой функции в dll (например, через разборку). Это должно быть сделано вручную и перед компиляцией.
  2. В программе теперь вам нужно получить начальный адрес DLL в памяти (например, с помощью экспортированной функции и некоторых вычислений).
  3. Теперь вы можете напрямую вызывать эту функцию, используя относительный адрес функции + начальный адрес экспортируемой функции.

Я не рекомендую это все же. Он работает только на одной определенной версии этой DLL. Любая перекомпиляция и адрес могут измениться. Или эта функция больше не нужна и удаляется. Должна быть причина, почему эта функция НЕ экспортируется. В общем, вы пытаетесь заархивировать то, что автор библиотеки намеренно не хотел, чтобы вы делали, и большую часть времени это «зло».


Вы упомянули имя Ида. Это имя включает звездный адрес.

0 голосов
/ 11 сентября 2009

Нет двух способов, вам придется изучить разборку, чтобы выяснить, что помещается в стек и как оно используется для определения типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...