The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Функция write в solaris и linux"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Функция write в solaris и linux" 
Сообщение от AKProggy Искать по авторуВ закладки on 28-Дек-05, 18:17  (MSK)
Жизненно необходимо узнать ответ на следующий вопрос.
Функция write в solaris'e или linux'e вызывает функцию _write, вот как эта функция выглядит под отладчиком:
Dump of assembler code for function _write:
0xd1373050 <_write>: call 0xd1373055 <_write+5>
0xd1373055 <_write+5>: pop Мx
0xd1373056 <_write+6>: mov $0x4,Йx
0xd137305b <_write+11>: mov %esp,Лx
0xd137305d <_write+13>: add $0x10,Мx
0xd1373063 <_write+19>: sysenter
0xd1373065 <_write+21>: jae 0xd1373071 <_write+33>
0xd1373067 <_write+23>: cmp $0x5b,Йx
0xd137306a <_write+26>: je 0xd1373050 <_write>
0xd137306c <_write+28>: jmp 0xd12edb90 <__cerror>
0xd1373071 <_write+33>: ret
0xd1373072 <_write+34>: add %al,(Йx)
0xd1373074 <_write+36>: add %al,(Йx)
0xd1373076 <_write+38>: add %al,(Йx)
0xd1373078 <_write+40>: add %al,(Йx)
0xd137307a <_write+42>: add %al,(Йx)
0xd137307c <_write+44>: add %al,(Йx)
0xd137307e <_write+46>: add %al,(Йx)
End of assembler dump.
Как видно из этого, перед вызовом sysenter она получает адрес начала функции _write, т.е начала самой себя...
Зачем это нужно? Очень прошу ответить, кто знает. Заранее огромное спасибо!
  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]

1. "Функция write в solaris и linux" 
Сообщение от DeadMustdie emailИскать по авторуВ закладки(??) on 28-Дек-05, 18:47  (MSK)
>Как видно из этого, перед вызовом sysenter она получает адрес начала
>функции _write, т.е начала самой себя...

Не видно

>Зачем это нужно? Очень прошу ответить, кто знает. Заранее огромное спасибо!

Не нужно, поэтому и не делает.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Функция write в solaris и linux" 
Сообщение от AKProggy Искать по авторуВ закладки on 28-Дек-05, 19:47  (MSK)
>>Как видно из этого, перед вызовом sysenter она получает адрес начала
>>функции _write, т.е начала самой себя...
>
>Не видно
Ну а что же тогда сие значит:
0xd1373050 <_write>: call 0xd1373055 <_write+5>
0xd1373055 <_write+5>: pop %edx
0xd1373056 <_write+6>: mov $0x4,%eax
0xd137305b <_write+11>: mov %esp,%ecx
0xd137305d <_write+13>: add $0x10,%edx
0xd1373063 <_write+19>: sysenter
В первой строке вызывает следующую инструкцию, затем делает pop %edx...
Следовательно забирает из стека значение начала самой себя...
или я чего-то не понимаю... тогда что это значит?
>
>>Зачем это нужно? Очень прошу ответить, кто знает. Заранее огромное спасибо!
>
>Не нужно, поэтому и не делает.


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Функция write в solaris и linux" 
Сообщение от DeadMustdie emailИскать по авторуВ закладки(??) on 28-Дек-05, 21:43  (MSK)
>>>Как видно из этого, перед вызовом sysenter она получает адрес начала
>>>функции _write, т.е начала самой себя...
>>
>>Не видно
>Ну а что же тогда сие значит:
>0xd1373050 <_write>: call 0xd1373055 <_write+5>
>0xd1373055 <_write+5>: pop %edx
>0xd1373056 <_write+6>: mov $0x4,%eax
>0xd137305b <_write+11>: mov %esp,%ecx
>0xd137305d <_write+13>: add $0x10,%edx
>0xd1373063 <_write+19>: sysenter
>В первой строке вызывает следующую инструкцию, затем делает pop %edx...
>Следовательно забирает из стека значение начала самой себя...
>или я чего-то не понимаю... тогда что это значит?

