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