Intel manula vs OllyDbg(opcode 0x6C,0x6E)

Тема в разделе "WASM.RESEARCH", создана пользователем Smile, 24 авг 2004.

  1. Smile

    Smile New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2004
    Сообщения:
    129
    В мануале от интела для п4

    (Instruction Set Reference N-Z order number 253667)

    0x6C ins byte [edi],dx (Yb,DX)

    0x6D ins word/dword [edi],dx (Yv,DX)

    0x6E outs dx,byte [esi] (DX,Xb)

    0x6F outs dx,word/dword [esi] (DX,Xv)



    У оли (1.08 и 1.10)

    6C INS BYTE PTR ES:[EDI],DX ; I/O command

    6D INS DWORD PTR ES:[EDI],DX ; I/O command

    6E OUTS DX,BYTE PTR ES:[EDI] ; I/O command

    6F OUTS DX,DWORD PTR ES:[EDI] ; I/O command



    Скорее всего прав интел, значит это баг оли?
     
  2. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    :)

    А вот что у меня Olly кажет:
    Код (Text):
    1. 6C            ins     [byte es:edi], dx                ;  I/O command
    2. 6D            ins     [dword es:edi], dx               ;  I/O command
    3. 6E            outs    dx, [byte es:edi]                ;  I/O command
    4. 6F            outs    dx, [dword es:edi]               ;  I/O command


    Дело в том, что у x86 нет и никогда не было стандартного ситаксиса.
     
  3. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    дело не в синтаксисе, а в неверном операнде у оли. edi вместо правильного esi для команд outs.
     
  4. Smile

    Smile New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2004
    Сообщения:
    129
    infern0

    Вот именно, там должен быть esi



    Отправил письмецо на Ollydbg@t-online.de
     
  5. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    А для проверки опкода пойдет Debug или Soft-Ice.

    И в Hiew если ввести 6E и 6F то тaм всего лиш outsb outsw. Это правильно ? Эти команды похожи на MOVS и SCAS для упрощения можно вводить соотв. MOVSB и MOVSW. Насколько я помню возможна отмена только одного заданного (ES) регистра.
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    В мануале конечно опечатки есть:

    в таблице написано E(SI), далее в тексте "read from either the DS:EDI or the DS:lol: I registers", а еще дальше опять "The location is always specified by the DS:dntknw:E)SI registers". Вот только вопрос, что из всего этого верно. Судя по количеству повторов, видимо, ESI.
     
  7. Smile

    Smile New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2004
    Сообщения:
    129
    Еще один недочет в OllyDasmEngine

    movsx/movsz/bswap неправильно декодируются с перефиксом размера 0x66



    ;у олли

    movsx reg16, mem16

    movzx reg16, mem16

    bswap reg16



    ;правильный вариант

    movsx reg32, mem16

    movzx reg32, mem16

    bswap reg32
     
  8. Smile

    Smile New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2004
    Сообщения:
    129
    zzzyab

    >А для проверки опкода пойдет Debug или Soft-Ice.



    Debug нет, SoftIce я неиспользую поэтому невкурсе,

    fasm очень хорош для этого дела я использую его



    >И в Hiew если ввести 6E и 6F то тaм всего лиш outsb outsw. Это правильно ?



    Да, это короткая форма записи



    >Насколько я помню возможна отмена только одного заданного (ES) регистра.



    Нет, переопределить сегмент можно только для источника, приемник всегда использует сегмент ES
     
  9. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Smile



    О каких опкодах идёт речь в случае с movsx/movzx/bswap?



    Просто проверил
    Код (Text):
    1. 66:0FBF05 50004000     movsx   ax, [word ds:400050]
    2.  
    3.  
    загружает в ax,7369h (из заголовка PE)

    Старшая половина eax не меняется.



    Команда
    Код (Text):
    1. 66:0FC8        bswap   ax
    просто обнуляет ax.

    Согласно мануалу команды bswap reg16 нет.



    Это всё на AMD Athlon.



    Или я (опять, как и в первый раз =) что-то напутал?





    Ещё, на всякий случай, по поводу FASM - он кодирует некоторые инструкции не так как это принято у микрософтовских и интеловских компиляторов:
    Код (Text):
    1. 33DB        xor ebx,ebx     ; микрософт
    2. 31DB        xor ebx,ebx      ; FASM
     
  10. Smile

    Smile New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2004
    Сообщения:
    129
    S_T_A_S_

    Я тоже, естественно, проверял эти инструкции



    >Или я (опять, как и в первый раз =) что-то напутал?

    Э... м... ну, вообщем-то, если инструкция работает (неправильно), то это еще не значит что она правильно декодированна :)



    >Согласно мануалу команды bswap reg16 нет.

    Я о томже.

    Также, согласно ману, нет инструкции movsz/movzx reg16, mem16



    >просто обнуляет ax

    В мане пишут, что с перефиксом размера перед bswap, результат становится неизвестен, на практике младшие 16бит сбрасываются.



    Мне кажется инструкция от этого не становится bswap reg16 а остается bswap reg32 или mov reg32,mem16 но со другим эффектом и именно так она декодируется в моем дизассемблере.



    >Ещё, на всякий случай, по поводу FASM - он кодирует некоторые инструкции не так как это принято у микрософтовских и интеловских компиляторов:

    33DB xor ebx,ebx ; микрософт

    31DB xor ebx,ebx ; FASM



    Млин, ну этоже фасм, а не какойнить там микрософ :)



    Есть такое дело, в регистровых операциях он предпочитает мненять местами поля reg/opc и reg/mem, вместо того чтобы установить бит D.
     
  11. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Дык, то что инструкции нет в мануале - это совершенно не значит, что её нет на самом деле!

    Опкод декодируется и выполняется процем без проблем, исключений не возникает, значит инструкция ЕСТЬ, но не документирована.



    Причём результат инчтрукции можно обосновать логически:<font face="monospace]
    Код (Text):
    1. 0FC8        BSWAP EAX:
    2.  
    3. TEMP ←DEST
    4. DEST[7..0] ←TEMP(31..24]
    5. DEST[15..8] ←TEMP(23..16]
    6. DEST[23..16] ←TEMP(15..8]
    7. DEST[31..24] ←TEMP(7..0]
    8.  
    9.  
    10. 66:0FC8     BSWAP AX:
    11.  
    12. TEMP ←DEST & 0FFFFh       ; AX !
    13. ALU_REG[7..0] ←TEMP(31..24]  ; 0!
    14. ALU_REG[15..8] ←TEMP(23..16] ; 0!
    15. ALU_REG[23..16] ←TEMP(15..8] ; AH
    16. ALU_REG[31..24] ←TEMP(7..0]  ; AL
    17. DEST ←ALU_REG & 0FFFFh
    </font><!--face-->Тут нет "простого" обнуления, всё как и положено работает, но в результате таких операций получается 0.





    И ещё.

    Диззассемблер от самой AMD прекрасно этот bswap ax понимает. Интеловского у меня нет.

    [​IMG] _153363657__bswap.PNG
     
  12. Smile

    Smile New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2004
    Сообщения:
    129
    >Дык, то что инструкции нет в мануале - это совершенно не значит, что её нет на самом деле!

    Аналогично



    >Опкод декодируется и выполняется процем без проблем, исключений не возникает, значит инструкция ЕСТЬ, но не документирована.

    Ну, я бы сказал последствия использования опкода с модификатором размера недокументированны, а опкод и инструкция известны.



    Рылся в сети, у интела по поводу bswap ничего не нашел, у амд тоже.



    ms vc++ 6.0 - дизассемблирует bswap и movsx/zx c параметром reg32

    но ассемблировать может как reg16, Тасм тоже не ругается.



    hiew611 - инструкцию bswap c перефиксом размера не распознает, но movsx/sz видит с параметром reg16



    Так-что перефикс размера допустим и используется, заявление о недочете деодирования movsz/sx bswap в OllyDasmEngine снимается :)

    Может сделаю так и в своем дизассемблере, всетаки эффект инструкции другой и используемые операнды тоже другие



    Всем спасиба,истина установлена... или уже совсем рядом :)