|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Сен 5, 2004 01:45:48 Нашел я такой хитрый опкод (в 16-битной проге): C4 C4 58 00 Дизассемблеры (IDA и HIEW) ничего внятного сказать не могут. Отладчики сомневаются: wdw (Watcom debugger) считает, что C4 C4 - это les ax, ah debug.com уверен, что C4 C4 - это les ax, sp Притом если (в любом из них) выполнить команду trace, то отладчик остановится только после _следующей_ команды независимо от того, сколько байт она занимает. "Книга двойных слов" только добавляет "непоняток" - если я правильно ее понимаю, то прав debug.com. И это несмотря на то, что он выдает бред - не, например, les ax, [sp], а именно les ax, sp. Кто спец в дизассемблировании, подскажите, если не трудно: в чем тут хитрость и что этот опкод должен обозначать? |
|
|
Дата: Сен 5, 2004 05:02:57 > C4 C4 58 00 C4 - это опокд команды LES reg, [указатель на память] а ты пытаешься использовать адресацию типа LES reg, reg, поэтому поведение процессора становится неопределенным, да и отладчиков/дизассемблеров тоже. > что он выдает бред - не, например, les ax, [sp], а именно les ax, sp. в 86 не было адресации типа [sp] ;) к тому же, у тебя два старших бита второго байта равны 11, так что декодирование регистра как SP c формальной точки зрения выполненно правильно. но у данной машинной команды нет такого способа адресации! |
|
|
Дата: Сен 5, 2004 05:09:16 > Притом если (в любом из них) выполнить команду trace, > то отладчик остановится только после _следующей_ > команды независимо от того, сколько байт она занимает. странно... avputil останавливается на пятом байте (т.е. отъедает один байт следующей команды), декодируя это как: C4 DB C4 ; U C4 58 00 LES BX,DWord ptr [BX+SI]+00 так же поступает и insight, декодируя это как: les ax,sp pop ax |
|
|
Дата: Сен 5, 2004 09:55:33 а ты пытаешься использовать адресацию типа LES reg, reg, поэтому поведение процессора становится неопределенным В том-то и дело, что не я пытаюсь :) Я нашел этот код при анализе некоторой "навесной" защиты. в 86 не было адресации типа [sp] ;) зЫнаю (C) "Достучаться до небес" :) Но такой код я бы смог понять, а вот такой - не могу. декодирование регистра как SP c формальной точки зрения выполненно правильно. но у данной машинной команды нет такого способа адресации! Значит, есть какой-то другой... притом большей длины. Но вот какой? :-\ avputil останавливается на пятом байте (т.е. отъедает один байт следующей команды) Пятый байт в моем случае - 2E (т.е. префикс CS:), а дальше идет что-то вроде mov dx, word ptr [...], то есть "угадать" длину команды не получится (либо 4, либо 5). Сначала я решил, что проглючил, но потом решил перепроверить. Сделал тестовый COM-файл с таким содержимым: C4 C4 58 00 CC CC CD 20 открыл его в том же debug.com, сказал ему "g" и увидел, что исполнение останавливается на первом CC. Здесь уже никакие нюансы разных отладчиков срабатывать не должны, так что все-таки длина данной команды - 4 байта. Дальше - "страньше". В случае C4 C4 58 CC CC CC CD 20 исполнение останавливается на втором CC, т.е. длина команды опять 4 байта, а вот в случае С4 С4 СС СС СС СС СС 20 опять же на втором CC, т.е. длина команды уже 3 байта. :-\ Ладно, сейчас напишу "более правильный" тест (вообще без использования отладчика), а там посмотрим... |
|
|
Дата: Сен 5, 2004 10:27:37 А если взглянуть на результаты работы такой "команды" ? У меня она не работает ни в 32-х, ни в 16-ти битном коде. Везде вывыливается в отладчик с UD-исключением. Может быть, это все же вызов обработчика исключения, установленного защитой, и без него это просто "мусор" >? |
|
|
Дата: Сен 5, 2004 11:22:17 RobinFood Если это защита, то где-то может стоять прыжок на второй C4. Тогда для 16-бит будет С4 58 00 = les bx,[bx+si+0], а C4 CC = les cx,sp (или ah). |
|
|
Дата: Сен 5, 2004 11:34:53 Chingachguk А если взглянуть на результаты работы такой "команды" ? В моих тестах AX становится равным 1. Почему именно так - непонятно. ES не изменяется, но гарантии, что он не изменится при других условиях, естественно нету. Что в защите - смогу посмотреть не раньше, чем завтра. Но в любом случае хотелось бы понимания :) У меня она не работает ни в 32-х, ни в 16-ти битном коде. Везде вывыливается в отладчик с UD-исключением. Может быть, это все же вызов обработчика исключения, установленного защитой, и без него это просто "мусор" >? Первой моей мыслью тоже была мысль о вызове обработчика. Но в том-то и дело, что я уверен, что обработчик защитой не устанавливался. Хотя какая-то зацепка в твоих словах есть. Я гонял свои тесты только под NTVDM. Возможно, вся причина именно в этом - защита этот код выполняет только в том случае, если она уверена, что работает под NT (проверяет это с помощью int21h, ax=3306h). leo Если это защита, то где-то может стоять прыжок на второй C4. Не может :) В этом я уверен. Вот только ntvdm меня немного смущает... Сейчас нормальный тест доделаю (мало у меня опыта в _написании_ на асме), тогда кое-что прояснится :) C4 CC = les cx,sp (или ah) Угу, только les cx,sp - это не меньший бред, чем les ax, sp :) |
|
|
Дата: Сен 5, 2004 12:06:33 · Поправил: leo RobinFood "Угу, только les cx,sp - это не меньший бред, чем les ax, sp" Вот именно. С4 СС я привел в ответ на твое "опять же на втором CC, т.е. длина команды уже 3 байта". А вопрос в том, почему у _Chingachguk_ возникает #UD (в соответствии с интелом), а у тебя нет ? И kaspersky привел пример: "умный" avputil выделяет первый С4 как db. И trace у тебя пролетает - значит всетаки #UD, но твои отладчики это не фиксируют ? Напрашивается вывод, что С4 С4 - это мусор. Либо 1) для того, чтобы перейти на обработчик исключения, 2) либо где-то производится модификация первого С4 или прыжок на второй С4, 3) либо это просто мусор, на который программа в нормальном режиме никогда не попадает. "Не может. В этом я уверен" На 100% ? Что в проге нет ни одного Jcc или Call ? Или ты все проанализировал ? Я с такой фигней сам когда-то баловался - делаешь call (еще лучше несколько вложенных), который интенсивно работает со стеком и под шумок подправляет адрес возврата. В твоем случае возможен переход на второй C4 или дальше, или вообще без возврата в вызывающую процедуру. |
|
|
Дата: Сен 5, 2004 12:33:04 _Chingachguk_ Может быть, это все же вызов обработчика исключения, установленного защитой, и без него это просто "мусор Нет! Нашел любопытный рецепт изучения команд : ставить JMP. 100 : c4 c4 58 00 ??? 104 : eb 1a jmp 120 106 : cc cc 120 : cc После g=100 попадаем на 120 ! Т.е. команда все-таки 4 байта длинной и она меняет AX ! Правда эксперименты с ES ничего не дали - у меня AX=1 после исполнения всегда( в debug.com W2K SP3). Если вызвать debug с программой - AX уже другой, т.е. точно читает память. |
|
|
Дата: Сен 5, 2004 12:38:04 А вопрос в том, почему у _Chingachguk_ возникает #UD (в соответствии с интелом) Это в каком таком соответствии? Процитируй, где написано, что такой опкод недопустим? И trace у тебя пролетает - значит всетаки #UD, но твои отладчики это не фиксируют ? Вот это хорошая мысль. Подумаю над ней, результат сообщу :) На 100% ? Что в проге нет ни одного Jcc или Call ? Или ты все проанализировал ? Ну, скажем так, на 99,99%. Переходов в проге дофигища, но я действительно все их проанализировал. 0,01% - это вероятность того, что я мог ошибиться; она была бы больше, но... у меня есть самодельный инжектор, заточенный именно под эту прогу. И одна из его фич - отслеживание прохождения "контрольных точек", которые я считаю важными. И если я задаю 2 точки - перед этим опкодом и после него, то они обе нормально проходят. Кстати, именно поэтому я уверен, что длина команды - ровно 4 байта. |
|
|
Дата: Сен 5, 2004 15:20:28 „А вопрос в том, почему у _Chingachguk_ возникает #UD (в соответствии с интелом)“ Это в каком таком соответствии? Процитируй, где написано, что такой опкод недопустим? Не, я пять сек пробовал - всего лишь вот что: db C4,C4,58,00 в win32-коде и то же самое в 16-ти битном коде плюс db 66h перед ними в 16-ти битном: везде UD. Я смотрел невнимательно. Тонкость какая-та должна быть, попробуй все же посмотреть, кем заняты вектора исключений, особенно - ud, gpf. |
|
|
Дата: Сен 5, 2004 16:00:03 RobinFood "Процитируй, где написано, что такой опкод недопустим?" Конечно, у интела звучит завуалировано "#UD - If source operand is not a memory location". Но формально байт ModR/M = C4 означает сочетание регистров AX и SP\AH. А это никаких довесков 58 00 не предполагает. Тогда это должно быть или les + push, или глюк - секретная команда интела. valterg "команда все-таки 4 байта длинной и она меняет AX !" А как насчет les + push ? SP проверял ? PS: в win32-коде C4 C4 однозначно вызывает invalid instruction, а Olly все, начиная с первого C4 считает мусором. |
|
|
Дата: Сен 5, 2004 16:36:15 См., например, http://www.peterburg.h1.ru/other/c4c4.html или, возможно, /private/ntos ;-) Если кратко, то это некий способ (канал) связи 16-битного кода с ntvdm, разумеется, недокументированный. |
|
|
Дата: Сен 5, 2004 16:40:15 leo команда все-таки 4 байта длинной и она меняет AX !" А как насчет les + push ? SP проверял ? Стек на месте стоит. Но в 98-м дает ошибку - недопустимая инструкция по адресу 200(!). Если же делать в командной строке, то комп виснет. Кстати на Virtual PC - все идентично получается. Может С4 это какой-то спец-код именно для ntvdm ? |
|
|
Дата: Сен 5, 2004 17:29:10 Skif Похоже, что это именно то, что нужно :) Большое спасибо, теперь буду private смотреть (но уже чуть позже). |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.095 |