Дизассемблер длин с поддержкой x64

Тема в разделе "WASM.X64", создана пользователем slesh, 27 ноя 2011.

  1. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    Столкнулся с необходимость поддержки x64 в дазассемблере длин. Ранее использовал дизасм на основе VirXasm32. Но он был переделан на Си в виде asm вставки. И по этому были проблемы с компиляцией под X64 (да и вроде он не поддерживал определение длин x64 инструкций), по этому его пришлось выкинуть.

    За основу взял Дизассемблер длин инструкций (x86) от x64http://www.rsdn.ru/forum/src/3120789.1.aspx), но он тоже не поддерживал x64, по этому самому пришлось добавить поддержку. Поковырявшись в доках, нашел что появился еще REX префикс (коды от 0x40 до 0x4F) который был добавлен в код.

    По коду изменилось только

    Код (Text):
    1. ************************************
    2. #define C_REX       0x00000100 // rex present
    3. ************************************
    4.     switch (disasm_opcode)
    5.     {
    6.         case 0x40: case 0x41: case 0x42: case 0x43:
    7.         case 0x44: case 0x45: case 0x46: case 0x47:
    8.         case 0x48: case 0x49: case 0x4a: case 0x4b:
    9.         case 0x4c: case 0x4d: case 0x4e: case 0x4f:
    10.  
    11.             if (disasm_flag & C_REX)
    12.             {
    13.                 return 0;
    14.             }
    15.  
    16.             disasm_flag |= C_REX;
    17.             goto RETRY;
    18.             break;
    19. *************************************
    В принципе на основных инструкциях работает. Но хотелось бы знать надо что-то еще добавлять или нет?
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Надеюсь, я еще не надоел со своим дизассемблером, но можно попробовать Mediana. Есть поддержка 64битных инструкций. Но это не совсем дизассемблер длин -- это полный дизассемблер. Но никто не запрещает игнорировать мнемонику инструкций.
     
  3. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    По мне - udis86 не плох и с хорошей лицензией (BSD).
     
  4. sender0

    sender0 New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2011
    Сообщения:
    25
  5. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    Другие чуть не подходят. Очень много лишнего и не нужного функционала. И тяжелее расширить функционал.

    В данный момент пытаюсь попутно обнаружить инструкции когда сплайсить нельзя.

    Может кто нибудь еще знает ситуации когда сплайсить нельзя из-за особенностей машинного кода?
    Пока что обнаружены следующие:
    1) call OFFSET_32
    2) JMP OFFSET_32
    3) J** OFFSET_8
    4) Использование 64 битного регистра RIP

    По идее сплайсить можно, только придется для каждого случая делать пересчет смещения
     
  6. 9876

    9876 New Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2011
    Сообщения:
    1
    Hacker Disassembler Engine.
    Еще по теме есть интересная библиотека под названием MinHook: http://www.codeproject.com/KB/winsdk/LibMinHook.aspx.
     
  7. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    2 sender0 спасибо, то что надо было. Как раз такой дизасм искал.