Возможно ли в Delphi получить адрес функции / процедуры в другом процессе? - PullRequest
2 голосов
/ 21 сентября 2010

Я использую компоненты MadCodeHook от Madshi для внедрения DLL в процесс, а затем подключаю процедуру / функцию. Проблема в том, что каждый раз, когда выходит новая версия EXE-файла, адрес функций может меняться. В настоящее время я делаю это, используя Ollydbg и затем жестко кодирую адрес в DLL, которую я внедряю в процесс, это очень уродливо и небезопасно. Просто интересно, есть ли способ узнать определение процедуры, могу ли я сделать это динамически.

Обратите внимание, что это не для злонамеренных целей, я просто подключаю несколько процедур в целевом EXE-файле для целей регистрации.

Ответы [ 4 ]

4 голосов
/ 22 сентября 2010

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

3 голосов
/ 22 сентября 2010

Без сотрудничества с программой, которую вы подключаете, нет простого способа сделать то, что вам нужно.

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

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

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

0 голосов
/ 22 сентября 2010

если вы используете dll, вы можете использовать getprocaddress внутри dll для получения адреса функции

0 голосов
/ 22 сентября 2010

Это зависит. По умолчанию Delphi компилируется в машинный код. В большинстве случаев таких метаданных нет. (Многие люди считают, что это функция безопасности; она не позволяет людям делать именно то, что вы пытаетесь сделать здесь, что может быть использовано для злых целей.) Но любой метод с RTTI будет иметь свой адрес в таблицах RTTI , Сюда входят все опубликованные методы и все публичные методы (по крайней мере по умолчанию) в D2010 и Delphi XE. Эти таблицы RTTI можно прочитать, но для их поиска требуется много знаний низкого уровня.

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

...