herm1t LIVE!ng room - Заоптимизировался [entries|archive|friends|userinfo]
herm1t

[ website | twilight corner in the herm1t's cave ]
[ userinfo | ljr userinfo ]
[ archive | journal archive ]

Заоптимизировался [Aug. 17th, 2008|04:04 pm]
Previous Entry Add to Memories Tell A Friend Next Entry
Вячеслав пишет:
Вообще, мне известен только один движок с хорошей проверкой плохих инструкций - yad by herm1t, но и он не идеален (если это читает herm1t - не в обиду ;): не проверяет уместность lock префикса, не поддерживает sse3 и др., так что команды типа `f0 93 = lock xchg eax,ebx' считает правильными, типа `dd 8a 00 00 00 00 = fisttp qword [edx]', `f3 0f 52 c8 = rsqrtss xmm1,xmm0' - неправильными. Хотя в целом движок хороший и большинство ошибочных команд детиктит.
Я не только не обижаюсь, но и весьма рад найденному багу. Дело в том, что между девятой и десятой версией решил похимичить, и написал:
                        i = diza->p_rep & 3;
                        flags = fetch((flags & YAD_GROUP_MASK) +
                                (flags & C_GROUP ? reg :
                                (diza->p_66 ? 2 : i ^ (i >> 1))));
                        if (flags == C_ERROR)
                                return 0;
Байтики значит экономил. У меня сейчас мозги биты не ксорят, так что и не соображу: то ли посчитал неправильно, то ли собирался поменять порядок команд с префиксами в таблице. Ж-) Неважно откатился и всё заработало.

Да, а дополнительные проверки на префиксы (можно не только lock проверять, но и валидные, но неуместные rep, типа rep nop, помечать, как подозрительные; ETG как раз много такого добра генерирует) это весьма славно, тоже вот думаю сделать. Наверное даже не буду сейчас выпускать новую версию, а домучаю еще SSE3 и те самые проверки.

p.s. Наверное стоит написать небольшую статейку о том, как писать дизассемблеры, а то такая грусть берет когда в очередной раз натыкаюсь на вопрос где-нибудь в форуме: "Подскажите, где в опкоде закодирована его длина?" Ж-)

p.p.s. Заглянул в дизасм detours, какой отстой!

LinkLeave a comment

Comments:
[User Picture]
From:[info]ketmar
Date:September 29th, 2008 - 01:03 pm
(Link)
>Заглянул в дизасм detours, какой отстой!
а distorm?
[User Picture]
From:[info]herm1t
Date:September 29th, 2008 - 02:57 pm
(Link)
Вроде хороший дизасм (хотя я и не гонял). Другая весовая категория. Мне нужен был парсер инструкций, а не полный дизассемблер. Но API-шки у него, по меньшей мере, странные: автору не в лом возвращать hex-строку декодированной инструкции (абсолютно бесполезная вещь), а вот управлять режимами дизасма нельзя (да, хоть бы флаги ставил - к какому набору принадлежит инструкция), тем более, что есть и такие опкоды, которые дают разные результаты на разных процаках. Если дизассемблер полный, то можно было бы сделать набор более высокоуровневых функций, например для разбора перекрывающегося кода. А так зачем? Не могу представить, куда можно было бы его присобачить. С тем же успехом можно и libbfd заюзать.
[User Picture]
From:[info]ketmar
Date:September 29th, 2008 - 03:03 pm
(Link)
автор, вроде, собирается туда анализатор кода привинчивать. для отладчика типа ольки будет самое то, думаю, если сделает нормально.
[User Picture]
From:[info]herm1t
Date:September 29th, 2008 - 03:47 pm
(Link)
а отладчику-то что? для отладчика нужен код в ядре, а тулза для статического анализа пригодилась бы и сама по себе, даже без отладчика. будем посмотреть, когда сделает.
[User Picture]
From:[info]ketmar
Date:September 29th, 2008 - 04:29 pm
(Link)
вот как раз то — hex-вид, анализатор (не настолько глубокий, как отдельная софтина, так — циклы/switch'и выцеплять, параметры функций и прочую мелочь). как раз то, что написать несложно, но шибко занудно. %-)
[User Picture]
From:[info]herm1t
Date:September 30th, 2008 - 12:54 pm
(Link)
а сложных вещей вообще мало. что, отладчик на ptrace наваять сложно? Ж-)
[User Picture]
From:[info]ketmar
Date:September 30th, 2008 - 12:58 pm
(Link)
угу. вон, gdb сколько пилят? а оно до сих пор страшное, как улыбающийся Валуев.