Нужно создать PE-файл, который: 1. Будет обычный Win32-приложением. 2. Будет экспортировать пару функций. Теоретически все несложно — экспорт сделал, генерацию релоков включил... Но не работает. При вызове экспортируемой функции падает. Судя по тому что видно в отладчике -- ссылки на глобальные переменные и на элементы таблицы импорта не релокейтятся. Может кто подскажет где грабли? Компилятор VS2005 SP1.
в опции линкера добавь /FIXED:NO тогда он сгенерит екзешник с релоками, вот только я не понял, причём тут они, или ты этот екзешник через LoadLibrary грузишь? =)
/FIXED:NO уже давно установлено, экзешник генерится с релоками, секция .reloc есть. Да, гружу через LoadLibrary(). Симптомы описаны выше.
Если через LoadLibrary, то должен быть DllMain. А у неё 3 параметра, в отличие от обычной точки входа. С другой стороны, можно забить на параметры EP у ехе - ведь есть ExitProcess. Сейчас только заметил, что если в PE не стоит флаг длл, то DllMain не вызывается (и вроде как и релоки с импортом не обрабатываются). С другой стороны, если стоит - нельзя запустить как exe. Так что "dual" PE трудновато будет сделать; кстати, на форуме уже велись большие обсуждения по этой теме.
отнюдь. более того, dll_main и точку входа ехе можно разделить если экспорт небольшой, надежнее применить базонезависимый код, что позволит избежать релоков
Да, гружу через LoadLibrary() Попробуй LoadLibyaryEx с флагом 1 Код (Text): push 1 push 0 push offset [LibName] call [LoadLibraryExA] В таком случае пробежки по длл_маин не будет
это DONT_RESOLVE_DLL_REFERENCES, тогда не только WinMain вызываться не будет, он и не будут подгружаться библиотеки, из которых загружаемая что-то импортирует
Four-F спасибо. Найденные материалы по теме позволяеют сделать вывод, что система при загрузке .exe по LoadLibrary() не применяет fixup'ы. Т.е. образ файа грузится, GetProcAddress() возвращает указатели на функции, но попытка вызова функции из таблицы импорта или доступа к статическим переменным вызывает падение программы. Решения я вижу два: либо вруную перебазировать образ после загрузки, либо писать базо-независимый код. мне, к сожалению, оба варианта не подходят
А толку? Системе ты объяснишь, что они разделены? Я попробовал. Если стоит флаг длл, вызывается ОЕР, невзирая на экспортируемую ЕР для длл. Если не стоит, вообще не вызывается. Хотя и видел длл с явным экспортом вида DllMain.
flankerx Попробуй собрать с релоками и упаковать чем-нибудь, что релоки обработает. Почти любой пакер это сделать сможет. Если не найдёшь обращайся дам свой, но он глючный пока, может и не сработать.
Вот мой пакер. Только сомнения у меня большие по его поводу - там управление через тлс получается. Будут ли tls callback при LoadLibrary вызываться я не проверял. flankerx Отпишись когда проблему решишь до конца ок?
asd я пока для себя решил сделать так: из .exe буду экспортировать не одну, а две функции -- одну нужную мне для функционала и одну для "ручного" применения релоков. Т.е. перед вызовом основной экспортируемой функции буду вызывать вспомогательную, которая настроит экспорты, релоки и т.п. Заморачиваться с пакерами неохота, т.к. программа будет собираться под 64-битную ОС... неохота лишних проблем =)
Эта версия пакера, как оказалось, обнуляет указатель на таблицу экспорта. В аттаче с сохранением экспорта. Проще всего упаковать, если есть подходящий пакер. Фактически упаковщик долщен сделать вот это: invoke CorrectReloc, esi, esi invoke BuildImport, esi вместо тебя. К тому же это не очень удобно, не факт что ехе, который будет загружать твой ехе, пишется тобой. yuzvir Сейчас быстренько проверил, что-то не вышло. Пакую своим пакером ехе - он запускается. Ставлю dll флаг, гружу по LoadLibrary - в ольке брякаюсь на нераспакованной точке входа -> callback не вызывался. Может ещё чего поставить?
Был неправ. При LoadLibrary TlsCallBack вообще не срабатывает, а вот если библиотека уже прописана в импорте, то срабатывает сначала он, потом LibMain. Тестировал на своих файлах, а не на пакере