Заоптимизировался

Aug 17, 2008 16:04

Вячеслав пишет: Вообще, мне известен только один движок с хорошей проверкой плохих инструкций - 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, какой отстой!
Previous post Next post
Up