EBX, шоб его

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

EBX, шоб его

Сообщение ANDLL » 17.05.2005 (Вт) 16:02

Интересное наблюдение:
Если есть некая stdcall-функция(не API), написанная на ассеблере. Написана она мною, а потому некоторые моменты в ней не совсем корректны. Так, например, функция изменяет значение EBX, и не восстанавливает его по завершении.
Если эта функция вызывается из C++ или из VB в режиме отладки то все проходит гладко. А вот если вызвать ее из VB-программы в собраном варианте, то последняя спустя несколько шагов, после вызова функции рушится.
Важно отметить, что сама функция выполняется и VB даже корректно получает и обрабатываем(скажем, выводит MsgBox'ом) ее значение. А вот потом внезапно падает.

Идем далее: если приобщится к C++, то можно заметить, что перед выполнением люой функции последний сохраняет в стеке значения ebx,esi,edi и ebp. А потом соответственно восстанавливает. Ну последние три понятно: тут, видимо хранится что-то важное(вот только что?), но чем так выделяется именно EBX? Почему бы не сохранять, скажем сx или edx?
И что делает команда stos?

ну и еще из наблюдений: следующий оператор:
Код: Выделить всё
return 0;

Преобразуется во что бы вы думали? нет, не угадали:
Код: Выделить всё
xor eax,eax

С чего бы это?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.05.2005 (Вт) 16:45

1. Есть регистры специального назначения, а есть общего. Читай.
2. Не знаю, что делает команда stos
3. Ожидали. Оно должно преобразоваться именно в это. А почему ты не ожидал?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 17.05.2005 (Вт) 16:51

mov eax,0
Этот как-то само напрашивается...
А вот в моей книжке написано, что это(в т.ч. и ebp и ebx) и есть регистры общего назначения... Но уж ebx точно.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.05.2005 (Вт) 17:18

ebp - копия esp для использования внутри функции.
Выброси-ка эту книжку.

А xor eax, eax - это гораздо круче mov eax, 0 :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 17.05.2005 (Вт) 17:20

Уже выбросил :) Так что с ebx? Общего он назначения или нет?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.05.2005 (Вт) 17:27

Слушай, качни мануалы от Интела, а? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 17.05.2005 (Вт) 17:32

Те шо в сумме 12 Мб? Не, спасибо, так далеко мое рвение к познаниям не простирается...
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.05.2005 (Вт) 17:33

For instance, some instructions assume that a pointer in the EBX register
points to a memory location in the DS segment.

  • EAX—Accumulator for operands and results data
  • EBX—Pointer to data in the DS segment
  • ECX—Counter for string and loop operations
  • EDX—I/O pointer
  • ESI—Pointer to data in the segment pointed to by the DS register; source pointer for string
    operations
  • EDI—Pointer to data (or destination) in the segment pointed to by the ES register;
    destination pointer for string operations
  • ESP—Stack pointer (in the SS segment)
  • EBP—Pointer to data on the stack (in the SS segment)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.05.2005 (Вт) 18:42

ANDLL писал(а):mov eax,0
Этот как-то само напрашивается...

У тебя 5 байт, а в xor eax, eax два.
MS и все нормальные компиляторописатели используют xor r,r как "идиому" обнуления регистра.
Есть некоторые фанаты на wasm.ru, которые всё делают "не как у MS" и пишут вместо этого sub r,r (тоже 2 байта).

ANDLL писал(а):А вот в моей книжке написано, что это(в т.ч. и ebp и ebx) и есть регистры общего назначения... Но уж ebx точно.

stdcall требует, чтобы ebx сохранялся.
Дело не в том, общего он назначения или не общего, а в том, что такова конвенция.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.05.2005 (Вт) 18:53

GSerg писал(а):2. Не знаю, что делает команда stos

А вот это зря, ибо полезная вещь.
Копирует один байт/слово/DWORD из al/ax/eax в [es:di], и устанавливает di на следующий байт/слово/DWORD.
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 17.05.2005 (Вт) 19:20

Кому интересно:
http://www.codenet.ru/progr/asm/asm.rar
2tyomitch:Я с этой конвенцией два дня голову ломал.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.05.2005 (Вт) 21:42

ANDLL писал(а):2tyomitch:Я с этой конвенцией два дня голову ломал.

Ойнимагу! А в доку заглянуть религия не позволяет? ;-)

С http://groups.google.ru/groups?selm=001 ... put=gplain :
Westheimer's Discovery:
A couple of months in the laboratory can
frequently save a couple of hours in the library.
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 18.05.2005 (Ср) 14:30

Кстати, почему мой компилятор на строку
Код: Выделить всё
mov eax,eip

Пишет, что символ eip не определен?
А на счет мануала: кто ж знал, что тут такие подводные камни???
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 18.05.2005 (Ср) 14:49

Скажем так. Есть некая программа, которая используя обозначенный ранее VirtualAlloc переносит код из obj-файла в ОЗУ и далее выполняет его, начиная с определенной точки. Сосбственно, стоит вопрос, как передавать этому коду адреса некоторых API-функций? Можно было бы записывать эти адреса перед файлом, тогда, учитывая, что начало файла лежит по адресу EIP-$ или что-то вроде этого, можно было бы быстро и удобно вызывать эти функции. Иначе придется передавать адреса через стек, что признаюсь сильно не радует... Кстати, а как делают НОРМАЛЬНЫЕ люди? Только не говорите, что они используют языки высокого уровня для этих целей...
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 18.05.2005 (Ср) 15:06

