Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.02.15;
Скачать: CL | DM;

Вниз

Как сделать переход по известному адресу   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.021 c
15-1229625640
axis_of_evil
2008-12-18 21:40
2009.02.15
помогите правильно прочитать help


6-1198858897
Jimmy
2007-12-28 19:21
2009.02.15
Игра через интернет


15-1229467237
Керк
2008-12-17 01:40
2009.02.15
Интересный текст


15-1229697522
zorik
2008-12-19 17:38
2009.02.15
Проектирование бизнес-логики работы с БД


2-1230718655
b@v
2008-12-31 13:17
2009.02.15
Грнид и картинка