![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Импрот функций из exe. [D6]
Тимохов © (2004-06-29 11:44:00)Прочел тут как-то, что импортировать функции можно не только из dll, но и из других exe. Попробовал сделать динамической загрузкой, получилось :)) Я сделал один dpr, даже без begin и end, т.е. одна функция и секция exports.
Вопросы:
1. Что происходит при загрузке exe череp LoadLibrary? Для dll, если не ошибаюсь вызывается стартовая функция библиотеки с соответствующим флагом, что-то типа dllproc process_attach (на память не помню). Что вызывается для exe? У него вроде нет такой функции.
2. Почему у меня не сработал такой код в библиотеке
procedure f();
begin
MessageBox(0, 'text', 'caption', MB_OK);
end;
При вызове f из другого приложения впесто текстов получается ерунда (т.е. случайная область памяти).
И совершенно нормально сработал такой
procedure f();
var
kText: packed array[0..4] of char;
kCaption: packed array[0..7] of char;
begin
kText[0] := 't';
kText[1] := 't';
kText[2] := 't';
kText[3] := 't';
kText[4] := #0;
kCaption[0] := 'c';
kCaption[1] := 'a';
kCaption[2] := 'p';
kCaption[3] := 't';
kCaption[4] := 'i';
kCaption[5] := 'o';
kCaption[6] := 't';
kCaption[7] := #0;
MessageBox(0, @kText, @kCaption, MB_OK);
end;
В последнем случае все вывелось корректно.
(2004-08-09 11:16:00) [1]Удалено модератором
Игорь Шевченко (2004-07-27 21:52:00) [2]-SeM- (27.07.04 18:24) [109]
tdump exe_file
tdump dll_file
сравниваем поле Flags (вторая строчка сверху в разделе Portable Executable header)
Флажок с значением 0x2000 и есть признак DLL или не DLL
-SeM- (2004-07-27 18:24:00) [3]Игорь Шевченко © (27.07.04 16:05) [107]
> При загрузке EXEшника без признака DLL
Какого-такого признака, подробнее можно? plz...
Piter (2004-07-27 18:15:00) [4]Игорь Шевченко © (27.07.04 16:05) [107]
Вредный ты. Вернулся.
ну если есть работа для настоящего профессионала - то надо его привлечь :)
Игорь Шевченко (2004-07-27 16:05:00) [5]Piter © (27.07.04 14:50) [105]
Вредный ты. Вернулся.
Кстати, с иходным проектом получается полная ерунда - если сменить ImageBase у EXE'шника, загружаемого, как DLL, то вместо одной работающей функции и одной неработающей получаются две вылетающие по AV функции :) Причина AV в некорректной таблице вызова импортируемых функций из загружаемого EXEшника.
Такое у меня ощущение возникает (могу ошибаться, конечно), что загрузчик производит настройку адресов только у DLL. При попытке обмануть загрузчик и сказать, что файл EXE является DLL'ю, он его честно загружает, начинает исполнять код точки входа (для EXEшника) и сталкивается с невозможностью инициализации кода двух EXEшников в адресном пространстве одного процесса (начинают выдаваться сообщения EOSError (System error. Code: 1410. Class already exists), то есть, была попытка вызова RegisterClass с одним и тем же именем несколько раз. При загрузке EXEшника без признака DLL это сообщение, разумеется, не появлялось, так как его стартовый код не выполнялся.
Мораль: нефиг импортировать функции из Exeшников, написанных на Delphi :)
pasha_golub (2004-07-27 15:37:00) [6]Классный вопрос, как я его сразу не заметил...
Piter (2004-07-27 14:50:00) [7]Вроде Игорь вернулся из отпуска... Может что скажет?
Serge_ (2004-07-25 14:59:00) [8]Я про переменные, а не про константы.
(2004-07-25 09:56:00) [9]Удалено модератором
Serge_ (2004-07-25 02:52:00) [10]Но при этом надо учитывать что переменные лежат в объекте кода,
который имеет флаг только чтение, что соответсвенно легко
сменить с помощью PEEditor...
Serge_ (2004-07-25 02:48:00) [11]procedure XXX;
begin
asm
@Start:
push ebx
Call @Begin
@Begin:
pop ebx
sub ebx,6
jmp @GOGO
@Hi:
db "Hi there mother fuckers!",0
@GOGO:
mov eax,offset @Hi
mov ecx,offset @Start
sub eax,ecx
add eax,ebx
push $40
push eax
push eax
push 0
call messagebox
pop ebx
end;
end;
exports XXX;
.......
Только так... потомучто там действительно адресс меняется,
значит надо его вычеслять ...
(2004-07-22 20:10:00) [12]Удалено модератором
Piter (2004-07-22 20:07:00) [13]ФИДО молчит...
(2004-07-19 11:06:00) [14]Удалено модератором
jack128 (2004-07-18 21:16:00) [15]
> Главное, чтобы все EXE имели разные базовые адреса, а DLL,
> если че, пересчитает релоки :)
:-) Ага, как только ты придумаешь способ обеспечить это требование, так сразу и наступит рай на земле ;-)
Piter (2004-07-18 20:49:00) [16]Тимохов, если не против - я отправлю твой вопрос в FIDO - ответы могу кидать сюда. да ты и сам можешь их читать через talk.mail.ru. Как считаешь?
(2004-07-16 11:45:00) [17]Удалено модератором
Ertong (2004-07-16 11:43:00) [18]
> А если я буду использовать еще одну dll'ку с таким же базовым
> адресом?
Главное, чтобы все EXE имели разные базовые адреса, а DLL, если че, пересчитает релоки :)
P.S. А вообше вы правы - это не универсальный метод.
jack128 (2004-07-16 11:29:00) [19]
> Попробуйте в EXE(тот что типа DLL) написать:
> {$IMAGEBASE $40000000}
это заглушка. А если я буду использовать еще одну dll'ку с таким же базовым адресом?
Ertong (2004-07-16 09:26:00) [20]Попробуйте в EXE(тот что типа DLL) написать:
{$IMAGEBASE $40000000}
----------cut----------------------
When Windows succeeds in loading a DLL (or package) at its image base address, the load time is decreased because relocation fix-ups do not have to be applied.
----------cut----------------------
PS Вышлите, пожалуйста, еще мне ваш тестовый исходник :)