Сейчас на форуме: zds, UniSoft (+5 невидимых)

 eXeL@B —› Программирование —› Вопрос про экспорт
Посл.ответ Сообщение

Ранг: 37.1 (посетитель), 11thx
Активность: 0.030
Статус: Участник

Создано: 26 января 2013 22:32
· Личное сообщение · #1

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




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

Создано: 26 января 2013 22:50 · Поправил: -=AkaBOSS=-
· Личное сообщение · #2

Promix_17 пишет:
распаковать эти данные уже после загрузки в память

и что тогда, по вашему, будет с файлами, у которых эта DLL находится в импорте?
конечно же -- "Не найдена точка входа в процедуру 'xxxx' в модуле 'yyyy'"

/ADD
просмотрел справку по юпиксу. нашел это
Code:
  1. --compress-exports=0 Don't compress the export section.
  2.                       Use this if you plan to run the compressed
  3.                       program under Wine.
  4.  
  5. --compress-exports=1 Compress the export section. [DEFAULT]
  6.                       Compression of the export section can improve the
  7.                       compression ratio quite a bit but may not work
  8.                       with all programs (like winword.exe).
  9.                       UPX never compresses the export section of a DLL
  10.                       regardless of this option.


причины, по которым он не трогает DLL, не объясняются, но указана причина, по которой была введена эта опция - совместимость с Wine. Может, в этом дело?



Ранг: 2.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 26 января 2013 22:57
· Личное сообщение · #3

Я изначально тоже думал, что наличие экспорта просто обязательно. Потом методом научного тыка выяснил, что в упакованном файле наличие экспорта не нужно. Главное - чтобы экспорт был в файле после его загрузки. Все равно GetProcAddress работает с загруженным образом, а не файлом на диске.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 26 января 2013 23:27
· Личное сообщение · #4

Да это ж проверяется экспериметом за 5 минут. Берём пару ехе + dll, такую, чтоб была статическая линковка, в длл трём таблицу экспорта, а на DllMain лепим вызов мессаджбокса. Запускаем ехе - видим мессадж?

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 65.3 (постоянный), 10thx
Активность: 0.020
Статус: Участник

Создано: 27 января 2013 04:59
· Личное сообщение · #5

ARCHANGEL
Отрицательный результат получим - будем знать всё. Если месседжбокс будет, еще неизвестно, смапится ли функция на динамический экспорт. (Типа, если винда делает LoadLibrary->GetProcAddress, то LoadLibrary даст месседжбокс, а вот GetProcAddress может обломаться).

Вообще, вопрос интересный. В 5 утра не осилю написать тест, но если завтра никто не сделает, напишу тест ближе к ночи.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 27 января 2013 09:46
· Личное сообщение · #6

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

| Сообщение посчитали полезным: vnekrilov

Ранг: 2.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 27 января 2013 15:43
· Личное сообщение · #7

По поводу ручной загрузки: если файл упакован, а точка входа вызываться не будет при загрузке, то толку от экспорта мало - код экспортируемых функций тоже будет упакован и вызывать их просто нельзя. Максимум, что можно извлечь из экспорта без вызова точки входа в упакованном файле - просто получить адреса функций. Но толку от них? Т.е. это очень очень специфическая ситуация, когда экспорт в упакованной длл лучше оставлять.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 27 января 2013 16:27
· Личное сообщение · #8

А кто сказал, что они обязательно будут вызываться. Вызов сразу экспорта без вызова точки входа несколько нелогичен. А посмотреть на присутствие функций в экспорте могут вполне. Типа перечислить файлы в директории и поглядеть, какие из них экспортируют плагинные функции, скажем, чтобы составить список плагинов для юзера. А полноценно уже грузить, когда юзер ткнёт на конкретном плагине.
Да, возможно, вариант не часто используется. Но могут быть и другие аналогичные варианты. Чтобы не удивлялись, когда длл отвалится после упаковки.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 27 января 2013 17:08
· Личное сообщение · #9

tomac пишет:
Типа, если винда делает LoadLibrary->GetProcAddress, то LoadLibrary даст месседжбокс, а вот GetProcAddress может обломаться

Само по себе - да, но расчёт на то, что внутри DllMain делается реконструкция экспортов.

Archer пишет:
И в любом случае это не спасёт от ситуаций, если кто-то мапит руками или через апи без вызова точки входа и потом ожидает нормальный экспорт.

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

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 199.6 (ветеран), 12thx
Активность: 0.10
Статус: Участник
www.uinc.ru

Создано: 30 января 2013 04:09
· Личное сообщение · #10

Некоторый резон не паковать экспорты таки есть. Я сталкивался с косяками. Какая-то из старых виндов (до XP) сначала чекала экспорт, а потом уже тягала DllMain. Скорее всего это было Win2k - оно вообще адово придиралось к исполнимым файлам. Причем в позу вставало вроде не всегда, а только в некоторых случаях (типа это COM dll и регается через RegSvr). Проще оказалось не паковать экспорт, чем разобраться с этим днищем. Продробностей не помню, извиняйте, это было 12 лет назад, когда я делал свой первый пакер.
С другой стороны сейчас это скорее всего уже не актуально, и всё взлетит и с пожатым экспортом. В то время всё через задницу работало, даже .NET с диска себя тупо перечитывал - патчи в памяти сколько хочешь, но исполняться будет то, что на диске


 eXeL@B —› Программирование —› Вопрос про экспорт
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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