Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2011, 23:27   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию C++/Абсолютный адрес регистра Ebp

Возможно как-то средствами языка получить абсолютный адрес регистра ebp?

register DWORD *Abs_Ebp asm ("ebp"); // Такая запись не совсем у меня работает в Visual Studio, походу только на gcc.
пс. Вообще такую запись используют чтобы записать в регистр что-то... Ну раз можно записать значит можно и извлечь.
Поэтому я попытался сделать что вроде такого, но функция мне возвращает полный бред!
Может это конечно, совсем не правильно то что я написал ниже, я просто никогда не сталкивался с таким, поэтому пытаюсь лопатить все возможные варианты.

Код:
_declspec(naked) DWORD MyFunc()
{
 DWORD Addr;
 _asm
 {
  push ebp
  mov ebp, esp
  xor eax, eax
  mov eax, ebp
  mov dword ptr ds:[Addr], eax
  mov ebp, esp
  pop ebp
  retn
 }
}
Функция должна ТИПА вернуть адрес stack'а то есть 0x1xxxxx, а возвращает вообще 0D6B6006H что совсем не смахивает на его адрес.

Последний раз редактировалось coNsept; 29.03.2011 в 03:45.
coNsept вне форума Ответить с цитированием
Старый 29.03.2011, 04:10   #2
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Проблема решена, я немного не правильно думал, а точнее даже не знал что регистр ebp не отдает так напрямую свой адрес. Нужно для начала залезть
в stack'овый сегмент и только тогда получать адрес.
Вообщем может кому пригодиться.

Код:
__declspec(naked) DWORD Ebp_AbsoluteAddr() 
{	
 DWORD Addr_Ebp;
 __asm
 {
  PUSH EBP
  MOV EBP, ESP
  XOR EAX, EAX
  MOV EAX, DWORD PTR SS:[EBP]
  MOV DWORD PTR DS:[Addr_Ebp], EAX
  MOV ESP, EBP
  POP EBP
  RETN
 }
}
coNsept вне форума Ответить с цитированием
Старый 29.03.2011, 04:45   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

мдя, начнем с того что ebp это считается указателем на локальные переменные, а указатель стека это esp.
во вторых, в сегмент стека залазить не надо, так как все сегменты имеют единое адресное пространство(точнее единую настройку в нем)
достаточно было
Код:
_declspec(naked) DWORD GetESP()
{
 _asm
 {
  mov eax,esp
  retn
 }
}
вернет текущий указатель стека, а так как вы хотель получить указатель ebp функции из которой вызвали вашу, то можно так же но заменить esp на ebp.

изврат однако...прокоментирую самое не то
Код:
__declspec(naked) DWORD Ebp_AbsoluteAddr() 
{	
 DWORD Addr_Ebp;
 __asm
 {
  PUSH EBP
  MOV EBP, ESP
  XOR EAX, EAX                    ;зачем обнулять перед mov?
  MOV EAX, DWORD PTR SS:[EBP]           ;сегмент не нужен, ибо сегменты одинаковы(es==ds==ss).
  MOV DWORD PTR DS:[Addr_Ebp], EAX   ;сегмент не нужен, по умолчанию итак ds
  MOV ESP, EBP                                    ;а эт вообще зачем? они итак равны после mov ebp,esp
  POP EBP
  RETN
 }
}
насчет названия темы: регистр адреса не имеет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 29.03.2011 в 04:55.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.03.2011, 08:21   #4
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

А вот и нет, просто mov eax, ebp не возвращает адрес а какой-то бред.
Я тему не зря создал, потому я вчера так пробовал.


Цитата:
начнем с того что ebp это считается указателем на локальные переменные, а указатель стека это esp.
Цитата:
ТИПА вернуть адрес stack'а то есть 0x1xxxxx
Я в курсе для чего предназначен ebp и esp, здесь я имел ввиду что адрес должен быть похож на 0x1xxxxx

Цитата:
насчет названия темы: регистр адреса не имеет.
Немного не понял!? А что он имеет?

Последний раз редактировалось coNsept; 29.03.2011 в 08:45.
coNsept вне форума Ответить с цитированием
Старый 29.03.2011, 09:48   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Немного не понял!? А что он имеет?
значение он имеет.(кстати именно его вы и получаете)
Цитата:
А вот и нет, просто mov eax, ebp не возвращает адрес а какой-то бред.
ну почему же бред:
просто не забывайте что в стеке хранятся и адреса возвратов и указатели на строки, да и все это хранится выше адреса который вернулся от mov eax,ebp
Цитата:
что адрес должен быть похож на 0x1xxxxx
почему именно должен?
в Делфи при старте проги указатель стека находится на 0x001FFF00
Цитата:
а возвращает вообще 0D6B6006H что совсем не смахивает на его адрес.
а чем адрес 0x0D6B6006 не может являться текущим указателем на стек?
стек не обязан быть строго в одном месте у программ.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.03.2011, 12:55   #6
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Пепел Феникса большое спасибо, уяснил для себя не понятные мне моменты.
coNsept вне форума Ответить с цитированием
Старый 29.03.2011, 12:56   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

всегда пожалуйста
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Содержимое регистра AL Cpluser Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 21.01.2011 06:14
Абсолютный новичек. Выбор книги и среды программирования. Absolutenewbie Помощь студентам 3 16.09.2010 04:00
WebBrowser Абсолютный и относительный адрес nikmay Общие вопросы Delphi 1 01.10.2009 22:41
как узнать ip адрес зная mac адрес Roman Работа с сетью в Delphi 9 25.06.2007 12:39
Запись регистра xak2 Общие вопросы Delphi 4 07.05.2007 22:18