Странный опкод

Тема в разделе "WASM.ASSEMBLER", создана пользователем valeri, 21 фев 2008.

  1. valeri

    valeri New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2005
    Сообщения:
    59
    Адрес:
    Russia
    Разбираю дизассемблерный листинг одной программы и возникла проблема.

    При дизассембрировании некой внутренней функции возникает такой листинг:

    Код (Text):
    1. ...
    2.  
    3. 0040384F   . 894B 04     MOV DWORD PTR DS:[EBX+4],ECX
    4. 00403852   . 8933         MOV DWORD PTR DS:[EBX],ESI
    5. 00403854   . 8943 0C     MOV DWORD PTR DS:[EBX+C],EAX
    6. 00403857   . 8953 10     MOV DWORD PTR DS:[EBX+10],EDX
    7. 040385A      66             DB 66                                    ;  CHAR 'f'
    8. 0040385B     0F1F4400   DD xxx.00441F0F
    9. 0040385F     00             DB 00
    10. 00403860   > 891C24         MOV DWORD PTR SS:[ESP],EBX
    11. 00403863   . B8 02000000    MOV EAX,2
    12. 00403868   . 89D6            MOV ESI,EDX
    13. 0040386A   . 894424 04      MOV DWORD PTR SS:[ESP+4],EAX
    14.  
    15. ....
    Что значат эти нераспознанные инструкции? Скорее всего это вызов функции, т.к. выше через стек передаются параметры, но почему тогда и olly, и IDA, и Hiew едут крышей при дизасме.
     
  2. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    66 - префикс изменения 32/16 бит операнда. 0f - означает что дальше идет расширенный код. Правильно наверно так:
    66 0F1F44 0000 - операция с 16-разрядным операндом вместо 32-разрядного, с опкодом 0F1F и mod|rm 44. Операнд 16-битный - 0000. Что за операция - надо в мануале смотреть. Но кажется - NOP :))))
     
  3. valeri

    valeri New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2005
    Сообщения:
    59
    Адрес:
    Russia
    Всего лишь nop?
    И зачем интересно компилятор так извращался? Чтобы с толку сбить?
    Причем я бы еще понял, если бы она была на асме написана, но она же написана на С!
     
  4. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    да это действительно ноп. все от 0f 19 до 0f 1e нопы без байта mod:reg:rm. 0f 1f это ноп с байтом mod:reg:rm. 0f 18 вообщем то тоже ноп И 4 префетча (группа). Я кстати когдато этими нопами антивири отправлял курить в сторонку =)
     
  5. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    valeri
    ИМХО, это не компилятор, а как раз то, что ты подумал.
     
  6. valeri

    valeri New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2005
    Сообщения:
    59
    Адрес:
    Russia
    Т.е. код вручную правили?

    Кстати, при трассировке команды отладчик действительно никаких изменений в регистрах не показывает (кроме EIP, конечно).
     
  7. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    valeri
    Может быть писали на ассемблере (ИМХО)?
     
  8. valeri

    valeri New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2005
    Сообщения:
    59
    Адрес:
    Russia
    Нет, прога во-первых большая, ну и на C или на ассемблере она написана я смогу отличить по листингу.
    Точно на C.
     
  9. rudik

    rudik Руденко Артём

    Публикаций:
    0
    Регистрация:
    6 дек 2006
    Сообщения:
    302
    Адрес:
    г. Харьков
    вставки есчё никто не отменял
     
  10. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Скорее всего код вставил именно компилятор Си. Просто использовалось что-нибудь типа Align 16, стандартный вход в процедуру скомпилировался как есть, потом компилер решил сделать этот самый ALIGN, и подыскал наиболее оптимальный NOP на 6 байт размером. Следующая после него команда начинается с кратного 16 адреса.
     
  11. valeri

    valeri New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2005
    Сообщения:
    59
    Адрес:
    Russia
    Все, понятно, всем большое спасибо за ответы, очень помогло.
     
  12. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Поиск по "66 0F 1F 44 00" на Гугле дает любопытные результаты.
    А вот что советует Интел :

    Table 4-1. Recommended Multi-Byte Sequence of NOP Instruction
    Length Assembly Byte Sequence
    2 bytes 66 NOP 66 90H
    3 bytes NOP DWORD ptr [EAX] 0F 1F 00H
    4 bytes NOP DWORD ptr [EAX + 00H] 0F 1F 40 00H
    5 bytes NOP DWORD ptr [EAX + EAX*1 + 00H] 0F 1F 44 00 00H
    6 bytes 66 NOP DWORD ptr [EAX + EAX*1 + 00H] 66 0F 1F 44 00 00H
    7 bytes NOP DWORD ptr [EAX + 00000000H] 0F 1F 80 00 00 00 00H
    8 bytes NOP DWORD ptr [EAX + EAX*1 + 00000000H] 0F 1F 84 00 00 00 00 00H
    9 bytes 66 NOP DWORD ptr [EAX + EAX*1 + 00000000H] 66 0F 1F 84 00 00 00 00 00H

    Это гарантия, что какая-то прога для виртуалок не использует это как спец-прерывание...
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    В х64 VC практикует, причем пачками, "666690", как "xchg ax,ax". Ида об этом байтосочетании не знает.
     
  14. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    помнится я както тут выкладывал таблы всех команд и их вариаций...если загнать их в иду то видно что она много чего не знает.
     
  15. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    IDA 5.1 what's new
    Не оно?

    Edit: вот кстати из 5.2
    Код (Text):
    1. CODE:00000000                                            db      66h
    2. CODE:00000000 66 90                                      nop
    3. CODE:00000002 0F 1F 00                                   nop     dword ptr [eax]
    4. CODE:00000005 0F 1F 40 00                                nop     dword ptr [eax+00h]
    5. CODE:00000009 0F 1F 44 00 00                             nop     dword ptr [eax+eax+00h]
    6. CODE:0000000E 66 0F 1F 44 00 00                          nop     word ptr [eax+eax+00h]
    7. CODE:00000014 0F 1F 80 00 00 00 00                       nop     dword ptr [eax+00000000h]
    8. CODE:0000001B 0F 1F 84 00 00 00 00 00                    nop     dword ptr [eax+eax+00000000h]
    9. CODE:00000023 66 0F 1F 84 00 00 00 00 00                 nop     word ptr [eax+eax+00000000h]
     
  16. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    итак ида 5.2.0908

    пажалста =)

    Код (Text):
    1. seg000:003211E1                 prefetcht2 byte ptr [ebp+0]
    2. seg000:003211E8                 prefetcht2 byte ptr [esi+0]
    3. seg000:003211EF                 prefetcht2 byte ptr [edi+0]
    4. seg000:003211EF ; ---------------------------------------------------------------------------
    5. seg000:003211F6                 db  0Fh
    6. seg000:003211F7                 db  18h
    7. seg000:003211F8                 db  20h
    8. seg000:003211F9                 db  0Fh
    9. seg000:003211FA                 db  18h
    10. seg000:003211FB                 db  21h ; !
    11. seg000:003211FC                 db  0Fh
    12. seg000:003211FD                 db  18h
    13. seg000:003211FE                 db  22h ; "
    14. seg000:003211FF                 db  0Fh
    15. seg000:00321200                 db  18h
    16. seg000:00321201                 db  23h ; #
    17. seg000:00321202                 db  0Fh
    18. seg000:00321203                 db  18h
    19. seg000:00321204                 db  24h ; $
    20. seg000:00321205                 db    0
    21. seg000:00321206                 db  0Fh
    22. seg000:00321207                 db  18h
    23. seg000:00321208                 db  24h ; $
    24. seg000:00321209                 db    1
    25. seg000:0032120A                 db  0Fh
    26. seg000:0032120B                 db  18h
    27. seg000:0032120C                 db  24h ; $
     
  17. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    reverser
    Вот видишь, 66 90 не распознаёт. Или это не команда? WinDbg говорит "xchg ax,ax", но мало ли..
     
  18. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Именно так оно и есть.
    Вот что написано перед той таблицей, что я привел :
    The one-byte NOP instruction is an alias mnemonic for the XCHG (E)AX, (E)AX instruction.
    значит 66 90 - xchg ax,ax

    А вот hiew 7.26 понимает только nop 1 и 2 байта - а дальше труба.

    Про спец-прерывание я ступил - в виртуалках используют запрещенные команды.
    Вот в эмуляторах можно сделать любую команду специальной.
     
  19. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    какие такие команды?
     
  20. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Статьи Криса Касперски...
    http://www.dotfix.net/module.php?module=@6e786b3667787162786e77607062
    атака через back door
    Для управления виртуальной машиной многие эмуляторы используют специальный (и, по обыкновению, недокументированный) back door механизм вроде того, что есть в soft-ice (см. INT 03h в Interrupt List’е Ральфа Брауна). Virtual PC использует для той же цели инвалидные инструкции процессора (например, 0Fh 3Fh 07h 0Bh), а VM Ware "магический" порт ввода/вывода

    VM Ware поддерживает большое количество самых различных команд, подробно исследованных Ken’ом Kato и описанных в его статье "VMware’s back" (http://chitchat.at.infoseek.co.jp/vmware/backdoor.html).