Вызовите функцию в C++ dll без заголовка

Пожалуйста, имейте в виду, что виджет Google Maps является предварительным просмотром разработчика, в версии 0.2. Многие вещи и способности, вероятно, изменятся в ближайшие месяцы.

14
задан Amro 13 August 2013 в 16:33
поделиться

6 ответов

Возможно выяснить подпись функции C путем анализа beginnig ее дизассемблирования. Аргументы функции будут на стеке, и функция сделает, некоторые "появляются" для чтения их в обратном порядке. Вы не найдете имена аргумента, но необходимо смочь узнать их число и типы. Вещи могут стать более трудными с возвращаемым значением - это может быть через регистр 'eax', или через специальный указатель передал функции как последний псевдоаргумент (на вершине стека).

3
ответ дан 1 December 2019 в 10:19
поделиться

Если функцией является C++ один, Вы можете получать функциональную подпись из скорректированного имени. Walker зависимости является одним инструментом, который сделает это для Вас. Однако, если DLL был создан со связью C (Зависимость, Walker скажет Вам это), затем Вам не повезло.

10
ответ дан 1 December 2019 в 10:19
поделиться

Язык C++ ничего не знает о dlls.

Это находится в Windows? Один путь был бы к:

  • откройте dll в depends.exe поставленный с (Visual Studio)
  • проверьте подпись функции, которую Вы хотите вызвать
  • использовать LoadLibrary() для получения загружают этот dll (быть осторожным относительно пути)
  • использовать GetProcAddress() для получения указателя на функцию, Вы хотите звонить
  • используйте этот указатель на функцию для звонка с допустимыми аргументами
  • использовать FreeLibrary() выпускать дескриптор

BTW: Этот метод также обычно упоминается как динамическое подключение во время выполнения в противоположность динамическому подключению времени компиляции, где Вы компилируете свои источники со связанным lib файл.

Там существует, некоторый подобный механизм для *отклоняет с dlopen, но моя память начинает перестать работать после этого. Что-то позвонившее objdump или nm должны запустить Вас с осмотра функции (функций).

6
ответ дан 1 December 2019 в 10:19
поделиться

Поскольку Вы нашли, список экспорта в DLL только хранит имена, не подписи. Если Ваш DLL экспортирует функции C, необходимо будет, вероятно, демонтировать и перепроектировать функции для определения сигнатур методов. Однако C++ кодирует сигнатуру метода на имя экспорта. Этот процесс объединения имени метода и подписи называют "искажением имени". Этот вопрос Stackoverflow имеет ссылку для определения сигнатуры метода с искаженного имени экспорта.

Попробуйте свободную "Зависимость Walker" (иначе "зависит"), утилита. Опция "Undecorate C ++ Functions" должна определить подпись метода C++.

5
ответ дан 1 December 2019 в 10:19
поделиться

Если Вы действительно знаете или сильно подозреваете, что функция там, можно динамично загрузить DLL loadLibrary и получить указатель на функцию с getProcAddress. См. MSDN

Обратите внимание, что это - ручной, динамический способ загрузить библиотеку; необходимо будет все еще знать, что корректная функциональная подпись отображается на указатель функции, для использования его. AFAIK там не является никаким способом использовать dll в возможности времени загрузки и использовать функции без заголовочного файла.

1
ответ дан 1 December 2019 в 10:19
поделиться

Вызывание невнешних функций является отличным способом иметь Ваше повреждение программы каждый раз, когда третья сторона DLL обновляется.

Тем не менее undname утилита может также быть полезной.

1
ответ дан 1 December 2019 в 10:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: