Как из exe сделать dll

Обновлено: 04.07.2024

EXE не загрузится, как DLL с помощью LoadLibrary.
Для того, чтобы загрузить EXE, как DLL, необходимы три вещи:
1. Необходимо поставить соотв. флаг в PE-заголовке, что это DLL. Только тогда разрешится таблица импорта и секция релокаций.
2. Необходимо обнулить адрес EntryPoint, чтобы после загрузки управление не туда передалось.
3. EXE либо должен иметь таблицу релокаций, либо быть загружен по базовому адресу, что может быть затруднительным.

EXE не загрузится, как DLL с помощью LoadLibrary.
Для того, чтобы загрузить EXE, как DLL, необходимы три вещи:
1. Необходимо поставить соотв. флаг в PE-заголовке, что это DLL. Только тогда разрешится таблица импорта и секция релокаций.
2. Необходимо обнулить адрес EntryPoint, чтобы после загрузки управление не туда передалось.
3. EXE либо должен иметь таблицу релокаций, либо быть загружен по базовому адресу, что может быть затруднительным.

Что-то подобное я и предполагал. Но мне еще бы очень хотелось инструкцию о том, как это сделать, используя допустим IDA pro.

Если есть познания в ассемблере то почему бы и нет? Запускай иду, в режиме отладки ищи свою функцию, которую хочешь выловить, попутно анализируя, что она принимает и возвращает (стек). Именно на этом моменте расходуется больше всего времени. Как только чувствуешь, что что то нашол, пиши для себя комментарий! (очень полезно). Также, переименовывай метки в удобочитаемые, если таковые имеются в процедуре, которую нужно рипать, благо ида это позволяет. Как только осознал, что куда передаётся и что собственно процедура делает, выделяй нужный код, жми alt+f10 и сохраняй сорец. После неоднократной обработки и огранки напильником, можешь подцеплять его в свой проект.

Кстати, как отладчик IDA не очень одобна. Присмотрись к OllyDbg. Так же обрати внимание на HexRays, это декомпилятор, который может облегчить тебе твой труд

EXE не загрузится, как DLL с помощью LoadLibrary.
Для того, чтобы загрузить EXE, как DLL, необходимы три вещи:
1. Необходимо поставить соотв. флаг в PE-заголовке, что это DLL. Только тогда разрешится таблица импорта и секция релокаций.
2. Необходимо обнулить адрес EntryPoint, чтобы после загрузки управление не туда передалось.
3. EXE либо должен иметь таблицу релокаций, либо быть загружен по базовому адресу, что может быть затруднительным.

MSDN еще никто не отменял - Вот мой простой (проверенный) исходник который загружает EXE модуль (то чем реально пользуюсь сейчас выложить не могу - все на работе)

typedef DWORD (WINAPI *PExport)(void);

//
hExe = LoadLibrary("export.exe");
if( hExe )
printf("EXE load\n");
pExport = (PExport)GetProcAddress(hExe,"Example");
if( pExport )
printf("EXE get address\n");
printf("Export function return value - %d\n",pExport());
>

А вот исходник EXE из которого импортируется функция

DWORD WINAPI Example(void)
return 123;
>

При создании которого указывается что DWORD WINAPI Example(void) экспортируемая - и все замечательно работает.
Я подобным очень часто пользуюсь. Но для этого надо знать что экспортируется.

Буду писать максимально подробно, ибо дело очень срочное, сразу прошу прощения за возможные "грубейшие" ошибки из-за непонимания - не так давно работаю в си))

Итак, что имеем - проект, созданный в Visual Studio 6 с помощью MFC AppWizard (exe). Проект имеет структуру:
- Source Files / sig4.cpp ; sig4Dlg.cpp ; sig4.rc ; StdAfx.cpp
- Header Files / sig4.h ; sig4Dlg.h ; Resource.h ; StdAfx.h
- Resource Files / sig4.ico ; sig4.rc2

Задача: "Программа должна быть выполнена в виде процедуры, находящейся в какой-нибудь динамически подключаемой библиотеке."

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

Дальше: первое, что приходит в голову - создать новый проект посредством MFC AppWizard (dll).
Плучаем: - Source Files / DLLsig.cpp ; DLLsig.def ; DLLsig.rc ; StdAfx.cpp
- Header Files / DLLsig.h ; Resource.h ; StdAfx.h
- Resource Files / sig4.rc2


А теперь задам вопросы списком:

1) Где в длл информация о расположении окон, кнопок и т.п. т.е того, что я могу визуально редактировать в случае ехе проекта кликнув по sig4.rc->dialog

2) Основной код моей программы находится в sig4Dlg.cpp. Большая часть процедур в нем - реакция на нажатия кнопок на форме. Как это должно выглядеть в проекте длл ?

3) При создании ехе проекта в sig4Dlg.cpp уже имеется некоторый код, в том числе функции BOOL Csig4Dlg::OnInitDialog() и void Csig4Dlg::OnPaint()
В OnPaint у меня имеется код такого вида:

Где переменным xa1, ya1 и т.д. начальные значения присваиваются в OnInitDialog (впрочем, это не важно - можно их и здесь заранее задать)

Как это реализовывается в проекте длл-ки?


Если собраться все в кучу, то имеется один глобальный вопрос - что и куда перекинуть из ехе проекта в длл проект так, чтобы оно работало?

String не обязательно AnsiString может быть и ShortString (из кода не видно)

Обычным образом. Точно так же как и из DLL.

Но, повторяю, в общем случае работать эта схема не будет.

Вот пожалуйста абсолютно рабочий код для dll

function Exprt(s:PChar):PChar;Export;
begin
Result:=PChar(s+" Exports")
end;

procedure TForm1.Button1Click(Sender: TObject);
var es:String;
begin
es:=Exprt("Call");
Memo1.Lines.Add(es);
end;

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

Но импорт процедуры и собственно вызов/исполнение импортируемой процедуры - две разные разницы.

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

Из опыта работы на D6 всегда из библиотеки возвращал строки как PChar
пока библиотека в памяти никогда AV не возникала. Может я везунчик :))

Потому что исполняемый файл представляет собой точно такой же PE-модуль, как и DLL.

Чтобы не быть голословным по поводу "определенных" случаев, когда "это" гарантированно работает, предлагаю экспортировать/импортировать/вызвать следующую процедуру:

> для чего сделали возможным ЭКСПОРТИРОВАТЬ функции в исполняемом
> (exe) файле. :((((

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

> качестве параметра адреса функции, находящейся в EXE (с
> точки зрения DLL такие функции являются

У длл не должно быть своей точки зрения, бо в чужой
монастырь со своим уставом не лезут.

2All: Хочется повториться: длл - это рудиментарная форма
технологии клиент-сервер в условиях дефицита ресурсов.

Не мучайте старушку, в конце-концов.

Да что ты говоришь !?) А мужики-то и не знают))..

Да, действительно, я был не прав - в D7 флаг IMAGE_FILE_RELOCS_STRIPPED по умолчанию не установлен, и соответственно RT по умолчанию генерируется.

Читайте также: