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

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

Как сделать переход по известному адресу [D6, D7, WinXP]


Страницы:   1 2

Nobody ©   (2008-12-29 12:05:00) 

приветствую. такой вопрос: как сделать переход по известному адресу в другое приложение. к примеру есть приложение в котором по адресу "00401070    /$  55   PUSH EBP" находится точка входа в некую процедуру. это приложение использует библиотеку -так вот как из этой библиотеку (dll)  сделать переход/вызов процедуры экзешника по адресу 00401070 :)
в dll пробывал так:

asm
mov eax, $00401070;
jmp eax;
end;

выдает ошибку :)

на С++ это делается таким образом
#define MyProcedure ((void(*) (void)) 0x401070)

как сделать на delphi? помогите :)


DevilDevil   (2008-12-30 13:43:00) [1]

asm
 call $00401070
end;

?


Nobody   (2008-12-29 13:50:00) [2]


> то имеешь возможность трассировать пошагово свои инструкции,
>  в т.ч. ту самую JMP.

трассировку естественно делал. только дебагер вместо инструкции "mov eax, $00401070" показывал "не распознанные" байты типа данных - что было очень странным и прыжок происходил в непонятно куда. грешным делом подумал что это эксклюзивная черта компиляции ассемблерного кода в Delphi :). компилировал в Delphi 7. только что скомпилировал в Delphi 6 - все правильные инструкции и прыжок происходит. OMG. 0_0

asm
mov eax, $00401070
jmp eax
end;


DVM ©  и Сергей М. © - спасибо Вам большое за помощь и за предоставление кода вызова процедуры через указатель. день прожит не зря  :)

сабж выяснен - тему можно закрывать.


Сергей М.   (2008-12-29 13:47:00) [3]


> pMyProcedure MyProcedure = (pMyProcedure)0x401070;
> ...
> __ asm{
>   call MyProcedure;
> }
>
> так у меня всё работает



> asm
> mov eax, $00401070;
> jmp eax;
> end;
>
> выдает ошибку


Задача для читателей Мурзилки - найди отличия в тексте, выделенном жирным цветом)


Сергей М.   (2008-12-29 13:18:00) [4]


> DVM ©   (29.12.08 13:15) [18]


stdcall, судя по [15], не обязателен - параметров, передаваемых через стек, там не наблюдается.


Сергей М.   (2008-12-29 13:15:00) [5]


> как это можно сделать на Delphi


Да вот так как ты сделал, прямо так и можно.


> причем тут это к сабжу?


Притом что если ты полез в отладчик, то имеешь возможность трассировать пошагово свои инструкции, в т.ч. ту самую JMP.
Трассировка покажет куда ты попал в рез-те перехода.
Это что, новость для тебя ?


DVM   (2008-12-29 13:15:00) [6]

может так?

type
 TMyProc = procedure; stdcall;
var
 MyProc: TMyProc;
begin
 @MyProc := Ptr($00401070);
 MyProc;
end;


Nobody   (2008-12-29 13:06:00) [7]

> За каким ты полез в дебагер ?
причем тут это к сабжу? есть адрес в адресном пространстве exe на который нужно совершить переход из dll. мне по спортивному интересно как это можно сделать на Delphi, на C это я сделал.


Сергей М.   (2008-12-29 13:00:00) [8]


> это смещение/адрес начала процедуры в exe. определён при
> помощи дебагера


За каким ты полез в дебагер ?
Приложения без исходников ?


Nobody   (2008-12-29 12:56:00) [9]

> А откуда взялась эта цифирь "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 12:50:00) [10]


> Приложение выполнило недопустимую операцию и будет закрыто


А откуда взялась эта цифирь "401070" ?
Изложи подробно ..


Nobody   (2008-12-29 12:42:00) [11]

юмор это отлично. но хочется услышать что то поводу сабжа. обратите пожалуйста внимание на работающий пример в сообщении [6]


Nobody   (2008-12-29 12:40:00) [12]


> > как сделать переход по известному адресу в другое приложение

порошу прощение. моя вина. волнуюсь.
"как сделать переход из dll по известному адресу в загружаемое ее приложение".  :)
> Вот прямо так и говроит - "выдаю ошибку" ?)
почти :) "Приложение выполнило недопустимую операцию и будет закрыто"


Anatoly Podgoretsky   (2008-12-29 12:38:00) [13]

> Сергей М.  (29.12.2008 12:34:09)  [9]

Словами сыт не будешь.
Надо не говорить, а выдавать.


DVM   (2008-12-29 12:38:00) [14]


> Сергей М. ©   (29.12.08 12:34) [9]

наверное, предназначение той процедуры, которую он пытается вызвать - как раз выдача сообщения об ошибке :)


Сергей М.   (2008-12-29 12:34:00) [15]


> выдает ошибку


Вот прямо так и говроит - "выдаю ошибку" ?)


DVM   (2008-12-29 12:32:00) [16]


> загружаемая приложением dll разве не может получить доступ
> в адресное пространство процесса?

может конечно, но ты сам написал:


> как сделать переход по известному адресу в другое приложение


в случае с dll нет никакого другого приложения.


Nobody   (2008-12-29 12:31:00) [17]

процесс один. просто вызов из процедуры exe из dll нужен :)


Nobody   (2008-12-29 12:30:00) [18]

загружаемая приложением 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.


DVM   (2008-12-29 12:22:00) [19]


> Nobody

Что то мне кажется что и нет тут никаких ДВУХ процессов и приложений.


DVM   (2008-12-29 12:20:00) [20]


> на С++ работает

Не верю. Или работает, но совсем другое. Или ты не понял.

И как, позволь поинтересоваться, этот код узнает в адресном пространстве КАКОГО процесса он должен перейти по заданному адресу? Где указан хоть какой-то идентификатор процесса?


Страницы:   1 2

Наверх

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