ANDLL писал(а):Только не говорите, что они используют языки высокого уровня для этих целей...

:D Извращенец :D
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 18.05.2005 (Ср) 15:15

Не извращенец, просто уж больно это интересно...
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.05.2005 (Ср) 15:19

Собственно, эту работу выполняет линкер. И я не понимаю, зачем заниматься тем гемором, которым занимаешься ты...

А единственный способ прочитать eip - сделать call, а потом позырить, чё там в [esp].
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.05.2005 (Ср) 22:06

ANDLL писал(а):Сосбственно, стоит вопрос, как передавать этому коду адреса некоторых API-функций? Можно было бы записывать эти адреса перед файлом, тогда, учитывая, что начало файла лежит по адресу EIP-$ или что-то вроде этого, можно было бы быстро и удобно вызывать эти функции.

Посмотри в моих прогах, например в расширялке часиков - я делаю mov eax, imm32; call eax. Просто и удобно, никаких относительных адресаций.

А регистра eip нету нигде, кроме как на картинках и в руководствах :-) Программно к нему не обратиться, это правда.
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 19.05.2005 (Чт) 13:22

Темыч, не понял:
1) Чем отличается
Код: Выделить всё
mov eax,imm32
call eax

от
Код: Выделить всё
call imm32

?
2) И что это дает?
И как мне вызвать функкцию для получениея eip, если у меня нет никаких адресов?

А в твоих часиках вообще никакого ассемблера нету! Ни в Dll, ни в EXE.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 19.05.2005 (Чт) 13:57

А зачем тебе EIP?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 19.05.2005 (Чт) 14:40

ANDLL писал(а):Темыч, не понял:
1) Чем отличается
Код: Выделить всё
mov eax,imm32
call eax

от
Код: Выделить всё
call imm32

?

Кодом. В одном случае прописывается абсолютный адрес, в другом относительный.

ANDLL писал(а):А в твоих часиках вообще никакого ассемблера нету! Ни в Dll, ни в EXE.

В старых, там где WriteProcessMemory+CreateRemoteThread.
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 19.05.2005 (Чт) 14:58

2GSerg:http://bbs.vbstreets.ru/viewtopic.php?p=122115#122115
2tyomitch:Относительно чего?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 19.05.2005 (Чт) 15:06

Всё равно не понимаю, зачем тебе EIP.
С каждой выполненной командой он меняется :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 19.05.2005 (Чт) 17:05

Относительно eip :-P

Блин, просто сассемблируй call 12345678h и посмотри, что получается.
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 20.05.2005 (Пт) 6:49

2tyomitch: Написал вот что:
Код: Выделить всё
   __asm
   {
      mov eax,10
      mov eax,20
      mov eax,30
      mov eax,40
      mov eax,4
      call eax
      mov eax,50
      mov eax,60
      mov eax,70
      mov eax,80
   }

Вызов производится по адресу 0x4. А там естественно, ничего нет. А мне надо, скажем вызвать на 4 байта до строки call...
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.05.2005 (Пт) 7:00

:shock:
Офигительный код...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 20.05.2005 (Пт) 8:16

ANDLL
IMXO, Тебе адрес надо хранить в данных а не кода. Так как даже если ты EIP подкорректируешь, все равно, там код команды mov а не значение eax.
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.05.2005 (Пт) 10:52

ANDLL писал(а):2tyomitch: Написал вот что:
Код: Выделить всё
   __asm
   {
      mov eax,10
      mov eax,20
      mov eax,30
      mov eax,40
      mov eax,4
      call eax
      mov eax,50
      mov eax,60
      mov eax,70
      mov eax,80
   }

Вызов производится по адресу 0x4. А там естественно, ничего нет. А мне надо, скажем вызвать на 4 байта до строки call...

Ну ответь, наконец, на наш с GSerg-ом вопрос: зачем?

Если тебе нужен как раз относительный вызов, для совершенно непостижимой мною цели, то как раз call $-4 поможет. Имей только в виду, что смещение там отсчитывается не от начала call, а от начала следующей инструкции.
Последний раз редактировалось tyomitch 20.05.2005 (Пт) 17:52, всего редактировалось 1 раз.
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 20.05.2005 (Пт) 13:10

Ладно, пойдем так:
Как утверждал некий tyomitch у Dll адреса внутренних процедур не всегда могут быть заданы на этапе сборки. Для этих целей служит некая секция realloc. В ней, как я понимаю записаны подряд адреса всех функций используемых библиотекой. Если вдруг EXE файл не может загрузить библиотеку по базовому адресу, то он перезаписывает содержимое этой секции. Так?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.05.2005 (Пт) 13:29

Блин.
Во-первых, это утверждал некий GSerg.
Во-вторых, в секции .reloc записаны адреса тех мест exe, где использована относительная адресация, а вовсе не тех мест, где адреса используемых функций. Адреса используемых функций - совершенно отдельная тема, см. мануал по PE, секция import.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

След.

Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23

    TopList  
cron