Как стать автором
Обновить

Комментарии 37

Неровная длина команды и зло и прелесть x86. В результате чтобы делать хуки приходится тащить с собой дизассемблер длин. Зато такие красивые вещи можно делать.
Стоит так же отметить, что попытка использования ключевого слова __asm при компиляции под x64 приведёт к ошибке '__asm' keyword not supported on this architecture
Никто не мешает писать отдельные модули и компилировать их при помощи ml64 или использовать компилятор с поддержкой __asm, например ICC
Вот если бы я еще все вышеописанное понимал, я был бы т-а-а-ак счастлив. Пытался изучать ассм, но недоварил, хотя всякие глупости умею на нем. Так что благодарствую, было приятно почитать.
А чего понимать то? код это биты и байты, на не команды, разделителей меж командами нет. Если начать читать не с того места то это уже другие команды.
Ну, представьте, что вы читаете в книжке слова
«маджхара кирища»
а потом команда перехода назад, на адрес, соответствующий букве «х».

И вы теперь уже читаете «харакири ща» и выполняете уже совсем другую команду :)
Хлебал ложкой.
Головач Лена?!
Поверьте, достаточно лишь немного покопаться в дебаггере, мучая какую нить софтину, и на сайтах с описанием команд, чтоб понять что к чему)
Очень советую Дневники чайника (http://bitfry.narod.ru/). Позавчера решил постигнуть таки асм (рассылка Калашниковадля меня не прокатила). Сегодня уже понимаю смысл всего вышеописанного.
2 автору:
Написал бы уж конкретный пример применяемый в боевой ситуации, к примеру вычисление дельта смещения под 32-бита:
.00401000: E8FFFFFFFF                     call       .000401004 --↓1
.00401005: C05D83ED                       rcr         b,[ebp][-07D],0ED ;'э
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Я не недоволен, однако смею предположить, что при уменьшении скриншотов текст станет нечитаем.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Да ладно, можно ещё и регистры приклеить, для особо непонятливых.

Правда, особо непонятливые обычно в ассемблер не лезут…
Ок, но «уменьшить раз в 5» != обрезать :)
НЛО прилетело и опубликовало эту надпись здесь
С другой стороны, в Ольке сдвинуть можно разделитель между регистрами и собсно кодом…
Получили минус за то что предлагаете убрать окно с регистрами.
Автор на скринах приводит также и адреса где расположены команды, а глядя на код адресами я также рад увидеть и значения EIP, ESP, EBP и регистра флагов. Другое дело если бы автор только код на ассемблере предоставил, тогда согласен окно регистров почти никакой пользы бы не принесло.
А зачем тут окно с регистрами? Тут итак же всё очевидно.

ESP, EBP… Да в этом примере стек-то не используется. А текущее значение EIP выделяется.
Да, согласен для конкретных этих приведенных скринов окно с регистрами не обязательно, но не забываем на какую целевую аудиторию рассчитана статья.
Дело в том, что эта статья позиционируется прежде всего для новичков. Потому что опытным товарищам тут делать не чего, т.к. нового ничего не несет подобное еще с первых дней на wasm.ru было на форумах засвечено!
А раз для новичков, то нужно прививать им правильные методы работы. Очень часто вижу, что человек посмотрев на код не разобрался какие значения получатся в результате лезет на форум и задает вопрос, который бы не был задан если бы он глянул в регистры, которые ему на пальцах бы сказали что и как будет!
Вот поэтому в NaCl и запретили прыгать куда попало и почти сразу у них наступило секьюрное счастье :)
Мы использовали подобное для оптимизации кода — когда команда короткого перехода на 1 или 2 байта (а в 32-битном процессоре — и на 4) занимала 1 байт вместо двух. И выполнялась быстрее.
А как она выполнится быстрее по невыровненному адресу?
Так переход-то безусловный (mov eax,… вместо jmp short ...). Конвеер не прерывается. Другое дело, что переход внутрь команды (вероятно, условный) может оказаться дольше. Но когда считаются байты, это уже не так важно. К тому же, на Z80 (конечно, там 5-байтовых команд не было, но были 3-байтовые) выравнивание роли не играло.
Как там принято говорить? Торт на хабре? :)
Вопрос немного не по теме, но… Может кто встречал справочник исключительно по командам, т.е. вбиваешь имя команды получаешь информацию? Так чтобы были и mmx, xmm. Давно ищу, но как то одни книги в формате pdf попадаются.
Спасибо.
Чем плохи справочники в PDF? Они все равно наиболее актуальны, т.к. их Intel публикует.
Современные списки команд x86 я видел много где. Но почему-то почти нигде нет подробного описания, какие флаги они используют и модифицируют (и как именно). Есть ли где-нибудь такая информация?
Вот оффдок: ссылка. Там указано, какие флаги какая команда модифицирует. А как — это уже от флагов зависит. Про флаги здесь написано: линк. 3.4.3 EFLAGS register.
Спасибо. Очень интересно.
Я конечно про асм и дизассемблеры знаю только теоретически. Но разве в современных дизассемблерах нет возможности дизассемблировать по адресу? А добавить к этому кривой адрес который этим же дизассемблером должен подсвечиватся как «не валидный» и вообще все очень просто должно быть.

Ведь разве не так должно быть?
Адрес как раз валидный. Да и код тоже, просто начиная его дизассемблировать с разных точек можно получить разные ассемблерные листинги. Вот такая вот расплата за CISC.

То ли дело PIC какой, где длина команды фиксирована, и программа вообще лежит отдельно от данных :)
Стоп, как же он валидный если не попадает в начало инструкции, ну мы то конечно знаем что там начинается скрытая инструкция, а вот дизассемблер после дизассемблирования будет четко видет что прыгать прийдется по «не валидному» адресу. Я наверное немного попутал дизассемблер с дебагером но в статье используется OllyDbg. То что я видел в AIDA там вообще круть: там не просто листинг, а целое дерево выполнения и вот там то этот трюк с прыжком на кривой адрес должен пойти как отдельная функция и тот кто будет это все дебажить даже не узнает что там какой-то подвох был )
Опять же я это все видел только издалека так что могу ошибатся.
Советую прочитать статьи Криса Касперски по теме, он там вообще выносит мозг конструкциями которые не хавает транслятор, которые угрохивают эмулятор — но срабатывают на реальном железе, как раз пляшет там от разной длинны комманд в х86.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории