Возможно ли в Delphi получить адрес функции/процедуры в другом процессе?

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

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


person fossilz    schedule 21.09.2010    source источник
comment
Я должен отметить, что функция/процедуры, которые я перехватываю, НЕ являются экспортируемыми функциями/процедурами.   -  person fossilz    schedule 21.09.2010


Ответы (4)


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

person Remko    schedule 21.09.2010
comment
Это звучит как самый логичный способ сделать это на самом деле. Я забыл о madDisasm. Я попробую. Спасибо за ответы! - person fossilz; 22.09.2010

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

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

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

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

person Rob Kennedy    schedule 21.09.2010

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

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

person Mason Wheeler    schedule 21.09.2010

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

person Tavi    schedule 22.09.2010
comment
Вы можете сделать это только для экспортированных функций, что, по словам Кдунлапмо, здесь не так. - person Rob Kennedy; 22.09.2010