Столкнулся с необходимость поддержки x64 в дазассемблере длин. Ранее использовал дизасм на основе VirXasm32. Но он был переделан на Си в виде asm вставки. И по этому были проблемы с компиляцией под X64 (да и вроде он не поддерживал определение длин x64 инструкций), по этому его пришлось выкинуть. За основу взял Дизассемблер длин инструкций (x86) от x64 (с http://www.rsdn.ru/forum/src/3120789.1.aspx), но он тоже не поддерживал x64, по этому самому пришлось добавить поддержку. Поковырявшись в доках, нашел что появился еще REX префикс (коды от 0x40 до 0x4F) который был добавлен в код. По коду изменилось только Код (Text): ************************************ #define C_REX 0x00000100 // rex present ************************************ switch (disasm_opcode) { case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47: case 0x48: case 0x49: case 0x4a: case 0x4b: case 0x4c: case 0x4d: case 0x4e: case 0x4f: if (disasm_flag & C_REX) { return 0; } disasm_flag |= C_REX; goto RETRY; break; ************************************* В принципе на основных инструкциях работает. Но хотелось бы знать надо что-то еще добавлять или нет?
Надеюсь, я еще не надоел со своим дизассемблером, но можно попробовать Mediana. Есть поддержка 64битных инструкций. Но это не совсем дизассемблер длин -- это полный дизассемблер. Но никто не запрещает игнорировать мнемонику инструкций.
Другие чуть не подходят. Очень много лишнего и не нужного функционала. И тяжелее расширить функционал. В данный момент пытаюсь попутно обнаружить инструкции когда сплайсить нельзя. Может кто нибудь еще знает ситуации когда сплайсить нельзя из-за особенностей машинного кода? Пока что обнаружены следующие: 1) call OFFSET_32 2) JMP OFFSET_32 3) J** OFFSET_8 4) Использование 64 битного регистра RIP По идее сплайсить можно, только придется для каждого случая делать пересчет смещения
Hacker Disassembler Engine. Еще по теме есть интересная библиотека под названием MinHook: http://www.codeproject.com/KB/winsdk/LibMinHook.aspx.