Форум: "Начинающим";
Текущий архив: 2009.02.15;
Скачать: [xml.tar.bz2];
ВнизКак сделать переход по известному адресу Найти похожие ветки
← →
Nobody (2008-12-29 12:05) [0]приветствую. такой вопрос: как сделать переход по известному адресу в другое приложение. к примеру есть приложение в котором по адресу "00401070 /$ 55 PUSH EBP" находится точка входа в некую процедуру. это приложение использует библиотеку -так вот как из этой библиотеку (dll) сделать переход/вызов процедуры экзешника по адресу 00401070 :)
в dll пробывал так:
asm
mov eax, $00401070;
jmp eax;
end;
выдает ошибку :)
на С++ это делается таким образом#define MyProcedure ((void(*) (void)) 0x401070)
как сделать на delphi? помогите :)
← →
DVM © (2008-12-29 12:13) [1]
> как сделать переход по известному адресу в другое приложение
у разных процессов вообще то разные адресные пространства и процессы изолированы.
← →
DVM © (2008-12-29 12:14) [2]
> на С++ это делается таким образом
> #define MyProcedure ((void(*) (void)) 0x401070)
Неужели работает?
← →
Nobody (2008-12-29 12:15) [3]на С++ работает
← →
DVM © (2008-12-29 12:20) [4]
> на С++ работает
Не верю. Или работает, но совсем другое. Или ты не понял.
И как, позволь поинтересоваться, этот код узнает в адресном пространстве КАКОГО процесса он должен перейти по заданному адресу? Где указан хоть какой-то идентификатор процесса?
← →
DVM © (2008-12-29 12:22) [5]
> Nobody
Что то мне кажется что и нет тут никаких ДВУХ процессов и приложений.
← →
Nobody (2008-12-29 12:30) [6]загружаемая приложением dll разве не может получить доступ в адресное пространство процесса?
в С++:
my.h
#define MyProcedure ((void(*) (void)) 0x401070)
...
typedef void(*pMyProcedure)(void);
extern pMyProcedure MyProcedure;
my.cpp
pMyProcedure MyProcedure = (pMyProcedure)0x401070;
...
__asm {
call MyProcedure;
}
так у меня всё работает. что тут не так можно понять? вопрос - как это сделать на delphi.
← →
Nobody (2008-12-29 12:31) [7]процесс один. просто вызов из процедуры exe из dll нужен :)
← →
DVM © (2008-12-29 12:32) [8]
> загружаемая приложением dll разве не может получить доступ
> в адресное пространство процесса?
может конечно, но ты сам написал:
> как сделать переход по известному адресу в другое приложение
в случае с dll нет никакого другого приложения.
← →
Сергей М. © (2008-12-29 12:34) [9]
> выдает ошибку
Вот прямо так и говроит - "выдаю ошибку" ?)
← →
DVM © (2008-12-29 12:38) [10]
> Сергей М. © (29.12.08 12:34) [9]
наверное, предназначение той процедуры, которую он пытается вызвать - как раз выдача сообщения об ошибке :)
← →
Anatoly Podgoretsky © (2008-12-29 12:38) [11]> Сергей М. (29.12.2008 12:34:09) [9]
Словами сыт не будешь.
Надо не говорить, а выдавать.
← →
Nobody (2008-12-29 12:40) [12]
> > как сделать переход по известному адресу в другое приложение
порошу прощение. моя вина. волнуюсь.
"как сделать переход из dll по известному адресу в загружаемое ее приложение". :)
> Вот прямо так и говроит - "выдаю ошибку" ?)
почти :) "Приложение выполнило недопустимую операцию и будет закрыто"
← →
Nobody (2008-12-29 12:42) [13]юмор это отлично. но хочется услышать что то поводу сабжа. обратите пожалуйста внимание на работающий пример в сообщении [6]
← →
Сергей М. © (2008-12-29 12:50) [14]
> Приложение выполнило недопустимую операцию и будет закрыто
А откуда взялась эта цифирь "401070" ?
Изложи подробно ..
← →
Nobody (2008-12-29 12:56) [15]> А откуда взялась эта цифирь "401070" ?
это смещение/адрес начала процедуры в exe. определён при помощи дебагера.
00401070 /$ 55 PUSH EBP
00401071 |. 8BEC MOV EBP,ESP
00401073 |. 33C0 XOR EAX,EAX
00401075 |. A0 F6D91E08 MOV AL,BYTE PTR DS:[81ED9F6]
0040107A |. 83E0 01 AND EAX,1
0040107D |. 85C0 TEST EAX,EAX
0040107F |. 75 0F JNZ SHORT 00401090
00401081 |. 8A0D F6D91E08 MOV CL,BYTE PTR DS:[81ED9F6]
00401087 |. 80C9 01 OR CL,1
0040108A |. 880D F6D91E08 MOV BYTE PTR DS:[81ED9F6],CL
00401090 |> 5D POP EBP
00401091 \. C3 RETN
← →
Сергей М. © (2008-12-29 13:00) [16]
> это смещение/адрес начала процедуры в exe. определён при
> помощи дебагера
За каким ты полез в дебагер ?
Приложения без исходников ?
← →
Nobody (2008-12-29 13:06) [17]> За каким ты полез в дебагер ?
причем тут это к сабжу? есть адрес в адресном пространстве exe на который нужно совершить переход из dll. мне по спортивному интересно как это можно сделать на Delphi, на C это я сделал.
← →
DVM © (2008-12-29 13:15) [18]может так?
type
TMyProc = procedure; stdcall;
var
MyProc: TMyProc;
begin
@MyProc := Ptr($00401070);
MyProc;
end;
← →
Сергей М. © (2008-12-29 13:15) [19]
> как это можно сделать на Delphi
Да вот так как ты сделал, прямо так и можно.
> причем тут это к сабжу?
Притом что если ты полез в отладчик, то имеешь возможность трассировать пошагово свои инструкции, в т.ч. ту самую JMP.
Трассировка покажет куда ты попал в рез-те перехода.
Это что, новость для тебя ?
← →
Сергей М. © (2008-12-29 13:18) [20]
> DVM © (29.12.08 13:15) [18]
stdcall, судя по [15], не обязателен - параметров, передаваемых через стек, там не наблюдается.
← →
Сергей М. © (2008-12-29 13:47) [21]
> pMyProcedure MyProcedure = (pMyProcedure)0x401070;
> ...
> __asm {
>call
MyProcedure;
> }
>
> так у меня всё работает
> asm
> mov eax, $00401070;
>jmp
eax;
> end;
>
> выдает ошибку
Задача для читателей Мурзилки - найди отличия в тексте, выделенном жирным цветом)
← →
Nobody (2008-12-29 13:50) [22]
> то имеешь возможность трассировать пошагово свои инструкции,
> в т.ч. ту самую JMP.
трассировку естественно делал. только дебагер вместо инструкции "mov eax, $00401070" показывал "не распознанные" байты типа данных - что было очень странным и прыжок происходил в непонятно куда. грешным делом подумал что это эксклюзивная черта компиляции ассемблерного кода в Delphi :). компилировал в Delphi 7. только что скомпилировал в Delphi 6 - все правильные инструкции и прыжок происходит. OMG. 0_0
asm
mov eax, $00401070
jmp eax
end;
DVM © и Сергей М. © - спасибо Вам большое за помощь и за предоставление кода вызова процедуры через указатель. день прожит не зря :)
сабж выяснен - тему можно закрывать.
← →
DevilDevil (2008-12-30 13:43) [23]asm
call $00401070
end;
?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.02.15;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.006 c