Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1229590921
Calligraff
2008-12-18 12:02
2009.02.15
Непонятный глюк в Delphi


15-1229778455
Knight
2008-12-20 16:07
2009.02.15
Turbo Delphi... что за шляпа...


2-1230555975
...zZ
2008-12-29 16:06
2009.02.15
GetSystemMetrics


15-1229613114
Andy BitOff
2008-12-18 18:11
2009.02.15
DevExpress и BandedView или как-то по другому.


2-1230648345
Nameziz
2008-12-30 17:45
2009.02.15
ReleaseDC





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский