Сейчас на форуме: vsv1, Alf (+4 невидимых)

 eXeL@B —› Вопросы новичков —› Не могу добавить новую функцию в IAT
Посл.ответ Сообщение

Ранг: 10.7 (новичок), 2thx
Активность: 0.060
Статус: Участник

Создано: 21 июля 2015 16:12
· Личное сообщение · #1

Здравствуйте.

Есть mspaint.exe из Windows 7 SP1. Необходимо добавить в его IAT функцию ShellExecuteA из shell32.dll, которой там сейчас нет.

Для решения данной задачи я решил воспользоваться CFF Explorer (http://www.ntcore.com/exsuite.php).

Точный порядок действий, которые я проделал:
- Открыл mspaint.exe в CFF Explorer'е
- Открыл вкладку "Import Adder"
- Нажал на кнопку "Add" и выбрал shell32.dll из директории "%WINDIR%\System32"
- Нашёл среди отобразившихся функций ShellExecuteA и нажал на кнопку "Import By Name"
- Нажал на кнопку "Rebuild Import Table", после чего сохранил изменения в исполняемом файле

При последующем открытии того же самого PE-файла CFF Explorer сообщает следующую информацию во вкладке "Import Directory":



Посмотрев, по какому адресу загрузился модуль mspaint



, я глянул, что находится по адресу 0x00E90000 + 0x00617198 = 0x014A7198:



Как видите, адреса функции ShellExecuteA тут нет. Представление дампа выбрано корректно (Long - Address).

В чём может быть дело? Что я делаю не так?

Заранее благодарю.

Добавлено спустя 31 минуту
Что самое интересное, те же самые действия, проделанные на Windows XP, ведут к ожидаемому поведению (по указанному адресу действительно появляется адрес WinAPI-функции ShellExecuteA).




Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 22 июля 2015 00:08 · Поправил: -=AkaBOSS=-
· Личное сообщение · #2

глюк только конкретно с mspaint.exe, или вообще?
есть ли различие на виндовских-невиндовских файлах?

b0r3d0m пишет:
те же самые действия, проделанные на Windows XP, ведут к ожидаемому поведению

действия над тем же самым файлом?

если в cff explorer в ребилдере поставить галку bind import table, и выполнить ребилд, что будет?



Ранг: 10.7 (новичок)
Активность: 0.020
Статус: Участник

Создано: 22 июля 2015 01:35
· Личное сообщение · #3

b0r3d0m

Выкладывайте измененный файл.



Ранг: 10.7 (новичок), 2thx
Активность: 0.060
Статус: Участник

Создано: 22 июля 2015 10:38
· Личное сообщение · #4

-=AkaBOSS=- пишет:
глюк только конкретно с mspaint.exe, или вообще?

Проверил только что на notepad.exe -- результат тот же самый.

-=AkaBOSS=- пишет:
есть ли различие на виндовских-невиндовских файлах?

Как ни странно, да. Только что проделал то же самое над fciv (https://www.microsoft.com/en-us/download/details.aspx?id=11533), и обнаружил, что по указанному в CFF Explorer'е адресу действительно находится адрес функции ShellExecuteA. Как такое вообще может происходить?

Dynamic пишет:
Выкладывайте измененный файл.

Оригинальный бинарник -- http://rghost.net/76Jbf5x8B
Бинарник после проделанных изменений -- http://rghost.net/8lfSmsZqk

Добавлено спустя 15 минут
-=AkaBOSS=- пишет:
действия над тем же самым файлом?

Да, разумеется.

-=AkaBOSS=- пишет:
если в cff explorer в ребилдере поставить галку bind import table, и выполнить ребилд, что будет?

То же самое.




Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 22 июля 2015 16:14 · Поправил: -=AkaBOSS=-
· Личное сообщение · #5

Собственно, всё как я и предполагал
Суть механизма такова: IMAGE_IMPORT_DESCRIPTOR содержит поля FirstThunk и OriginalFirstThunk.
В большинстве случаев, они указывают на абсолютно идентичные массивы IMAGE_THUNK_DATA. Но в виндовых модулях, где все файлы взаимосвязаны друг с другом и не ожидают смены окружения, используется такая фича как bound import.
Директория связанного импорта содержит имена импортируемых модулей и таймштампы их компиляции. При этом, массив на который указывает FirstThunk, уже содержит абсолютные виртуальные адреса функций. Загрузчику остаётся только поправить дельта-смещение, если модуль загрузился по другому адресу, и всё. Если же загрузчик обнаружит, что таймштамп загружаемой длл не соответствует таймштампу связанной длл, тогда он будет разбирать то, на что указывает OriginalFirstThunk.

Тоесть, импортируя функцию из связанной длл, нужно либо удалить эту длл из директории bound import, либо руками вписать виртуальные адреса в таблицу на которую указывает FirstThunk.

Порекомендую прочитать вот это (там в самом конце статьи нужное описание).

| Сообщение посчитали полезным: b0r3d0m, Dynamic, elch
 eXeL@B —› Вопросы новичков —› Не могу добавить новую функцию в IAT
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати