Получение адреса процедуры класса DLL в Delphi - PullRequest
0 голосов
/ 18 марта 2011

У меня есть файл DLL, из которого мне нужен адрес памяти процедуры класса.Я получаю дескриптор к файлу DLL, но когда я использую GetProcAddress, я не могу получить адрес процедуры.Я пробовал следующие строки для параметра имени процесса:

"ProcName"
"ProcClass.ProcName"
"ProcClass::ProcName"
"ProcInterface::ProcName"
"ProcInterface.ProcName"

Ни в одном из случаев я не получил адрес памяти процедуры.Я в основном уверен, что процедура является публичной.

Какой формат строки для этого?Было бы легче объявить функцию, указывающую на внешнюю процедуру, и получить адрес позже?Как это:

procedure ProcName(); stdcall; far; external 'Example.DLL';

ProcPointer := @ProcName;

Ответы [ 3 ]

5 голосов
/ 18 марта 2011

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

Используйте проводник PE для поиска экспортированных имен. Например, используйте проводник PE, доступный в GExperts . У меня есть пункт меню «Информация PE» в меню GExperts.

1 голос
/ 18 марта 2011

Вы находитесь на территории реинжиниринга здесь.

Я думаю, что на вашем месте я бы просто просмотрел представление CPU отладчика после вызова интересующего метода и нашел бы адрес точки входа. Я бы вычел это из базового адреса DLL, и это было бы смещением. Затем, чтобы вычислить адрес во время выполнения, вы просто добавляете смещение к базовому адресу библиотеки DLL в памяти в то время. Вы можете узнать базовый адрес с помощью вызовов LoadLibrary или GetModuleHandle.

Почему жесткий код смещения? Ну, так как вы не можете изменить свою DLL, она не выглядит слишком ограниченной. Если жесткое кодирование смещения не является жизнеспособным, то есть другие способы определения местоположения точек входа, но я должен признать, что я не самый большой в мире эксперт в этом.

Наконец, когда вы реализуете метод замены, вам нужно будет заменить его глобальной функцией / процедурой с дополнительным параметром, первым параметром, который заменяет Self.

0 голосов
/ 19 марта 2011

Возможно, я неправильно это читаю. Но мне кажется, что вы написали DLL.

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

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

Если кто-то написал dll на C ++ и экспортировал ее методы, вам придется изучить правила искажения имен в C ++.

...