Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Импрот функций из exe. [D6]


Страницы:   1 2 3 4 5 6

Тимохов ©   (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 Вышлите, пожалуйста, еще мне ваш тестовый исходник :)


Страницы:   1 2 3 4 5 6

Наверх

Титульная страница Поиск, карта сайта Написать письмо