Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
9-1085000153
feanor
2004-05-20 00:55
2004.09.19
НАРОД подскажите как создать клон БК(очень нужо)


3-1092904824
Slash
2004-08-19 12:40
2004.09.19
Удаление таблицы


14-1093382240
Piter
2004-08-25 01:17
2004.09.19
УРА Есть новый мировой рекорд!


14-1093580852
тихий вовочка
2004-08-27 08:27
2004.09.19
Как заработать


3-1092900466
Zhekson
2004-08-19 11:27
2004.09.19
Редактирование записи которая активна в навигаторе.