Текущий архив: 2004.09.19;
Скачать: CL | DM;
Вниз
Импрот функций из exe. Найти похожие ветки
← →
SammIk © (2004-07-12 17:55) [80]
Из дизасма:
CODE:0044DBF4 public ExportFunctionWithStringConst
CODE:0044DBF4 ExportFunctionWithStringConst proc near
CODE:0044DBF4 push 0
CODE:0044DBF6 push 44DC08h<<<Конкретно компилер подвел нас, записал пуш статически((CODE:0044DBFB push 44DC08h<<<Тут тоже
CODE:0044DC00 push 0
CODE:0044DC02 call pMessageBoxA
CODE:0044DC07 retn
CODE:0044DC07 ; ---------------------------------------------------------------------------
CODE:0044DC08 db 68h ; h<<Наша HI
CODE:0044DC09 db 69h ; iС дугои функциеи дела проще
:
CODE:0044DBD0 public ExportFunctionWithCharArray
CODE:0044DBD0 ExportFunctionWithCharArray proc near
CODE:0044DBD0
CODE:0044DBD0 var_2 = byte ptr -2
CODE:0044DBD0 var_1 = byte ptr -1
CODE:0044DBD0
CODE:0044DBD0 push ecx
CODE:0044DBD1 mov byte ptr [esp+0], 68h
CODE:0044DBD5 mov [esp+3+var_2], 69h
CODE:0044DBDA mov [esp+3+var_1], 0
CODE:0044DBDF push 0
CODE:0044DBE1 lea eax, [esp+4]<<Тут переменные грузит из стека, динамически
CODE:0044DBE5 push eax
CODE:0044DBE6 lea eax, [esp+8]
CODE:0044DBEA push eax
CODE:0044DBEB push 0
CODE:0044DBED call pMessageBoxA
CODE:0044DBF2 pop edx
CODE:0044DBF3 retn
CODE:0044DBF3 ExportFunctionWithCharArray endp ; sp = -10h
___________________________________________А это вообще одельно
CODE:0044DBED call pMessageBoxAОн сначала кидает нас сюда:
CODE:00406D28 pMessageBoxA proc near ;
CODE:00406D28 ;
CODE:00406D28 jmp ds:MessageBoxA_0
CODE:00406D28 pMessageBoxA endpА потом джампаем сюда:
.idata:00450490 extrn MessageBoxA_0:dword ;
Таким образом, когда первую грузит вторая прога, то мы при вызове
CODE:0044DBED call pMessageBoxA
поподаем в адресное пространство вызывающеи проги, а не нашеи
псевдодлл.
А по этому адресу малоли чего может быть.
Лично у меня не работал ни первыи, ни второи вариант.
>>>Тоесть правильно что у тебя ацессвиол, это следствие того, что мы колимся в кудато-туда, а не туда куда надо))
Релоки есть, но мне надо про них скил поднять.
Потом скажу что релокают, а что нет))
← →
Тимохов © (2004-07-12 17:58) [81]
> Лично у меня не работал ни первыи, ни второи вариант.
у меня дома один работает, второй - нет.
А вот на работе также - оба не работают.
Перефразирую вопрос, чтобы не свести данный к топик к личной переписке
Как использоваться exe в качестве dll, загружая с помощью LoadLibrary?
← →
SammIk © (2004-07-12 18:26) [82]Дело в том, что загружается exe превосходно.
И адрес процедуры берет верно, и релоки добовляет(но странно как-то).
Разобрался с релоками, в таблице релоков есть ссылка на изменение
адресов:CODE:0044DBF6 push 44DC08h<<<Конкретно
CODE:0044DBFB push 44DC08h<<<Тут тоже
И больше, в интересующеи нас области данных, ничего не релокируется!?!? Ни вызовы, ни что!!
По идее еще надо это релокать:CODE:0044DBED call pMessageBoxA
Но не релокается.
--------------------------------
Так же, глядя в дебагере, ось не исправляет адреса(!?!?!?) хотя они(релоки, фиксапы[как ни называи]) есть!
--------------------------------
Вообщем эта история требует детального изучения)))
Я бы пока не советовал юзать exe как длл, но никто не запрещает.
НО при условии, что не будет вызова других ф-ии
← →
Тимохов © (2004-07-12 18:57) [83]
> Я бы пока не советовал юзать exe как длл, но никто не запрещает.
я и не собираюсь.
этот вопрос возник как теоретический с возможным будущим применением.
← →
SammIk © (2004-07-12 19:02) [84]Сеичас лежу в NTDLL посмотрим как он грузит.
На сеи момент известно, что LoadLibrary обращается к ф-ии
LdrLoadDLL из NTDLL.DLL
← →
SammIk © (2004-07-12 20:37) [85]Интересно выслушать и другие мнения
← →
SammIk © (2004-07-12 20:37) [86]Интересно выслушать и другие мнения
← →
Тимохов © (2004-07-13 12:57) [87]
> SammIk © (12.07.04 20:37) [86]
во-во
← →
-SeM- (2004-07-13 15:25) [88]Странно, у меня оба примера работают без ошибок (D7, Me). Как и работало два месяца назад
Даже если переделать так [82]:
procedure test;
begin
MessageBox(0, "hi", "hi", MB_OK);
end;
// Пример со строковой константой
procedure ExportFunctionWithStringConst();
begin
Test;
end;
Может связано с директивами компилятора? Даю для сравнения мои:
-$A8
-$B-
-$C+
-$D+
-$E-
-$F-
-$G+
-$H+
-$I+
-$J-
-$K-
-$L+
-$M-
-$N+
-$O+
-$P+
-$Q-
-$R-
-$S-
-$T-
-$U-
-$V+
-$W-
-$X+
-$YD
-$Z1
-cg
-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
-H+
-W+
-M
-$M16384,1048576
-K$00400000
← →
Тимохов © (2004-07-13 15:27) [89]фиг его знает, с чем это связано. У меня тоже, то работает, то нет. Даже понять сложно логику зависимости. :(((
Я решил ждать выхода из отпуска Игоря Шевченко. Он говорил, что посмотрит.
← →
-SeM- (2004-07-13 15:31) [90]А вообще одним MessageBox сыт не будешь. После него все равно будут вопросы
На чем тормознулся я:
1. Как отловить момент загрузки/выгрузки (DLLEntryPoint)
2. Инициализация EXE (VCL)
Будут мысли, предположения - высказывайте, будем думать.
← →
Тимохов © (2004-07-13 15:35) [91]
> 2. Инициализация EXE (VCL)
я тоже не знаю как exe инициализируется. Как dll вроде в msdn описано, а как exe - не знаю.
так что мыслей нет.
← →
Ertong © (2004-07-16 09:26) [92]Попробуйте в 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 Вышлите, пожалуйста, еще мне ваш тестовый исходник :)
← →
jack128 © (2004-07-16 11:29) [93]
> Попробуйте в EXE(тот что типа DLL) написать:
> {$IMAGEBASE $40000000}
это заглушка. А если я буду использовать еще одну dll"ку с таким же базовым адресом?
← →
Ertong © (2004-07-16 11:43) [94]
> А если я буду использовать еще одну dll"ку с таким же базовым
> адресом?
Главное, чтобы все EXE имели разные базовые адреса, а DLL, если че, пересчитает релоки :)
P.S. А вообше вы правы - это не универсальный метод.
← →
имя (2004-07-16 11:45) [95]Удалено модератором
← →
Piter © (2004-07-18 20:49) [96]Тимохов, если не против - я отправлю твой вопрос в FIDO - ответы могу кидать сюда. да ты и сам можешь их читать через talk.mail.ru. Как считаешь?
← →
jack128 © (2004-07-18 21:16) [97]
> Главное, чтобы все EXE имели разные базовые адреса, а DLL,
> если че, пересчитает релоки :)
:-) Ага, как только ты придумаешь способ обеспечить это требование, так сразу и наступит рай на земле ;-)
← →
имя (2004-07-19 11:06) [98]Удалено модератором
← →
Piter © (2004-07-22 20:07) [99]ФИДО молчит...
← →
имя (2004-07-22 20:10) [100]Удалено модератором
← →
Serge_ (2004-07-25 02:48) [101]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;
.......
Только так... потомучто там действительно адресс меняется,
значит надо его вычеслять ...
← →
Serge_ (2004-07-25 02:52) [102]Но при этом надо учитывать что переменные лежат в объекте кода,
который имеет флаг только чтение, что соответсвенно легко
сменить с помощью PEEditor...
← →
имя (2004-07-25 09:56) [103]Удалено модератором
← →
Serge_ (2004-07-25 14:59) [104]Я про переменные, а не про константы.
← →
Piter © (2004-07-27 14:50) [105]Вроде Игорь вернулся из отпуска... Может что скажет?
← →
pasha_golub © (2004-07-27 15:37) [106]Классный вопрос, как я его сразу не заметил...
← →
Игорь Шевченко © (2004-07-27 16:05) [107]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 :)
← →
Piter © (2004-07-27 18:15) [108]Игорь Шевченко © (27.07.04 16:05) [107]
Вредный ты. Вернулся.
ну если есть работа для настоящего профессионала - то надо его привлечь :)
← →
-SeM- (2004-07-27 18:24) [109]Игорь Шевченко © (27.07.04 16:05) [107]
> При загрузке EXEшника без признака DLL
Какого-такого признака, подробнее можно? plz...
← →
Игорь Шевченко © (2004-07-27 21:52) [110]-SeM- (27.07.04 18:24) [109]
tdump exe_file
tdump dll_file
сравниваем поле Flags (вторая строчка сверху в разделе Portable Executable header)
Флажок с значением 0x2000 и есть признак DLL или не DLL
← →
имя (2004-08-09 11:16) [111]Удалено модератором
Страницы: 1 2 3 вся ветка
Текущий архив: 2004.09.19;
Скачать: CL | DM;
Память: 0.68 MB
Время: 0.053 c