· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Как получить EXE&DLL в одном флаконе?

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Авг 8, 2004 11:30:08

Возможно ли ли сделать так, чтобы файл можно было запустить, а кроме того подгрузить как DLL в другой процесс? Если программу компилировать как DLL, то её не удается запустить, а если как EXE то при загрузке функцией LoadLibrary не обрабатываются релоки и не вызывается DllMain(он же WinMain). Может его загружать нужно как то хитро или в заголовке чего подправить?


Дата: Авг 8, 2004 12:10:57 · Поправил: Toxic

„Если программу компилировать как DLL, то её не удается запустить“
А если через rundll32.exe?


Дата: Авг 8, 2004 12:23:14

Toxic
Не, через rundll не пойдет, прога должна сама себя внедрить в чужой процесс, только вот самому релоки настраивать или таскать с собой отдельную dll очень не хочется.


Дата: Авг 8, 2004 12:41:55

Вроде можно.
Эту тему когда-то обсуждали на reversing'е, но я как-то ее искал - не нашёл, наверно сгинула в старой базе времён артуриков. Может стоит задать вопрос здесь


Дата: Авг 8, 2004 16:10:18

imho, достаточно установить флаг
IMAGE_FILE_DLL в IMAGE_FILE_HEADER::Characteristics


Дата: Авг 8, 2004 17:09:48

я как-то делал такие файлики, но сталкнулся с проблемой запаковки. файлы либо не паковались вообще, либо потом криво работали. (в непакованном виде всё было как надо)


Дата: Авг 8, 2004 23:27:39

green
IMAGE_FILE_DLL если этот флаг установлен то в w2k программу не запустить как exe.

Corpse
А можешь поделится таким файликом?


Дата: Авг 9, 2004 00:35:30

mamaich ================================================================
"я в молодости проспорил бутылку коньяка как раз когда разбирался с возможностью ЕХЕ-файла быть одновременно и ЕХЕшкой, и DLL-кой. При этом у него оказывались две разные точки входа - одна когда он запускался как обычный ЕХЕ, а вторая вызывалась когда его грузили по LoadLibrary. Могу подробнее рассказать.
----------------------------------------------
короче там всё просто. Компиляешь прогу как обычный ЕХЕ (то есть у нее в РЕ-заголовке стоит флаг что она не является динамической библиотекой), но при этом оставляешь в ЕХЕшке релокейшены. Если ты ее запускаешь как просто ЕХЕ - вызывается та точка входа, которая прописана в заголовке как Entry Point (тобишь main/WinMain). Если ЕХЕшка грузится по LoadLibrary, то тут загрузчик мудрит. Он перебирает таблицу экспортов ЕХЕшки в поисках одной из процедур:
DllMain
_DllMain
_DllMain@12 (эти стопудово ищатся)
DllEntryPoint
_DllEntryPoint
_DllEntryPoint@12 (эти я не проверял)
и если такая функция существует - то она вызывается с соответствующими параметрами. В этом случае функция находящаяся по Entry Point не вызывается вообще. Если таких экспортов нету - то вообще никакая функция не вызывается. Как пример такой ЕХЕшки, которая может быть загружена как ДЛЛ - смотри файл %windir%\system32\npp\nppagent.exe. Это я все написал про 2К, есть ли такое в 9х - хз.
"
================================================================


Вот ещё по теме:

http://reng.ru/board/viewtopic.php?t=1109


Asterix, я в детстве марки собирал, а теперь грамотные посты :) Кстати, прикольно, этот пост mamaich'а как раз тому человеку и адресован.


Дата: Авг 9, 2004 00:52:27

Four-F
> Asterix, я в детстве марки собирал, а теперь грамотные посты :)

Сохраню-ка и я этот топик себе, раз не сделал это тогда :-)
Марки я не собирал, но вроде тоже запасливый всегда был, видимо просто тогда я не оценил практическую сторону применения этого метода ;-)


Дата: Авг 9, 2004 01:29:55 · Поправил: Asterix

Нихрена у меня не выходит, ни в мастдае, ни в 2k :-(
Не грузится как DLL, хотя в экспорте есть DllMain и у
файла есть релоки.


Дата: Авг 9, 2004 09:02:26

Вернее exe'шка то по LoadLibrary грузится, но DllMain не вызывается.


Дата: Авг 9, 2004 12:03:20

Вот, если кто-то хочет поэкспериментировать, исходники, может я что-то не правильно делал.. ?

197009582__dll_exe.rar


Дата: Авг 9, 2004 12:20:46

Asterix
Все у тебя правильно(потому что у меня точно так же ;) сделано, у меня тоже dllmain не вызывается.


Дата: Авг 9, 2004 12:59:46

мне кажется, есть основания предполагать, что если модуль уже загружен, то при загрузке его в другой процесс лоадер просто мапит страницу памяти с хедером в адресное простр. нового процесса. Если это так, то можно устанавливать этот флаг (IMAGE_FILE_DLL) уже после загрузки exe.


Дата: Авг 9, 2004 13:42:09

green
В случае если какая-либо страница была изменена она окажется в swap'е. Так что устанавливая у себя флаг на чужой процесс мы никак не повлияем.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.055