.EXE и .DLL в одном флаконе

Тема в разделе "WASM.WIN32", создана пользователем flankerx, 14 янв 2007.

  1. flankerx

    flankerx New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    423
    Адрес:
    Moscow, Russia
    Нужно создать PE-файл, который:
    1. Будет обычный Win32-приложением.
    2. Будет экспортировать пару функций.

    Теоретически все несложно — экспорт сделал, генерацию релоков включил... Но не работает. При вызове экспортируемой функции падает. Судя по тому что видно в отладчике -- ссылки на глобальные переменные и на элементы таблицы импорта не релокейтятся.
    Может кто подскажет где грабли? Компилятор VS2005 SP1.
     
  2. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    в опции линкера добавь /FIXED:NO
    тогда он сгенерит екзешник с релоками, вот только я не понял, причём тут они, или ты этот екзешник через LoadLibrary грузишь? =)
     
  3. flankerx

    flankerx New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    423
    Адрес:
    Moscow, Russia
    /FIXED:NO уже давно установлено, экзешник генерится с релоками, секция .reloc есть.
    Да, гружу через LoadLibrary(). Симптомы описаны выше.
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Если через LoadLibrary, то должен быть DllMain. А у неё 3 параметра, в отличие от обычной точки входа. С другой стороны, можно забить на параметры EP у ехе - ведь есть ExitProcess.

    Сейчас только заметил, что если в PE не стоит флаг длл, то DllMain не вызывается (и вроде как и релоки с импортом не обрабатываются). С другой стороны, если стоит - нельзя запустить как exe. Так что "dual" PE трудновато будет сделать; кстати, на форуме уже велись большие обсуждения по этой теме.
     
  5. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    отнюдь.
    более того, dll_main и точку входа ехе можно разделить
    если экспорт небольшой, надежнее применить базонезависимый код, что позволит избежать релоков
     
  6. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    Да, гружу через LoadLibrary()
    Попробуй LoadLibyaryEx с флагом 1

    Код (Text):
    1.  
    2.     push 1
    3.     push 0
    4.     push offset [LibName]
    5.     call [LoadLibraryExA]
    В таком случае пробежки по длл_маин не будет
     
  7. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    это DONT_RESOLVE_DLL_REFERENCES, тогда не только WinMain вызываться не будет, он и не будут подгружаться библиотеки, из которых загружаемая что-то импортирует
     
  8. flankerx

    flankerx New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    423
    Адрес:
    Moscow, Russia
    Я вроде помню что такое обсуждение было, но найти не смог.
     
  9. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    http://reng.ru/board/viewtopic.php?t=1109
     
  10. flankerx

    flankerx New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    423
    Адрес:
    Moscow, Russia
    Four-F
    спасибо.

    Найденные материалы по теме позволяеют сделать вывод, что система при загрузке .exe по LoadLibrary() не применяет fixup'ы. Т.е. образ файа грузится, GetProcAddress() возвращает указатели на функции, но попытка вызова функции из таблицы импорта или доступа к статическим переменным вызывает падение программы.

    Решения я вижу два: либо вруную перебазировать образ после загрузки, либо писать базо-независимый код. мне, к сожалению, оба варианта не подходят :dntknw:
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    А толку? Системе ты объяснишь, что они разделены?

    Я попробовал. Если стоит флаг длл, вызывается ОЕР, невзирая на экспортируемую ЕР для длл. Если не стоит, вообще не вызывается. Хотя и видел длл с явным экспортом вида DllMain.
     
  12. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    flankerx
    Попробуй собрать с релоками и упаковать чем-нибудь, что релоки обработает. Почти любой пакер это сделать сможет. Если не найдёшь обращайся дам свой, но он глючный пока, может и не сработать.
     
  13. flankerx

    flankerx New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    423
    Адрес:
    Moscow, Russia
    Идея красивая )
    Попробовал UPX и ASPack -- не получилось.
     
  14. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    http://wasm.ru/forum/viewtopic.php?id=13377
     
  15. flankerx

    flankerx New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    423
    Адрес:
    Moscow, Russia
    Большое СПАСИБО всем откликнувшимся =)
    Буду разбираться!
     
  16. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Вот мой пакер. Только сомнения у меня большие по его поводу - там управление через тлс получается. Будут ли tls callback при LoadLibrary вызываться я не проверял.

    flankerx
    Отпишись когда проблему решишь до конца ок?
     
  17. yuzvir

    yuzvir New Member

    Публикаций:
    0
    Регистрация:
    20 май 2005
    Сообщения:
    97
    Я проверял. Если стоит флаг IMAGE_FILE_DLL то будут, а если не стоит, то не будут :dntknw:
     
  18. flankerx

    flankerx New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    423
    Адрес:
    Moscow, Russia
    asd
    я пока для себя решил сделать так:
    из .exe буду экспортировать не одну, а две функции -- одну нужную мне для функционала и одну для "ручного" применения релоков. Т.е. перед вызовом основной экспортируемой функции буду вызывать вспомогательную, которая настроит экспорты, релоки и т.п.

    Заморачиваться с пакерами неохота, т.к. программа будет собираться под 64-битную ОС... неохота лишних проблем =)
     
  19. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Эта версия пакера, как оказалось, обнуляет указатель на таблицу экспорта.
    В аттаче с сохранением экспорта.

    Проще всего упаковать, если есть подходящий пакер. Фактически упаковщик долщен сделать вот это:
    invoke CorrectReloc, esi, esi
    invoke BuildImport, esi
    вместо тебя.

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

    yuzvir
    Сейчас быстренько проверил, что-то не вышло. Пакую своим пакером ехе - он запускается. Ставлю dll флаг, гружу по LoadLibrary - в ольке брякаюсь на нераспакованной точке входа -> callback не вызывался. Может ещё чего поставить?
     
  20. yuzvir

    yuzvir New Member

    Публикаций:
    0
    Регистрация:
    20 май 2005
    Сообщения:
    97
    Был неправ. При LoadLibrary TlsCallBack вообще не срабатывает, а вот если библиотека уже прописана в импорте, то срабатывает сначала он, потом LibMain. Тестировал на своих файлах, а не на пакере