Я вполне допускаю, что я чего-то не понимаю, но по-моему оный pop %edx
есть извлечение из стека переданного аргумента.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "Функция write в solaris и linux" 
Сообщение от Wulf Искать по авторуВ закладки on 28-Дек-05, 23:54  (MSK)
>>>Как видно из этого, перед вызовом sysenter она получает адрес начала
>>>функции _write, т.е начала самой себя...
>0xd1373050 <_write>: call 0xd1373055 <_write+5>
>0xd1373055 <_write+5>: pop %edx
>0xd1373056 <_write+6>: mov $0x4,%eax
>0xd137305b <_write+11>: mov %esp,%ecx
>0xd137305d <_write+13>: add $0x10,%edx
>0xd1373063 <_write+19>: sysenter
>В первой строке вызывает следующую инструкцию, затем делает pop %edx...
>Следовательно забирает из стека значение начала самой себя...
>или я чего-то не понимаю... тогда что это значит?
>>
>>>Зачем это нужно? Очень прошу ответить, кто знает. Заранее огромное спасибо!
Так это элементарно, Ватсон. Перед вами - новомодный метод вызова sycall-ов для i386 архитектуры, где заместо пары int80h/iret используется парочка sysenter/sysexit. Одно из отличий сих команд, а конкретно sysenter - в том, что они плюют на старые значения указателя стека и адреса возврата, в связи с чем необходимо передавать их через регистры. Чаще всего там: EAX - номер сискола, ECX - указатель стека, EDX - адрес возврата, аргументы передаются на верхушке стека. Цепочка
call 0xd1373055
pop %edx
add $0x10,%edx
занимается именно вычислением адреса возврата из syscall - адреса следующей после sysenter команды.
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "Функция write в solaris и linux" 
Сообщение от Forth Искать по авторуВ закладки(??) on 29-Дек-05, 10:35  (MSK)
>add $0x10,%edx
>занимается именно вычислением адреса возврата из syscall - адреса следующей после sysenter
>команды.
Интересно, зачем так сделано? Чем лучше?

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "Функция write в solaris и linux" 
Сообщение от AKProggy Искать по авторуВ закладки on 29-Дек-05, 10:47  (MSK)
>Так это элементарно, Ватсон. Перед вами - новомодный метод вызова sycall-ов для
>i386 архитектуры, где заместо пары int80h/iret используется парочка sysenter/sysexit. Одно из
>отличий сих команд, а конкретно sysenter - в том, что они
>плюют на старые значения указателя стека и адреса возврата, в связи
>с чем необходимо передавать их через регистры. Чаще всего там: EAX
>- номер сискола, ECX - указатель стека, EDX - адрес возврата,
>аргументы передаются на верхушке стека. Цепочка
>call 0xd1373055
>pop %edx
>add $0x10,%edx
>занимается именно вычислением адреса возврата из syscall - адреса >следующей после sysenter команды.
То есть как плюет на старые значения указателя стека? Они же все равно могут доступиться туда? или нет? Зачем передавать по регистрам, еслии можно и так забрать из стека?


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "Функция write в solaris и linux" 
Сообщение от AKProggy Искать по авторуВ закладки on 29-Дек-05, 10:49  (MSK)
>Так это элементарно, Ватсон. Перед вами - новомодный метод вызова sycall-ов для
>i386 архитектуры, где заместо пары int80h/iret используется парочка sysenter/sysexit. Одно из
>отличий сих команд, а конкретно sysenter - в том, что они
>плюют на старые значения указателя стека и адреса возврата, в связи
>с чем необходимо передавать их через регистры. Чаще всего там: EAX
>- номер сискола, ECX - указатель стека, EDX - адрес возврата,
>аргументы передаются на верхушке стека. Цепочка
>call 0xd1373055
>pop %edx
>add $0x10,%edx
>занимается именно вычислением адреса возврата из syscall - адреса >следующей после sysenter команды.
То есть как плюет на старые значения? Зачем передавать сие через регистры, если все равно можно доступиться к стеку и оттуда забрать?


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "Функция write в solaris и linux" 
Сообщение от Wulf Искать по авторуВ закладки on 29-Дек-05, 13:42  (MSK)
>То есть как плюет на старые значения? Зачем передавать сие через регистры,
>если все равно можно доступиться к стеку и оттуда забрать?

доступно описано, например, здесь:
http://www.codeguru.com/Cpp/W-P/system/devicedriverdevelopment/article.php/c8223/
только по тексту заменить "WinXP и выше" на "solaris 10 и выше", "linux 2.6 и выше" или что там у вас, и поменять int2e на lcall *** или int80, а так-же добавить, что аналогичные манипуляции проводятся и с ESP

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "Функция write в solaris и linux" 
Сообщение от Wulf Искать по авторуВ закладки on 29-Дек-05, 13:49  (MSK)
Да, еще, ключевая фраза там в описании sysenter:
The EIP register is loaded from the SYSENTER_EIP_MSR and the CPU starts executing code in kernel-mode
То-же самое для ESP - тольо он загружается из SYSENTER_ESP_MSR.
По-этому, их надо сохранять в других регистрах.
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру