Как найти адрес виртуального вызова функции в сборке? - PullRequest
3 голосов
/ 24 мая 2010

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

Я создал программу на c ++, которая показывает окно сообщения, затем открыл его с помощью Ollydbg и перешел к той части, где он вызывает MessageBoxW.

Адрес вызова MessageBoxW меняется каждый раз, когда я запускаю приложение, поскольку windows обновляет мою таблицу Imports, чтобы иметь правильный адрес MessageBoxW. Итак, мой вопрос: как мне найти виртуальные адреса MessageBoxW в моей таблице импорта, а также как я могу использовать это в ollydbg?

По сути, я пытаюсь создать в сборке кодовую пещеру, чтобы снова вызвать MessageBoxW. Однажды я довольно близко подошел к поиску исполняемого файла с помощью шестнадцатеричного редактора и нашел позицию вызова, и я думаю, что нашел виртуальный адрес. Но когда я вызываю этот виртуальный адрес в olly и сохраняю его в исполняемый файл, в следующий раз, когда я открыл его, вызов был заменен группой DB xyz (которая выглядела как виртуальный адрес, но почему удалили call?

Извините, если моя терминология отключена, так как я новичок в этом, поэтому я не совсем уверен, как назвать вещи.

Ответы [ 2 ]

2 голосов
/ 24 мая 2010

(ответ на комментарий к исходному сообщению)

Ах, нет, адрес, указанный в коде операции "вызов", относится к инструкции вызова. Однако для импортированных функций это, скорее всего, косвенный вызов (который считывает адрес функции из ячейки памяти).

На самом деле не существует «официального» / надежного способа получения адреса любой функции без доступа к сегменту импорта. Если вы исправляете определенный исполняемый файл, просто посмотрите на значения, которые Windows помещает в сегмент импорта. Если вы внедряете код из другого процесса, вы можете полагаться на тот факт, что адрес функции в системной DLL останется неизменным относительно адреса загрузки DLL. Также можно вручную найти и проанализировать сегмент импорта программы в памяти.

0 голосов
/ 05 августа 2015

1 - найти адрес окна сообщения в вашем исполняемом модуле. предположим, что ваш exe-файл - a1.exe

Исполняемые модули> выберите a1.exe> ​​нажмите ctrl + N и найдите адрес окна сообщения. предположим, что адрес 00402008

2 - используйте ff25 08204000 машинный код для вызова окна сообщения, но перед отправкой параметров и нажмите EIP для возврата.

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